我正在尝试测试标准 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]
我还观察了与 的交流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 的速率。
答案1
问题可能出在-k
标志上。据我所知,您设置了一个非常不寻常的设置,创建了大量具有相同源/目标的连接。IPtables 是一个状态防火墙,可以单独跟踪每个连接。我推测您最终会在哈希表中创建大量冲突。这通常会减慢访问速度,这可能是您所看到的情况。
路由器可以以无状态或半状态的方式运行。这减少了所涉及的开销。