什么是 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 是服务器必备的安全工具。配置简单,效果显著。
我的建议:
- 装完系统第一时间配置
- 至少保护 SSH 服务
- 把自己的 IP 加入白名单
- 定期查看日志了解攻击情况
参考链接: