Debian安装fail2ban保姆级教程,自动拉黑恶意IP
Debian安装fail2ban保姆级教程,自动拉黑恶意IP
服务器被暴力破解过吗?也许你只是没注意到
上个月帮一个朋友看服务器,顺手查了一下 SSH 日志,好家伙——三天时间,他的服务器被尝试登录了 14000 多次。root、admin、oracle、mysql……各种常见用户名轮着来,密码从 123456 到 qwerty 到 password 全套走了一遍。
他说他密码设得很复杂啊,应该没事吧?
问题是:暴力破解本质上是撞库攻击,只要你的密码在某个泄露库出现过,或者稍微简单一点,迟早会被攻破。更何况,万一你用的某个服务有漏洞呢?
光靠密码不够。你需要的是:让那些频繁尝试的 IP 自动闭嘴。
这就是 fail2ban 干的事。它监控日志,发现异常登录行为,直接把来源 IP 封掉。不用你手动操作,自动化搞定。
一、fail2ban是什么?工作原理详解
在说安装之前,先搞明白 fail2ban 为什么管用。
你可以把它理解成一个自动保安。传统防火墙(ufw/iptables)是按规则办事,只认端口和 IP,不会主动判断某个 IP 是不是坏人。但 fail2ban 是按行为判断——它盯着日志看,发现某个 IP 在短时间内疯狂尝试登录,直接调用防火墙把这个 IP 拉黑。
整个流程是这样的:
- 监控日志
:fail2ban 持续读取 SSH、FTP、Web 等服务的认证日志 - 设置规则
:定义"多少次失败算异常"(比如 5 分钟内失败 5 次) - 触发封禁
:达到阈值后,自动在 iptables/ufw 里添加规则,屏蔽该 IP - 自动解封
:封禁一段时间后自动放出来(可配置时长)
这个机制的好处是:防御自动化,零人工干预。你睡觉的时候它也在工作。
常见的应用场景包括:
- SSH 暴力破解防护
:这是 fail2ban 最经典的使用场景 - Web 登录保护
:保护 WordPress、Django 等后台登录页面 - FTP 攻击防护
:防止 vsftpd、proftpd 被暴力破解 - 邮件服务保护
:Postfix、Dovecot 的认证防护
二、fail2ban安装:5分钟搞定基础部署
Debian 安装 fail2ban 非常简单,基本上一条命令搞定。
2.1 安装前检查
# 检查系统版本(fail2ban支持Debian 10及以上)
cat /etc/debian_version
# 检查是否已安装
which fail2ban
fail2ban --version
2.2 安装fail2ban
# 更新软件源
sudo apt update
# 安装fail2ban
sudo apt install fail2ban -y
安装完成后,服务会自动启动。检查一下状态:
# 查看服务状态
sudo systemctl status fail2ban
正常情况下会看到:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled)
Active: active (running) since Sun 2026-05-03 04:30:00 CST; 5s ago
如果看到 active (running),说明安装成功了。
2.3 启用开机自启
sudo systemctl enable fail2ban
三、基础配置:SSH防护规则设置
fail2ban 的配置分为两个层级:
- 默认配置
/etc/fail2ban/jail.conf:软件包更新时可能被覆盖 - 自定义配置
/etc/fail2ban/jail.local:用户配置优先,不会被覆盖
最佳实践 : 在 jail.local 里覆盖需要自定义的参数,保留 jail.conf 作为参考。
3.1 创建自定义配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
3.2 配置SSH防护规则
找到 [sshd] 部分,修改为以下配置:
[sshd]
enabled = true
port = ssh
filter = sshd-auth
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1
参数说明:
- enabled
:是否启用这个规则,true 表示启用 - port
:SSH 端口,默认是 ssh(22),如果你改了端口写新的数字 - filter
:使用哪个过滤规则,sshd-auth 是自带的 - logpath
:日志文件路径,Debian 的 SSH 认证日志在 /var/log/auth.log - maxretry
:最大失败次数,达到这个次数就封禁 - findtime
:时间窗口,上面是 10 分钟 - bantime
:封禁时长,上面是 1 小时 - ignoreip
:白名单 IP,这些 IP 永远不会被封(比如你的固定出口 IP)
关键参数建议:
- SSH 的
maxretry不要设太低,否则你自己也可能被封。建议 5 次 findtime设 10-30 分钟比较合理bantime建议至少 1 小时,多次违规可以更长
3.3 重启服务使配置生效
sudo systemctl restart fail2ban
3.4 验证配置是否生效
# 查看当前启用的规则
sudo fail2ban-client status
# 查看SSH规则的详细状态
sudo fail2ban-client status sshd
正常输出:
Status for the jail: sshd
|- filter
| |-Currently failed: 0
| |-Total failed: 12
| `-File list: /var/log/auth.log
`- action
|-Currently banned: 2
|-Total banned: 5
`-Banned IP list: 203.0.113.45 198.51.100.67
这里可以看到:
- 当前有多少个 IP 被封(Currently banned)
- 总共封过多少(Total banned)
- 被封的 IP 列表
四、自定义规则进阶配置
除了 SSH,fail2ban 还能保护很多服务。以下是几个常用场景。
4.1 保护Web管理后台
如果你用 Nginx 跑了 WordPress 或其他后台,可以用 fail2ban 保护登录页面:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
findtime = 10m
bantime = 1h
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/auth.log
maxretry = 5
findtime = 5m
bantime = 2h
WordPress 规则需要自定义 filter,稍后会说。
4.2 保护vsftpd(FTP服务)
[vsftpd]
enabled = true
port = ftp,ftp-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
findtime = 10m
bantime = 1h
4.3 保护Postfix(邮件服务)
[postfix]
enabled = true
port = smtp,submission
filter = postfix
logpath = /var/log/mail.log
maxretry = 3
findtime = 10m
bantime = 1h
4.4 渐进式封禁策略
如果你想对屡教不改的 IP 加重处罚,可以用渐进式封禁:
[sshd]
enabled = true
port = ssh
filter = sshd-auth
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 1h
maxmatches = 3
# 多次违规后永久封禁(需要配合 action.d 配置)
五、邮件告警配置:被攻击时及时知道
fail2ban 支持在封禁 IP 时发送邮件通知,这样你能及时知道服务器正在被攻击。
5.1 安装邮件工具
sudo apt install sendmail-bin mailutils -y
5.2 配置邮件发送
在 jail.local 里修改 action 配置:
[DEFAULT]
# 收件邮箱,改成你的
destemail = your-email@example.com
# 发件人名称
sender = fail2ban@your-server-name
# 告警动作:封禁+发送邮件
action = %(action_mwl)s
action_mwl 的含义:
- action_m
:封禁 IP(ban) - action_w
:发送邮件警告(warning) - action_l
:写入日志(log)
如果你只想要邮件通知,不需要写日志:
action = %(action_mw)s
5.3 测试邮件配置
# 手动测试发送邮件
echo "Test email from fail2ban"| mail -s "Fail2ban Test" your-email@example.com
六、自定义Filter:保护任意服务
fail2ban 自带了很多服务的 filter,但有时候你需要保护一些非标准服务,或者想更精确地匹配日志。
6.1 创建自定义Filter
假设你要保护一个自定义的 API 服务,日志格式是:
[2026-05-03 10:30:00] Failed login from 203.0.113.45 for user admin
创建一个 filter 文件:
sudo vim /etc/fail2ban/filter.d/myapi.conf
写入内容:
[Definition]
# 日志格式,fail2ban会自动匹配
failregex = ^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] Failed login from <HOST> for user .*$
# 忽略的正则(可选)
ignoreregex =
6.2 测试Filter是否工作
# 用 fail2ban-regex 测试
sudo fail2ban-regex /var/log/myapi.log /etc/fail2ban/filter.d/myapi.conf
如果看到 Success, the regex is matched 这样的输出,说明 filter 正常工作。
6.3 在Jail里启用自定义Filter
[myapi]
enabled = true
port = 8080
filter = myapi
logpath = /var/log/myapi.log
maxretry = 3
findtime = 5m
bantime = 30m
七、常见问题与避坑指南
- Q1:fail2ban启动失败,日志报错
Permission denied
这是最常见的问题,通常是日志文件权限不对。
# 检查日志文件权限
ls -la /var/log/auth.log
# 如果权限不对,修复
sudo chown root:adm /var/log/auth.log
sudo chmod 640 /var/log/auth.log
- Q2:自己被封了怎么办?
先别慌,wait for unban(等待自动解封)。或者从白名单 IP 登录:
# 查看当前被封的IP
sudo fail2ban-client status sshd
# 手动解封某个IP
sudo fail2ban-client set sshd unbanip 203.0.113.45
# 添加自己到白名单
# 在 jail.local 的 ignoreip 行添加你的IP
sudo vim /etc/fail2ban/jail.local
# 找到 ignoreip 行,添加你的IP
ignoreip =127.0.0.1/8 ::1 203.0.113.45
sudo systemctl restart fail2ban
- Q3:fail2ban 没有生效,IP 没被封
排查步骤:
# 1. 检查服务是否运行
sudo systemctl status fail2ban
# 2. 检查规则是否启用
sudo fail2ban-client status
# 3. 检查filter是否正常工作
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# 4. 检查fail2ban日志
sudotail-f /var/log/fail2ban.log
- Q4:封禁时间太短,攻击者换一个IP又来了
可以调整bantime,或者用iptables的长时间封禁:
[sshd]
enabled = true
port = ssh
filter = sshd-auth
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 24h # 改成1天
多次违规的用户可以单独处理,在 jail.local 末尾添加:
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
banaction = iptables-allports
maxretry = 5
findtime = 1d
bantime = 1w
这个规则会封禁那些被封禁后又来攻击的"惯犯"长达一周。
- Q5:服务器重启后
fail2ban没启动
# 检查是否开机自启
sudo systemctl is-enabled fail2ban
# 如果没启用,手动开启
sudo systemctl enable fail2ban
Q6:fail2ban 和 ufw 一起用会有冲突吗?
不会。fail2ban 是调用 iptables 规则,ufw 底层也是 iptables,两者可以共存。fail2ban 添加的规则会插入到 ufw 规则的后面,不影响 ufw 的默认策略。
总结
fail2ban 是 Linux 服务器安全的必备工具,它的价值在于自动化——你不用盯着日志看,它帮你盯;你不用手动封 IP,它帮你封。
核心配置就三步:
- 安装:apt install fail2ban
- 覆盖配置:在 jail.local 里设置 SSH 规则
- 重启生效:systemctl restart fail2ban
建议配合 ufw 一起用:ufw 负责基础的端口管理,fail2ban 负责行为分析,两层防护更稳妥。

浙公网安备 33010602011771号