fail2ban 基础教程
- uvim管理员
Fail2ban 是一款入侵防御软件,通过监控系统日志(如
/var/log/auth.log或journalctl),自动识别多次尝试密码失败的恶意 IP,并通过防火墙(如 iptables、nftables、UFW)将该 IP 封禁。1. 安装 Fail2ban:
根据使用的 Linux 发行版选择对应的命令安装:* Ubuntu / Debian:
sudo apt update && sudo apt install fail2ban -y* CentOS / RHEL / Rocky Linux:
sudo dnf install epel-release -y sudo dnf install fail2ban -y2. 创建本地配置文件 jail.local:
Fail2ban 的默认配置文件是/etc/fail2ban/jail.conf,但系统更新时可能被覆盖。**永远不要直接修改jail.conf**,而是创建一个jail.local副本:sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local3. 配置 SSH 防护规则:
编辑/etc/fail2ban/jail.local文件:sudo nano /etc/fail2ban/jail.local找到或添加以下关键配置项:
[DEFAULT] # 忽略的 IP(白名单),多个用空格隔开(如本机、管理员 IP) ignoreip = 127.0.0.1/8 ::1 192.168.1.100 # 封禁时长(默认单位:秒),1h 表示 1 小时,1d 表示 1 天 bantime = 1h # 统计时间窗口:在这个时间内达到 maxretry 就会被封禁 findtime = 10m # 允许的最大失败次数 maxretry = 5 # SSH 防护设置 [sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s4. 启动并设置开机自启:
启动 Fail2ban 服务并设置为开机自启:sudo systemctl start fail2ban sudo systemctl enable fail2ban常用管理命令
常用操作 命令 查看服务运行状态 sudo fail2ban-client status查看指定规则状态(如 SSH) sudo fail2ban-client status sshd解封指定 IP sudo fail2ban-client set sshd unbanip <IP_ADDRESS>手动封禁 IP sudo fail2ban-client set sshd banip <IP_ADDRESS>重启 Fail2ban sudo systemctl restart fail2ban查看 Fail2ban 日志 sudo tail -f /var/log/fail2ban.log 在掌握 Fail2ban 的基础配置后,进阶应用的核心在于:自定义规则(防护 Web API/暴破)、多级/永久封禁(Recidive)、动态更新白名单以及与复杂防火墙(如 UFW/nftables)配合。
1. 永久/累犯封禁(Recidive Jail)
如果某个攻击者在被封禁 1 小时解封后立刻继续暴破,可以通过启用
recidive规则对这类“屡教不改”的 IP 执行长达数月甚至永久的封禁。编辑
/etc/fail2ban/jail.local:[recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s # 在 1 天内如果被 Fail2ban 封禁过 2 次 findtime = 1d maxretry = 2 # 则直接封禁 1 周(甚至可设为 -1 表示永久封禁) bantime = 1w2. 自定义 Filter(以 Nginx 防刷/防暴破为例)
Fail2ban 自带了常见服务的规则,但对于自定义 Web 应用或特定的恶意 HTTP 行为,需要编写自定义 Filter。
1. 创建自定义 Filter 规则:
在/etc/fail2ban/filter.d/目录下创建nginx-cc.conf:[Definition] # 匹配日志中频繁请求特定 API 或返回 401/403/404 的恶意行为 failregex = ^<HOST> -.*"(GET|POST) /api/v1/auth/login HTTP/.*" (401|403) ignoreregex =2. 验证正则匹配效果: 非常重要.
在启用规则前,使用fail2ban-regex测试正则表达式是否能正确解析日志:sudo fail2ban-regex /var/var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.conf验证:看输出结果中的
Failures统计数字是否大于 0。3. 在 jail.local 中启用自定义 Jail:
编辑/etc/fail2ban/jail.local引入该规则:[nginx-cc] enabled = true port = http,https filter = nginx-cc logpath = /var/log/nginx/access.log maxretry = 20 findtime = 1m bantime = 1d3. 配置防火墙 Action(UFW / Nftables / Cloudflare)
Fail2ban 默认通过修改底层的
iptables实现封禁,但在特定环境中可配置更高级的 Action。配合 UFW 使用
若服务器启用了 UFW,建议将默认
banaction改为ufw,避免iptables规则冲突:[DEFAULT] banaction = ufw配合 Cloudflare 封禁(适用于 Web 服务)
如果 Web 服务开启了 Cloudflare CDN,攻击者的真实 IP 在 HTTP Header 中(
X-Forwarded-For),且传统的本地 iptables 无法拦截边缘节点的请求。可以通过 Cloudflare API 自动将 IP 加入 Cloudflare 网页防火墙:1. 编辑
/etc/fail2ban/jail.local:[nginx-cc] enabled = true action = cloudflare[cfuser="[email protected]", cftoken="your_cloudflare_api_token"]2. 当触发规则时,Fail2ban 会直接在 Cloudflare 边缘节点封禁该 IP。
4. 动态白名单与 Cloudflare/DDNS
如果你的管理员 IP 是动态分配的(如家用的宽带),为了防止自己被意外误封:
[DEFAULT] # 忽略本地 IP,并可通过域名指定白名单(Fail2ban 会自动解析 DNS) ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 my-admin-home.ddns.net5. 进阶调试与排查
需求 命令 测试单个 Filter 正则 fail2ban-regex <日志路径> <Filter配置文件或正则>查看特定 Jail 封禁的 IP 列表 sudo fail2ban-client status sshd实时监控 Fail2ban 封禁动作 sudo tail -f /var/log/fail2ban.log | grep "Ban"清空指定 Jail 中的所有封禁记录 sudo fail2ban-client unban --all