iptables规则匹配顺序及与fail2ban配合的配置疑问
iptables规则匹配顺序及与fail2ban配合的配置疑问
嘿,我来帮你理清这个问题——你的初始理解有个关键误区,先给你掰明白iptables的核心逻辑,再说说和fail2ban配合的正确姿势。
首先纠正你对iptables匹配顺序的认知:iptables是从上到下逐条匹配规则,一旦找到第一条完全匹配的规则(不管是ACCEPT、DROP还是其他动作),就会执行该动作,并且停止继续匹配后续规则。你的初始想法里把“阻断所有其他端口”的DROP规则放在fail2ban规则前面,这是完全错误的——因为DROP规则触发后,后续的fail2ban封禁规则根本不会被执行到,那些已经被标记为恶意的IP请求根本轮不到fail2ban的规则处理。
再看你编辑后的配置,先设置默认INPUT链为DROP这个操作是对的,但关于fail2ban规则的位置,你搞反了:fail2ban的封禁规则必须放在所有ACCEPT规则的前面。
为什么?因为fail2ban的核心作用是拦截那些尝试暴力破解的恶意IP(比如反复尝试SSH登录、邮件服务登录的IP),如果把ACCEPT规则放在前面,那么这些恶意IP的请求会先被ACCEPT放行,fail2ban的封禁规则就完全起不到作用了。正确的顺序应该是:
- 先设置INPUT链的默认策略为DROP(你的这个操作是正确的)
iptables -P INPUT DROP
- 插入fail2ban的封禁规则(或者让fail2ban自动往INPUT链的头部添加规则,fail2ban默认就是这么做的,它会创建专门的链比如
f2b-SSH,然后在INPUT链最前面添加跳转规则到这些封禁链) - 添加允许已建立/相关连接的规则(这个你漏了,非常重要!否则服务器对外发起的请求的响应会被自己的规则阻断)
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- 最后添加常规的端口开放ACCEPT规则
# 接受eth0上的web服务端口 iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT # 接受SSH端口(如果需要远程管理的话) iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # 接受DNS相关端口(如果服务器需要提供DNS服务的话) iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT # 接受邮件服务相关端口 iptables -A INPUT -i eth0 -p tcp --dport 465 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 993 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
举个实际例子:假设某个IP因为多次SSH登录失败被fail2ban封禁,当它再次发起SSH请求时,首先会匹配到fail2ban的DROP规则,直接被拦截;如果把ACCEPT规则放在前面,这个IP的请求会先被ACCEPT放行,fail2ban的封禁规则就形同虚设了。
总结一下你的理解偏差:
- 初始想法里把全局DROP规则放在fail2ban前面,导致fail2ban规则无法生效
- 编辑后的配置如果把fail2ban规则放在ACCEPT后面,同样起不到封禁作用,必须把恶意IP拦截规则放在最优先的位置
备注:内容来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

