iptables配置异常:预期禁止的出站流量仍可正常通行,移除环回出站规则后才生效?
iptables配置异常:预期禁止的出站流量仍可正常通行,移除环回出站规则后才生效?
兄弟,这种看着规则和预期完全不符的情况真的头大,咱们一点点拆解问题根源:
核心疑点:你没贴全的OUTPUT链,才是问题关键!
你只展示了INPUT链的规则,但出站流量完全由OUTPUT链的规则和默认策略控制。结合你说的「移除OUTPUT链的localhost允许规则后,出站才被正确拦截」,我几乎可以肯定:你的OUTPUT链默认策略是ACCEPT,而非你预期的DROP——这就是最常见的配置疏漏!
具体逻辑捋清楚:
初始状态(保留localhost OUTPUT规则):
- 因为OUTPUT默认是
ACCEPT,哪怕你没写任何显式允许规则,所有TCP/UDP出站包都会被默认放行。 - 当你执行
wget google.com时,首先会通过本地的systemd-resolved(监听127.0.0.53)做DNS解析,这部分请求走localhost,被你的OUTPUT规则1允许,成功拿到目标IP后,wget的TCP出站包直接被默认ACCEPT策略放行,自然能正常访问。 - 哪怕你直接访问IP(比如8.8.8.8),因为OUTPUT默认
ACCEPT,出站包直接通过,也能正常连通。
- 因为OUTPUT默认是
移除localhost OUTPUT规则后:
- 如果你这时候已经把OUTPUT默认策略改成
DROP(可能你自己没注意到),那直接访问IP时,没有任何规则允许TCP出站,自然会超时;而用域名访问的话,第一步DNS解析就会失败,连目标IP都拿不到,也会直接报错。
- 如果你这时候已经把OUTPUT默认策略改成
验证&修复步骤:
先验证问题:
用这条命令查看OUTPUT链的完整配置和默认策略:
iptables -L OUTPUT -v -n
如果输出开头显示Chain OUTPUT (policy ACCEPT ...),那就是我说的默认策略问题。
修复配置:
- 先设置OUTPUT链的默认策略为
DROP,这是实现「拦截所有其他流量」的基础:
iptables -P OUTPUT DROP
- 添加必要的出站规则:
- 允许localhost出站(给本地服务留通信通道,比如systemd-resolved):
iptables -A OUTPUT -o lo -j ACCEPT- 允许ICMP出站(满足你双向ICMP的需求):
iptables -A OUTPUT -p icmp -j ACCEPT- 如果你需要从本地SSH连接其他服务器,也可以加这条:
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT - 最后别忘了给INPUT链补一条关键规则——允许已建立连接的响应流量(不然你发起的出站请求,对方的响应会被INPUT的DROP策略拦截):
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
这条规则建议放在INPUT链的lo规则之后,SSH入站规则之前。
备注:内容来源于stack exchange,提问作者Norswap
相关产品推荐
相关产品推荐

