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

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

我正在尝试测试标准 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 是一个状态防火墙,可以单独跟踪每个连接。我推测您最终会在哈希表中创建大量冲突。这通常会减慢访问速度,这可能是您所看到的情况。

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

相关内容