前言:公网服务器的“险恶”环境
任何一台只要拥有公网 IPv4 地址的云服务器,在开机后的数分钟内就会遭遇全网扫描。查看 /var/log/auth.log 或 btmp 日志,常常能看到每天成千上万次来自全球各地的 SSH 暴力破解尝试。
为了在极低系统资源开销的前提下,让服务器既坚固如磐石,又能随时随地掌握其健康状态与安全指标,本文记录一套完整的安全加固与无感知推送运维方案。
一、 系统基础安全加固
1. 内核级静默禁 Ping(隐藏公网存在)
大部分扫描器会先通过 ICMP Echo 请求探活。在 Linux 内核层直接忽略 Ping 请求,能有效避开大批量粗筛脚本:
创建或修改 /etc/sysctl.d/99-disable-ping.conf:
net.ipv4.icmp_echo_ignore_all = 1
执行命令使其立即生效,无需重启:
sudo sysctl --system
效果:公网针对该服务器 IP 的
ping请求将直接超时,呈现“死机/未分配”的静默状态。
2. 彻底禁用 SSH 密码登录(强制纯密钥认证)
暴力破解 100% 针对的是弱口令与密码字典。禁用密码认证即可直接免疫绝大多数自动化密码爆破。
在现代 Ubuntu/Debian 系统中,推荐使用模块化配置覆盖默认值:
创建 /etc/ssh/sshd_config.d/01-disable-password.conf:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AuthenticationMethods publickey
测试配置文件语法并重启 SSH 服务:
sudo sshd -t
sudo systemctl restart ssh
⚠️ 注意:在重启 SSH 服务前,请务必保持当前登录窗口不关闭,并另开一个新终端测试密钥登录是否正常,避免配置错误导致失联。
二、 自动化每日巡检与 Bark 手机推送
加固完成后,如何知道服务器今天是否依然安然无恙?有没有遭遇持续性网络攻击? 部署重量级监控体系(如 Prometheus + Grafana)对 1核1G/2G 的轻量 VPS 而言过于臃肿。我们可以用 极简 Shell 脚本 + crontab + Bark API 实现零性能损耗的日常巡检。
1. 为什么选择 Bark?
- 极简优雅:iOS 平台的轻量开源推送客户端,只需一条简单的 HTTP POST/GET 即可将通知弹窗送达手机。
- 零额外常驻:无需在服务器安装长连接 Agent,仅靠一条
curl发送即走。
2. 编写巡检脚本 /usr/local/bin/server_daily_check.sh
#!/bin/bash
# ==========================================
# 服务器每日安全与健康巡检脚本
# ==========================================
BARK_KEY="YOUR_BARK_KEY"
BARK_API="https://api.day.app/${BARK_KEY}"
NOW=$(date "+%Y-%m-%d %H:%M:%S")
# 1. 统计过去 24 小时的暴力破解拦截次数与成功登录次数
SINCE_TIME=$(date -d "24 hours ago" "+%Y-%m-%dT%H:%M" 2>/dev/null || date "+%Y-%m-%dT%H:%M")
FAILED_ATTACKS=$(zgrep -h -E "Failed password|Invalid user" /var/log/auth.log* 2>/dev/null | awk -v since="$SINCE_TIME" '$1 >= since' | wc -l)
SUCCESS_LOGINS=$(zgrep -h "Accepted " /var/log/auth.log* 2>/dev/null | awk -v since="$SINCE_TIME" '$1 >= since' | wc -l)
# 2. 系统核心指标采集
MEM_INFO=$(free -m | awk 'NR==2{printf "%dMB / %dMB (%.1f%%)", $3, $2, $3*100/$2}')
DISK_INFO=$(df -h / | awk 'NR==2{printf "%s / %s (%s)", $3, $2, $5}')
CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^ //')
UPTIME_DAYS=$(uptime -p | sed 's/up //')
# 3. 核心服务状态检查(示例:EasyTier / Docker)
ET_STATUS="异常"
docker ps --format '{{.Names}}' | grep -q "^easytier-node$" && ET_STATUS="正常运行"
TITLE="服务器每日巡检简报"
BODY="📅 时间: ${NOW}
⏱️ 运行时间: ${UPTIME_DAYS}
🛡️ 安全防御状态:
• 过去24h拦截爆破: ${FAILED_ATTACKS} 次
• 成功登录记录: ${SUCCESS_LOGINS} 次
• SSH认证机制: 仅密钥 (密码已禁用)
• ICMP响应: 已静默忽略
📊 系统资源负载:
• 内存使用: ${MEM_INFO}
• 磁盘空间: ${DISK_INFO}
• CPU负载: ${CPU_LOAD}
🌐 核心服务检测:
• 组网节点: ${ET_STATUS}"
# 发送结构化 JSON 推送给 Bark
curl -s -X POST "${BARK_API}" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -n \
--arg title "$TITLE" \
--arg body "$BODY" \
--arg group "ServerMonitor" \
--arg icon "https://img.icons8.com/color/48/server.png" \
'{title: $title, body: $body, group: $group, icon: $icon}')" >/dev/null 2>&1
赋予脚本可执行权限:
sudo chmod +x /usr/local/bin/server_daily_check.sh
3. 配置 Crontab 定时调度
每天早晨 09:00 准时接收巡检简报,在 crontab 中加入:
crontab -e
添加如下定时任务配置:
0 9 * * * /usr/local/bin/server_daily_check.sh >/dev/null 2>&1
每天醒来,手机就会准时弹出卡片通知,清晰了解前一天的安全拦截统计与磁盘内存状况。
三、 定期清理与空间维护
云服务器使用一段时间后,日志和包管理容易堆积占用数个 G 的磁盘:
# 1. 限制 systemd journal 日志保留时间为最近 7 天
sudo journalctl --vacuum-time=7d
# 2. 清理历史失败登录二进制大文件(/var/log/btmp)
sudo truncate -s 0 /var/log/btmp
# 3. 清理已卸载软件包残留的配置文件与无用依赖
sudo dpkg -l | grep '^rc' | awk '{print $2}' | xargs -r sudo dpkg --purge
sudo apt-get autoremove -y && sudo apt-get clean
总结
通过简单的内核参数优化、严格的 SSH 认证规则,加上不到 50 行的轻量 Shell 脚本,我们在零性能损耗、零额外软件开销的情况下,实现了高强度防线与全自动监控运维。