Ubuntu 22.04 安装配置 Fail2Ban 防止暴力破解实战
引言
用了这么多年服务器,说真的,最让我头疼的不是配置 nginx,不是调试 docker,而是那些没完没了的暴力破解尝试。每天登录服务器,第一件事就是翻 auth.log,看着满屏的 SSH 登录失败记录,心情就很烦躁。这些脚本小子们用字典攻击没日没夜地扫,IP 换了一个又一个,完全不知道累。
后来我学聪明了,装了个 Fail2Ban。这个工具会自动封禁那些短时间内多次登录失败的 IP,省心多了。今天就来聊聊怎么在 Ubuntu 22.04 上配置这玩意儿,文末会顺带提一下我现在用的雨云服务器,纯属个人选择,不强求。
准备工作
在说具体配置之前,先聊聊服务器选择。如果你现在还在用那些特别便宜的共享 IP 主机,被攻击的概率会高很多。建议选独立 IP 的云服务器,至少网络质量有保障。
我现在用的是雨云的服务器,他们家的 VPS 默认就带独立 IP,而且机房选择挺多的。
雨云服务器官网: www.rainyun.com
可以看看有什么套餐,感兴趣的自己点,我这边就不多说了。
言归正传,开始安装 Fail2Ban:
# 更新软件源
sudo apt update
# 安装 Fail2Ban
sudo apt install fail2ban -y
装完之后,服务应该自动启动了。确认一下:
sudo systemctl status fail2ban
看到 active (running) 就说明一切正常。
主体步骤
1. 了解 Fail2Ban 的工作原理
Fail2Ban 本质上是一个监控日志文件的脚本。它会实时读取系统日志(比如 SSH 的 auth.log),当发现某个 IP 在短时间内登录失败次数超过阈值,就调用 iptables 把这个 IP 封禁一段时间。
默认封禁时间是 10 分钟,阈值是 5 次失败。这个数字可以根据自己的需求调整。
2. 配置 Fail2Ban
Fail2Ban 的配置文件在 /etc/fail2ban/ 目录下。主要有两个文件:
jail.conf— 默认配置,不建议直接修改jail.local— 自定义配置,会覆盖默认配置
我们新建一个 jail.local 文件:
sudo nano /etc/fail2ban/jail.local
写入以下内容:
[DEFAULT]
# 忽略的 IP 白名单,用空格分隔
ignoreip = 127.0.0.1/8 ::1
# 封禁时长,单位秒(这里设了 1 小时)
bantime = 3600
# 时间窗口,单位秒(5 分钟内超过 maxretry 次就封禁)
findtime = 300
# 最大重试次数
maxretry = 5
# 日志级别
loglevel = INFO
[sshd]
# 开启 SSH 防护
enabled = true
# 端口号
port = ssh
# 过滤规则,使用 /etc/fail2ban/filter.d/sshd.conf
filter = sshd
# 封禁时长
bantime = 3600
# 时间窗口
findtime = 600
# 最大重试次数
maxretry = 3
这里我把 SSH 的 maxretry 调成了 3 次,findtime 调成了 10 分钟。毕竟 SSH 是服务器的命根子,宁可误封也不能被黑。
3. 重启服务使配置生效
sudo systemctl restart fail2ban
4. 常用管理命令
配置完了,得知道怎么用才行。Fail2Ban 自带一个 fail2ban-client 命令,很好用:
# 查看当前所有 jail 的状态
sudo fail2ban-client status
# 查看 SSH 防护的具体情况
sudo fail2ban-client status sshd
# 手动封禁某个 IP
sudo fail2ban-client set sshd banip 192.168.1.100
# 手动解封某个 IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
status sshd 的输出大概是这样的:
Status for the sshd jail:
|- Filter
| |- Currently failed: 0
| |- Total failed: 15
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 2
|- Total banned: 8
`- Banned IP list: 45.33.32.156 104.131.0.69
可以看到当前被封的有几个 IP,都是些什么鬼的扫描器。
5. 设置邮件通知(可选)
如果你想在被封禁时收到邮件通知,可以配置邮件参数。先装个邮件工具:
sudo apt install sendmail -y
然后在 jail.local 里加上:
[DEFAULT]
# 收件邮箱
destemail = your-email@example.com
# 发件人
sender = fail2ban@your-server.com
# 邮件动作(收到通知时发送)
action = %(action_mw)s
action 有几个选项:
action_: 只封禁,不通知action_mw: 封禁并发送邮件action_mwl: 封禁并发送邮件,附带日志内容
建议用 action_mw,简洁够用。
6. 配置 Nginx 防护(可选)
除了 SSH,Fail2Ban 还能防护 nginx 的恶意请求。比如有人在疯狂扫描你的后台路径,或者在搞 SQL 注入:
先在 filter.d 目录下创建 nginx 的过滤规则:
sudo nano /etc/fail2ban/filter.d/nginx-noscript.conf
写入:
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*(\.php|\.asp|\.exe|\.pl).*HTTP.*" -$
ignoreregex =
然后在 jail.local 里加上:
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 10
常见问题
Q1: 把自己 IP 封禁了怎么办?
别慌,先想办法用其他网络访问服务器(比如手机开热点),然后 SSH 进去手动解封:
sudo fail2ban-client set sshd unbanip 你的IP
或者直接重装系统...开玩笑的,记得把常用 IP 加到白名单里:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 你的常用IP/32
Q2: Fail2Ban 启动失败怎么办?
先看日志:
sudo tail -f /var/log/fail2ban.log
常见问题是配置文件格式错误。检查一下 jail.local 是否有语法错误,中括号要成对,引号要匹配。
Q3: 封禁的 IP 太多了,影响正常访问怎么办?
适当放宽阈值:
- 把
maxretry调大一点,比如 10 - 把
bantime调小一点,比如 10 分钟
但我建议保持 SSH 的严格策略,其他服务可以放宽。
Q4: iptables 被占满了怎么办?
Fail2Ban 默认用 iptables 存储封禁列表。如果封禁 IP 太多,可能导致 iptables 性能下降。可以改用 fail2ban-client 配合 ipset:
[DEFAULT]
banaction = iptables-ipset-proto4
ipset 比纯 iptables 效率高很多。
总结
配置 Fail2Ban 这事说简单也简单,说复杂也复杂。简单在于安装配置一条命令就能搞定,复杂在于要根据自己业务特点调整策略。
我的建议是:SSH 一定要严格,宁可误封不可漏放;其他服务根据流量情况调整阈值。另外,定期翻翻 fail2ban.log,看看都有谁在搞你,也挺有意思的。
最后提醒一句,Fail2Ban 只是服务器安全的一小环,别指望它能防住所有攻击。强密码(或 SSH Key)、定期更新系统、不乱装来路不明的软件,这些基本功一样都不能少。安全这事儿,没有银弹,只有层层设防。