为什么Linux内核中的IP伪装(源NAT)无法以高数据包速率设置源IP

我正在testing标准的linux NAT的吞吐量。 我已经build立了以下虚拟networking:

[192.168.42.5] <--> [192.168.42.2:192.168.35.2] <--> [192.168.35.10] 

中间主机有2个接口,运行ubuntu 14.04并configuration为NAT:

 sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth2 -o eht1 -j ACCEPT 

[192.168.42.5]主机也有第二个networking的路由规则:

 sudo ip route add 192.168.35.0/24 via 192.168.42.2 dev eth1 

然后我在[192.168.42.5]主机上运行hping3

 sudo hping3 192.168.35.10 -k -s 3453 -S -n -p 80 -i u1000 

而且我也使用tcpdump观察[192.168.35.10]上的通信:

 sudo tcpdump -i eth1 

系统工作正常的速度〜1k Pkt /秒。 tcpdump显示到达的数据包:

 IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1520954148, win 512, length 0 

但是当我提高数据包速率时(使用-i u700键),由于某种原因,NAT无法重写源地址,目标获取这样的数据包:

 IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1554999038, win 512, length 0 

并忽略它们没有可用的路由到192.168.42.0/24子网,所以hping3没有得到任何回应。 如果发生这种情况,我需要放松一下,等待大约1-2分钟,直到即使在低速数据包速率下,NAT也能正常运行。

为什么NA​​T很奇怪地失败? 如果它缺乏容量,为什么它没有修改数据包呢?

PS当我设置通常的路由器而不是NAT(在[192.168.35.10]主机中有相应的规则)时,它通常处理甚至10k Pkt / s速率。

问题可能是-k标志。 从我所看到的,你build立了一个非常不寻常的设置,创build大量的连接与相同的来源/目的地。 IPtables是一个有状态的防火墙,并单独跟踪每个连接。 我会推测你最终在散列表中创build大量的冲突。 这通常会减慢访问,这可能是你所看到的。

路由器可能以无状态或半状态的方式运行。 这减less了涉及的开销。