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

Ubuntu 18.04重启后NAT转发数分钟失效的排查求助

Ubuntu 18.04重启后NAT转发数分钟失效的排查求助

各位好,我遇到一个非常棘手的问题:2023年5月5日早上,我的Ubuntu 18.04服务器上的LAN突然无法正常访问外网了——所有客户端都被限制在外,因为主服务器的iptables FORWARD规则好像被莫名其妙地忽略了。

服务器刚重启的那1-2分钟一切正常,之后就彻底失效。我确认最近没有安装任何新软件,这个NAT转发配置已经稳定运行了10年,也绝对没有修改过防火墙规则。现在我怀疑是重启后某个进程启动干扰了规则,但完全不知道该从哪里入手排查(真心希望不是被黑客入侵了)。

当前iptables NAT表状态

我截取了失效后的iptables统计信息,可以看到PREROUTING、INPUT、POSTROUTING链一开始都有数据包通过,但之后计数器就完全停住了——除了INPUT链,其他链再也没有新的数据包进来:

Chain PREROUTING (policy ACCEPT 642 packets, 43832 bytes)
pkts    bytes target     prot opt in     out     source               destination
208    13747 LOG        all  --  *      *       192.168.3.183        0.0.0.0/0            LOG flags 0 level 4

Chain INPUT (policy ACCEPT 825 packets, 51359 bytes)
pkts    bytes target     prot opt in     out     source               destination
189     9873 LOG        all  --  *      *       192.168.0.18        0.0.0.0/0            LOG flags 0 level 4

Chain OUTPUT (policy ACCEPT 120 packets, 13320 bytes)
pkts    bytes target     prot opt in     out     source               destination
0        0 LOG        all  --  *      *       192.168.0.18        0.0.0.0/0            LOG flags 0 level 4

Chain POSTROUTING (policy ACCEPT 89 packets, 8970 bytes)
pkts    bytes target     prot opt in     out     source               destination
153    10268 LOG        all  --  *      *       192.168.0.18        0.0.0.0/0            LOG flags 0 level 4
153    10268 SNAT       all  --  *      eno1    192.168.0.18        0.0.0.0/0            to:10.0.0.2

我最关注的是POSTROUTING链里的SNAT规则,它一开始处理了153个包,对应我的Windows客户端当时能短暂访问外网,说明重启初期网络配置是完全正常的。另外我还尝试添加了MASQUERADE规则,但因为SNAT优先级更高,它并没有生效,只是死马当活马医的尝试。

已完成的排查工作

  • 确认IP转发功能正常:
    $ sudo sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1
    
  • 确认bridge-nf-call-iptables参数配置正确:
    $ sysctl net.bridge.bridge-nf-call-iptables
    net.bridge.bridge-nf-call-iptables = 1
    
  • 检查conntrack状态,只发现一条UNREPLIED的UDP记录,暂时不确定是否和问题相关:
    udp      17 16 src=192.168.0.18 dst=75.75.75.75 sport=56804 dport=53 ...
    ... [UNREPLIED] src=75.75.75.75 dst=192.168.0.18 sport=53 dport=56804 mark=0 use=1
    
  • 服务器上有通过snap安装的Docker,虽然守护进程在运行,但当前iptables里没有常见的DOCKER规则链,只有一个未被引用的DOCKER-USER链:
    Chain DOCKER-USER (0 references)
    pkts      bytes target     prot opt in     out     source               destination
    0        0 early_forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    
  • 局域网内部通信完全正常,客户端和服务器、客户端之间都能正常交互。
  • 核对了网卡地址和路由表,配置和之前完全一致:
    网卡地址:
    $ ip -4 -br address
    lo               UNKNOWN        127.0.0.1/8
    eno1             UP             x.x.x.x/30 192.168.1.1/24 10.1.10.2/24
    eno2             UP             192.168.0.45/24 192.168.2.1/24 192.168.3.1/24 172.16.1.1/24 10.0.2.10/24 10.0.3.10/24
    docker0          DOWN           172.17.0.1/16
    
    路由表:
    $ ip route
    default via 96.67.192.226 dev eno1 proto static
    10.0.2.0/24 dev eno2 proto kernel scope link src 10.0.2.10
    10.0.3.0/24 dev eno2 proto kernel scope link src 10.0.3.10
    10.1.10.0/24 dev eno1 proto kernel scope link src 10.1.10.2
    x.x.x.x/30 dev eno1 proto kernel scope link src x.x.x.x
    172.16.1.0/24 dev eno2 proto kernel scope link src 172.16.1.1
    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
    192.168.0.0/24 dev eno2 proto kernel scope link src 192.168.0.45
    192.168.1.0/24 dev eno1 proto kernel scope link src 192.168.1.1
    192.168.2.0/24 dev eno2 proto kernel scope link src 192.168.2.1
    192.168.3.0/24 dev eno2 proto kernel scope link src 192.168.3.1
    
    注:x.x.x.x是公网静态IP。

最终解决办法

折腾了半天实在找不到根源,我最终采取的解决办法是升级到Ubuntu 20.04(接下来会继续升级到22.04)。直到现在我还是搞不懂为什么18.04的iptables会突然出现这种诡异的问题,但升级后目前一切正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:19:37