
我维护的香港服务器每天都承受着不同来源的SSH暴力破解尝试。尽管服务部署在海外线路优化节点上,但依旧无法避免被全球扫描工具盯上。每天早上查阅 /var/log/auth.log,都能看到上千次尝试登录root账户或爆破已知用户名的记录。
最初,我使用了简单的端口变更和禁用密码登录来缓解风险,但这些方法治标不治本。最终,我决定部署 Fail2Ban 并结合日志分析引擎,如 GoAccess 和自定义的 grep + awk 流程,建立一套自动识别和封禁机制。以下是我在香港服务器上构建的完整解决方案,适用于具备SSH服务的Linux系统,特别是Ubuntu 20.04+/Debian 11+环境。
一、服务器环境准备
1.1 基础环境
- 服务器:香港云主机,Ubuntu 22.04
- 公网IP已开放22端口(默认SSH)
- 已启用防火墙(ufw)
- 具备sudo权限的用户
1.2 更新系统
sudo apt update && sudo apt upgrade -y
二、安装Fail2Ban并配置SSH防护
2.1 安装Fail2Ban
sudo apt install fail2ban -y
2.2 创建本地配置文件
不要直接编辑 /etc/fail2ban/jail.conf,我们应该创建 jail.local 来保持可维护性:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2.3 配置SSH防护策略
编辑 jail.local:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
filter = sshd
maxretry = 5
bantime = 3600
findtime = 600
解释:
- maxretry=5:5次失败尝试
- findtime=600:在10分钟内触发
- bantime=3600:封禁1小时
三、提升日志可读性:结合日志分析工具
虽然Fail2Ban本身已足够使用,但为了日后审计和统计攻击来源,我整合了如下分析流程。
3.1 使用GoAccess可视化SSH日志(可选)
虽然GoAccess主用于Web日志分析,但我们可以针对 /var/log/auth.log 做适配:
grep "Failed password" /var/log/auth.log > /var/log/ssh_fail.log
goaccess /var/log/ssh_fail.log --log-format=COMBINED -a -o /var/www/html/report.html
注意:需要自定义GoAccess的日志格式匹配字段,若偏好命令行可视化,建议跳过GoAccess而使用awk等工具。
3.2 自定义实时分析脚本(进阶)
为了实时监控并记录哪些IP频繁尝试登录,我创建了如下脚本:
#!/bin/bash
LOGFILE="/var/log/auth.log"
THRESHOLD=10
echo "分析中..."
awk '/Failed password/ {print $(NF-3)}' $LOGFILE | sort | uniq -c | sort -nr | while read count ip; do
if [ "$count" -gt "$THRESHOLD" ]; then
echo "封禁 $ip,尝试次数 $count"
sudo ufw deny from $ip to any port 22
fi
done
这个脚本可加入 cron 每15分钟执行一次,也可用于每日攻击统计报告。
四、Fail2Ban进阶:封禁通知与持久性
4.1 配置邮件通知(可选)
编辑 /etc/fail2ban/jail.local 中添加:
destemail = your@email.com
sender = fail2ban@yourdomain.com
action = %(action_mwl)s
确保服务器具备 mail 命令支持:
sudo apt install mailutils -y
4.2 Fail2Ban持久性封禁(IPSet结合使用)
Fail2Ban默认只临时封禁,可结合IPSet实现持久封锁:
banaction = iptables-ipset-proto4
并在 /etc/fail2ban/action.d/iptables-ipset-proto4.conf 中设置 ipset 策略,适合应对长期持续扫描。
五、验证与测试
5.1 模拟SSH暴力破解
使用另一个VPS或本地设备运行:
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://your.hk.server.ip
观察 /var/log/fail2ban.log:
tail -f /var/log/fail2ban.log
确认是否触发封禁。
5.2 查看封禁IP
sudo fail2ban-client status sshd
六、实战中的反击手段
在生产环境中,没有单一防护能解决所有问题。Fail2Ban并不是万能,但它是最接近“哨兵”的组件。通过将其与日志分析系统结合,我不仅提升了封禁的准确性,也能在攻击发生前知晓趋势。
而对于部署在香港节点的服务器,这种“主动式防御机制”显得尤为重要。随着业务扩展到全球各地,中转节点和边缘节点的暴露程度不断上升,部署类似机制应成为安全基线的一部分。
如果未来接入WAF或Zero Trust系统,我会进一步将Fail2Ban数据源接入SIEM平台,实现全链路威胁检测与响应。











