如何利用iptables和 Fail2Ban编写简易IP封锁脚本的实战教程

如何利用iptables和 Fail2Ban编写简易IP封锁脚本的实战教程

我的香港服务器突然被 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的逐层打击》。

未经允许不得转载:A5数据 » 如何利用iptables和 Fail2Ban编写简易IP封锁脚本的实战教程

相关文章

contact