为什么这个 iptables 配置在 11 次中会有 10 次丢弃重复的 UDP 数据包?

为什么这个 iptables 配置在 11 次中会有 10 次丢弃重复的 UDP 数据包?

我正在尝试从本地 NAT 网络 (192.168.12.0/24) 上的设备复制流向 Internet 地址上端口 50007 的 UDP 数据包,以便在本地 (192.168.12.1:50006) 对其进行处理。

在我的 40 台设备中的 38 台上,以下 iptables mangle 和 nat 表可以解决问题 - 端口 50006 以每分钟 12 个(每 5 秒 1 个)的传输速率接收数据包。

但是,在两台与其他 38 台设备具有相同配置的设备上,端口 50006 接收数据包的速率为传输速率的 1/11,即每 55 秒接收 1 个数据包 - 而 11 个数据包中的其他 10 个可能会被丢弃。

socat 脚本监听端口 50006:

socat UDP-RECVFROM:50006,fork "EXEC:handler-script"

处理程序脚本在 1 秒内返回,并且当脚本更改为无操作时,接收率没有变化。

两个故障设备中的一个自动恢复了正常,端口 50006 开始以传输速率接收数据包。

尽管 tcpdump 显示原始数据包以全速率到达,但剩余设备仍然仅以传输速率的 1/11 接收数据包。

$ sudo iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
TEE        udp  --  192.168.12.0/24      anywhere             udp dpt:50007 TEE gw:10.0.0.1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  192.168.12.0/24      anywhere             udp dpt:50007 to:192.168.12.1:50006

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.12.0/24      anywhere            

故障节点的一个奇怪之处是,tcpdump 显示重复的数据包,其中包含原始源地址和上行链路上本地节点 IP 对应的源地址。在正常工作的节点上,tcpdump 仅显示原始(伪装前)数据包。

$ sudo tcpdump -i eth2 port 50007

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
03:56:41.851719 IP 192.168.12.66.4097 > example.com.50007: UDP, length 216
03:56:41.851996 IP 10.0.0.8.4097 > example.com.50007: UDP, length 216`

故障节点上的 CPU 看起来正常,并且正常节点和故障节点之间的配置几乎肯定没有差异。但是,这些节点部署在不同的 LAN 中。

所以问题是:是什么原因导致故障节点每 11 个数据包中丢弃 10 个?第二个问题是:为什么 tcpdump 在这个节点上表现不同,并显示伪装数据包和原始数据包。

关于如何调试该问题,有什么建议吗?

答案1

好吧,事实证明这个问题和答案提供了解释:

为什么 iptables 不丢弃数据包?

事实证明,此安装在下游设备和路由器之间具有特别好的 wifi 连接,并且在建立 DNAT 规则之前建立了 ip_conntrack 条目,从而导致了参考问答中出现的情况。

我可以通过禁用路由器上的 AP 185 秒(比默认的 conntrack 条目超时时间长 5 秒)然后重新启用它来确认这一点。一旦我这样做,数据包就会以预期的速率流动。

此外,一旦解决此问题,tcpdump 跟踪中可见的意外重复数据包就会消失。

相关内容