You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iptables配置异常:预期禁止的出站流量仍可正常通行,移除环回出站规则后才生效?

iptables配置异常:预期禁止的出站流量仍可正常通行,移除环回出站规则后才生效?

兄弟,这种看着规则和预期完全不符的情况真的头大,咱们一点点拆解问题根源:

核心疑点:你没贴全的OUTPUT链,才是问题关键!

你只展示了INPUT链的规则,但出站流量完全由OUTPUT链的规则和默认策略控制。结合你说的「移除OUTPUT链的localhost允许规则后,出站才被正确拦截」,我几乎可以肯定:你的OUTPUT链默认策略是ACCEPT,而非你预期的DROP——这就是最常见的配置疏漏!

具体逻辑捋清楚:

  1. 初始状态(保留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,出站包直接通过,也能正常连通。
  2. 移除localhost OUTPUT规则后:

    • 如果你这时候已经把OUTPUT默认策略改成DROP(可能你自己没注意到),那直接访问IP时,没有任何规则允许TCP出站,自然会超时;而用域名访问的话,第一步DNS解析就会失败,连目标IP都拿不到,也会直接报错。

验证&修复步骤:

先验证问题:

用这条命令查看OUTPUT链的完整配置和默认策略:

iptables -L OUTPUT -v -n

如果输出开头显示Chain OUTPUT (policy ACCEPT ...),那就是我说的默认策略问题。

修复配置:

  1. 先设置OUTPUT链的默认策略为DROP,这是实现「拦截所有其他流量」的基础:
iptables -P OUTPUT DROP
  1. 添加必要的出站规则:
    • 允许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
    
  2. 最后别忘了给INPUT链补一条关键规则——允许已建立连接的响应流量(不然你发起的出站请求,对方的响应会被INPUT的DROP策略拦截):
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

这条规则建议放在INPUT链的lo规则之后,SSH入站规则之前。

备注:内容来源于stack exchange,提问作者Norswap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:43:13