iptables-allports对Docker部署在81端口的站点封禁失效求助
你遇到的核心问题其实是Docker容器的网络流量优先级高于Fail2ban默认添加的iptables规则,导致81端口的封禁没生效。下面给你一步步的排查和解决方法:
问题根源分析
Docker启动时会自动创建专属的iptables链(比如DOCKER、DOCKER-USER),所有流向Docker容器的流量都会先经过这些链。而Fail2ban默认的iptables-allports action是把封禁规则添加到INPUT链里,由于链的执行顺序问题,INPUT链的规则还没生效,流量已经被Docker的链处理了,所以81端口(容器端口)的封禁没起作用。
解决方案:自定义Fail2ban Action适配Docker网络
我们需要创建一个自定义的action,让Fail2ban把封禁规则加到Docker预留的DOCKER-USER链——这个链是专门给用户添加自定义规则用的,所有Docker流量都会先经过它。
步骤1:创建自定义Action文件
在/etc/fail2ban/action.d/目录下新建iptables-docker-allports.conf文件,内容如下:
[Definition] actionstart = iptables -N fail2ban-<name> iptables -A fail2ban-<name> -j RETURN iptables -I DOCKER-USER -p tcp -j fail2ban-<name> iptables -I DOCKER-USER -p udp -j fail2ban-<name> actionstop = iptables -D DOCKER-USER -p tcp -j fail2ban-<name> iptables -D DOCKER-USER -p udp -j fail2ban-<name> iptables -F fail2ban-<name> iptables -X fail2ban-<name> actioncheck = iptables -n -L DOCKER-USER | grep -q fail2ban-<name> actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
步骤2:修改你的Jail配置
打开你的Fail2ban jail配置文件(比如/etc/fail2ban/jail.d/mysite.conf),把action字段改成我们刚创建的自定义action:
[mysite] enabled = true port = http,https,81 filter = mysite logpath = /var/log/mysite.log maxretry = 10 findtime = 3600 bantime = 30 action = iptables-docker-allports
步骤3:重启Fail2ban服务
执行命令重启服务让配置生效:
systemctl restart fail2ban
步骤4:验证配置是否生效
- 用一个测试IP触发暴力破解(比如连续10次访问登录接口失败)
- 查看Fail2ban日志确认IP被封禁:
tail -f /var/log/fail2ban.log - 检查iptables规则,确认
DOCKER-USER链里已经添加了封禁规则:iptables -n -L DOCKER-USER - 测试被封禁的IP是否无法访问81端口的站点。
额外检查:确保Filter规则匹配81端口日志
还要确认你的mysite filter(/etc/fail2ban/filter.d/mysite.conf)能正确识别81端口的暴力破解日志条目。比如你的日志格式如果包含端口信息,正则规则要能覆盖到,示例如下:
[Definition] # 请根据你的实际日志格式调整正则 failregex = ^<HOST> -.*"POST /login HTTP/1.1" 401 .*:81$ ^<HOST> -.*"GET /admin HTTP/1.1" 403 .*:81$ ignoreregex =
这样调整后,Fail2ban就能正确封禁访问81端口的暴力破解IP了。
内容的提问来源于stack exchange,提问作者JemoeE

