如何通过iptables/conntrack立即生效DROP规则以阻止特定IP的新连接
如何通过iptables/conntrack立即生效DROP规则以阻止特定IP的新连接
看起来你遇到的问题核心是规则放错了链,还有一条错误规则在干扰,咱们一步步来解决:
首先,找出问题根源
- 错误的DNAT规则位置:你在
INPUT链里加了一条DNAT规则,但DNAT是nat表专属的操作,根本不该出现在filter表的INPUT链里,这条规则不仅没用,还可能打乱流量处理逻辑。 - DROP规则加错了链:你的邮件服务器是在VM里,外部IP的流量是通过DNAT转发到VM的,这类转发流量不会走
INPUT链(INPUT链只处理目标是本机的流量),而是走FORWARD链,所以你加在INPUT链的DROP规则根本没作用!
具体修复步骤
1. 删除错误的INPUT链DNAT规则
先把这条无效又干扰的规则删掉:
iptables -D INPUT -p tcp -d <MYDOMAIN> --dport 587 -j DNAT --to 10.0.1.109:587
2. 在FORWARD链添加DROP规则(关键!)
攻击流量是要转发到内部VM的,必须在FORWARD链最前面添加DROP规则,确保新流量第一时间被拦截:
for IP in <IP_LIST> ; do # 把DROP规则插入到FORWARD链的最开头,优先执行 iptables -I FORWARD -s $IP -j DROP # 删除该IP的现有连接跟踪条目,避免旧连接状态干扰 conntrack -D -s $IP done
3. 验证规则是否生效
- 查看FORWARD链的规则,确认DROP规则排在最前面:
iptables -L FORWARD --line-numbers
- 再次检查攻击者IP的连接跟踪:
conntrack -L -s <ATTACKERIP>
如果还有TIME_WAIT状态的连接不用慌,这类是已经关闭的会话,不会接受新请求,新的连接请求会被FORWARD链的DROP规则直接拦截。
4. 补充(可选但建议)
确保FORWARD链有允许正常转发流量的规则,比如允许已建立/相关的连接:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
(这条规则要放在DROP规则后面,避免影响拦截效果)
为什么之前的方法没用?
简单来说:你把拦截规则加在了“不会处理攻击流量”的链上,攻击流量绕开了INPUT链直接走FORWARD链到VM了,所以你的DROP规则相当于没加。现在把规则移到FORWARD链,就能直接拦截所有发往VM的攻击者流量了。
备注:内容来源于stack exchange,提问作者le_top
相关产品推荐
相关产品推荐

