Ubuntu 22.04 安装配置 Fail2Ban 防止ssh暴力破解实战

3 阅读5分钟

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)、定期更新系统、不乱装来路不明的软件,这些基本功一样都不能少。安全这事儿,没有银弹,只有层层设防。