
我的香港服务器突然被 Nginx 日志刷屏——全是 POST 探测、SSH 暴力尝试,还有无穷无尽的 WordPress xmlrpc 爆破。当时手工封 IP 已完全跟不上攻击频率,我意识到:必须实现一个自动化的封锁机制,结合 iptables 的底层能力与 Fail2Ban 的行为分析逻辑,实现动态拦截攻击源。
本文将详细讲解我在实战中如何通过 iptables + Fail2Ban 构建一个高效、可复用的 IP 封锁系统,从规则脚本编写、日志策略配置到典型场景调试,确保你的服务器具备自我防御能力。
一、系统环境与前提说明
- 操作系统:Ubuntu 22.04 LTS(CentOS 也适用,命令略有差异)
- iptables:预装版本(或使用 nftables 替代)
- Fail2Ban:v1.0.2,使用 pip install fail2ban 或 apt install fail2ban 安装
二、构建基础 iptables 封锁机制
1. 初始化默认防火墙规则
# 清空原有规则
iptables -F
iptables -X
# 默认拒绝所有输入连接
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 保留本地回环
iptables -A INPUT -i lo -j ACCEPT
# 开启常用端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
2. 封锁恶意 IP 脚本模板
#!/bin/bash
IP="$1"
if [ -z "$IP" ]; then
echo "Usage: $0 <ip-address>"
exit 1
fi
iptables -I INPUT -s "$IP" -j DROP
echo "[+] Blocked IP: $IP"
保存为 /usr/local/bin/block-ip.sh,并赋予执行权限:
chmod +x /usr/local/bin/block-ip.sh
三、集成 Fail2Ban 实现自动化拦截
1. 配置 Fail2Ban 主配置
编辑 /etc/fail2ban/jail.local(推荐不要直接修改 jail.conf):
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd
banaction = iptables-multiport
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
2. 自定义规则过滤器(failregex)
新建 /etc/fail2ban/filter.d/nginx-404.conf:
[Definition]
failregex = <HOST> -.*"(GET|POST).*(wp-login|xmlrpc|/admin|/phpmyadmin).*" 404
ignoreregex =
并在 jail.local 中增加:
[nginx-404]
enabled = true
filter = nginx-404
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 300
bantime = 3600
四、测试与验证:封锁是否生效?
1. 启动并观察 Fail2Ban 状态
systemctl enable fail2ban
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
2. 验证封锁逻辑
在另一个主机中模拟异常访问,观察是否被自动封锁:
curl http://your_ip/wp-login.php
数次尝试后:
iptables -L -n | grep DROP
应能看到该 IP 已被加入封锁列表。
五、进阶:持久化与日志监控
1. 持久化 iptables 规则(防止重启丢失)
apt install iptables-persistent
iptables-save > /etc/iptables/rules.v4
2. Fail2Ban 封禁日志监控
tail -f /var/log/fail2ban.log
可实时查看封锁动作与触发原因。
六、常见问题排查
| 问题现象 | 可能原因 | 解决建议 |
|---|
| iptables 封锁后仍能访问 | DROP 链顺序不对 | 使用 iptables -I 插入到顶部 |
| Fail2Ban 无封禁记录 | 日志路径不正确或格式不匹配 | 确保 logpath 与 regex 精确匹配 |
| 封禁未生效 | 使用 firewalld/nftables 而非 iptables | 检查并统一防火墙工具 |
七、自动化防御是最低成本的安全投资
手动封 IP 只是短期应急,自动化才是长效机制。Fail2Ban 配合 iptables 的组合,能够将最频繁的低级攻击挡在门外,大大减少运维介入频率。尤其在香港这样的网络出口节点,动态 IP 黑名单联动已成为我保障业务稳定运行的核心策略之一。
如需进一步接入 Cloudflare、WAF 或定制高防网关,欢迎参考我后续文章《企业级多层DDoS防护实战:从L4到L7的逐层打击》。











