给小服务器加一层 fail2ban:自动封禁暴力破解 SSH 的 IP
一台暴露在公网上的小服务器,最常见的“访客”往往不是人,而是全网扫描的 SSH 爆破程序。它们拿着常见用户名和弱口令字典,一天 24 小时不停地敲门。单靠把密码设复杂一点是不够的:只要 SSH 端口还开着,这种尝试就不会停。今天给自己的小服务器加一层 fail2ban,让它自动识别爆破行为并把对应的 IP 封掉,把重复劳动交给机器。
一、先看日志:爆破长什么样
动手之前,先确认自己的服务器是不是真的在被扫。Debian/Ubuntu 的认证日志在 /var/log/auth.log,RHEL/CentOS 系一般在 /var/log/secure,里面会有大量这样的记录:
Failed password for root from 203.0.113.10 port 51234 ssh2
Failed password for invalid user admin from 203.0.113.10 port 51235 ssh2
用一条命令就能看清形势:
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
如果同一个 IP 在几分钟内出现几十上百次,基本可以断定是爆破;如果还夹杂着 invalid user、root、admin、test 这类用户名轮换,那就更典型了。先看日志再动手,还有一个好处:封禁之后可以拿同一条命令做前后对比,效果一目了然。
二、安装 fail2ban
Debian/Ubuntu:
sudo apt update && sudo apt install -y fail2ban
RHEL/CentOS 需要先装 EPEL:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
fail2ban 本身不监听端口,它的工作方式很朴素:定时读日志,按规则数失败次数,够数了就调用防火墙把 IP 封一段时间,时间到了自动解封。
三、写一份 jail.local:三个参数是关键
不要直接改 /etc/fail2ban/jail.conf,升级会被覆盖。正确做法是新建 /etc/fail2ban/jail.local,只写自己要改的部分:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
这三个参数要一起理解:findtime 是观察窗口,这里是 600 秒;maxretry 是窗口内允许的失败次数,这里是 5 次;bantime 是封禁时长,这里是 3600 秒,也就是一小时。换句话说,同一个 IP 在 10 分钟内输错 5 次密码,就会被封一小时。刚开始建议把 bantime 设短一点,比如 600 秒,观察几天、确认没有误封自己之后再加长;findtime 和 maxretry 也别设得太苛刻,否则自己手抖输错几次就把自己锁在门外了。
四、启用并验证它真的在工作
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
sudo fail2ban-client status sshd
最后一条命令的输出里,Currently banned 一栏就是当前被封的 IP 数量,Total banned 是累计封禁次数。如果输出里能看到 sshd 这个 jail 处于启用状态,说明配置已经生效。想验证得更实在一点,可以从另一台机器故意输错几次密码,再回来查状态,看到自己的测试 IP 进了 banned 列表,就说明整条链路是通的,之后记得用解封命令把它放出来。
五、误封了怎么办:解封命令
sudo fail2ban-client set sshd unbanip 203.0.113.10
sudo fail2ban-client status sshd
第一条是手动解封,第二条是复查。如果是自己被封了,优先用云厂商的控制台登录(VNC 或串口),不要在原地反复试密码,那只会让封禁时间不断刷新。也可以把自己常用的办公 IP 写进 jail.local 的 ignoreip 里,例如 ignoreip = 127.0.0.1/8 203.0.113.20,但这条要慎用:只写固定可信的 IP,不要把一段大网段都加进去。
六、别只靠封禁:和密钥登录配合
fail2ban 是“减噪器”,不是“保险箱”。它能挡住低成本的字典爆破,但挡不住针对性攻击。真正该做的是把密码登录逐步关掉,改用密钥登录:先把自己的公钥放进 ~/.ssh/authorized_keys,确认能用密钥登录之后,再把 /etc/ssh/sshd_config 里的 PasswordAuthentication 改成 no,PermitRootLogin 改成 prohibit-password,然后重启 sshd。改默认 22 端口、限制只允许特定用户登录,都可以作为补充手段,但都不能替代密钥登录。
做完这几步,小服务器的 SSH 日志会一下子清净很多。剩下的少量尝试,fail2ban 会继续帮你挡在门外;你只需要偶尔看一眼 fail2ban-client status,确认它还在正常工作。这就是给小服务器加一层防护的意义:花二十分钟配置,换来以后少操很多心。
- 点赞
- 收藏
- 关注作者
评论(0)