什么是 fail2ban?

简单来说,fail2ban 就是一个自动封禁 IP 的工具

当你运行 SSH、Web 服务或者其他网络服务时,总会有人试图暴力破解或者恶意扫描。fail2ban 会监控日志文件,当发现某个 IP 在短时间内多次失败尝试后,自动调用防火墙把这个 IP 封禁一段时间。

为什么需要它?

我当初上云服务器的第一件事就是装 fail2ban。原因很简单:

  • 减少日志噪音,不用看着满屏的失败登录记录
  • 自动阻止暴力破解
  • 配置好后基本不用管
  • 可以针对不同服务设置不同规则

安装

Ubuntu/Debian

sudo apt update
sudo apt install fail2ban

CentOS/RHEL

sudo yum install epel-release
sudo yum install fail2ban

安装完成后,服务会自动启动:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

基本配置

fail2ban 的配置文件在 /etc/fail2ban/ 目录下:

  • fail2ban.conf - 主配置(一般不用改)
  • jail.conf - 默认规则配置(不要直接修改
  • jail.local - 本地覆盖配置(在这里自定义

创建本地配置

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

最小可用配置

编辑 /etc/fail2ban/jail.local

[DEFAULT]
# 封禁时长(秒)
bantime = 3600
# 时间窗口(秒)
findtime = 600
# 最大尝试次数
maxretry = 5
# 使用的防火墙
backend = auto

# SSH 保护
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200

💡 提示:不同系统的日志路径可能不同

  • Ubuntu/Debian: /var/log/auth.log
  • CentOS/RHEL: /var/log/secure

常用命令

查看状态

# 查看整体状态
sudo fail2ban-client status

# 查看某个 jail 的状态
sudo fail2ban-client status sshd

输出示例:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed: 156
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 3
   |- Total banned: 45
   `- Banned IP list: 1.2.3.4 5.6.7.8 9.10.11.12

手动封禁/解封

# 手动封禁一个 IP
sudo fail2ban-client set sshd banip 1.2.3.4

# 手动解封一个 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4

重新加载配置

sudo fail2ban-client reload

查看日志

# fail2ban 自身日志
sudo tail -f /var/log/fail2ban.log

# 实时查看封禁动态
sudo journalctl -u fail2ban -f

保护其他服务

fail2ban 不只是保护 SSH,还可以保护:

Nginx/Apache

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log

MySQL

[mysqld-auth]
enabled = true
filter = mysqld-auth
port = 3306
logpath = /var/log/mysql/error.log
maxretry = 5

Postfix/Dovecot

[postfix]
enabled = true
port = smtp,ssmtp,submission
filter = postfix
logpath = /var/log/mail.log

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/mail.log

自定义 Filter

如果默认 filter 不满足需求,可以自定义。在 /etc/fail2ban/filter.d/ 下创建:

# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*Failed login from <HOST>.*$
ignoreregex =

然后在 jail.local 中引用:

[myapp]
enabled = true
filter = myapp
logpath = /var/log/myapp.log

实用技巧

1. 白名单自己的 IP

避免把自己锁在外面:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 你的公网 IP

2. 调整封禁策略

对于特别敏感的服务,可以更严格:

[sshd]
maxretry = 2      # 2 次失败就封
bantime = 86400   # 封 24 小时
findtime = 3600   # 1 小时内

3. 邮件通知

配置后可以在封禁时收到邮件(需要安装 mail 或 postfix):

[DEFAULT]
destemail = your@email.com
sender = fail2ban@yourserver.com
mta = sendmail
action = %(action_mwl)s

4. 查看被封 IP 的历史

# 查看 fail2ban 日志中的封禁记录
grep "Ban" /var/log/fail2ban.log

# 统计被封次数最多的 IP
grep "Ban" /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10

常见问题

Q: 封禁不生效?

检查防火墙:

# 查看 iptables 规则
sudo iptables -L -n

# 或者 nftables
sudo nft list ruleset

Q: 如何永久封禁?

设置 bantime = -1 即可永久封禁(慎用)。

Q: 误封了怎么办?

sudo fail2ban-client set <jail-name> unbanip <ip-address>

然后检查 filter 规则是否需要调整。

总结

fail2ban 是服务器必备的安全工具。配置简单,效果显著。

我的建议:

  1. 装完系统第一时间配置
  2. 至少保护 SSH 服务
  3. 把自己的 IP 加入白名单
  4. 定期查看日志了解攻击情况

参考链接: