我正在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也能正常运行。
为什么NAT很奇怪地失败? 如果它缺乏容量,为什么它没有修改数据包呢?
PS当我设置通常的路由器而不是NAT(在[192.168.35.10]
主机中有相应的规则)时,它通常处理甚至10k Pkt / s速率。
问题可能是-k
标志。 从我所看到的,你build立了一个非常不寻常的设置,创build大量的连接与相同的来源/目的地。 IPtables是一个有状态的防火墙,并单独跟踪每个连接。 我会推测你最终在散列表中创build大量的冲突。 这通常会减慢访问,这可能是你所看到的。
路由器可能以无状态或半状态的方式运行。 这减less了涉及的开销。