我正在尝试测试标准 linux NAT 的吞吐量。我已经设置了以下虚拟网络:
[192.168.42.5] <--> [192.168.42.2:192.168.35.2] <--> [192.168.35.10]
中间主机有2个接口,运行ubuntu 14.04,配置为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]
主机也有第二个网络的路由规则:
sudo ip route add 192.168.35.0/24 via 192.168.42.2 dev eth1
然后我hping3
在[192.168.42.5]
主机上运行:
sudo hping3 192.168.35.10 -k -s 3453 -S -n -p 80 -i u1000
我还观看了关于[192.168.35.10]
with的交流tcpdump
:
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
标志。据我所知,您设置了一个非常不寻常的设置,创建了大量具有相同源/目标的连接。IPtables 是一个有状态的防火墙,并单独跟踪每个连接。我推测您最终会在哈希表中创建大量冲突。这通常会减慢访问速度,这可能是您所看到的。路由器可能以无状态或半状态方式运行。这减少了所涉及的开销。