前言:公网服务器的“险恶”环境

任何一台只要拥有公网 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 脚本,我们在零性能损耗、零额外软件开销的情况下,实现了高强度防线与全自动监控运维。