通过具有两个 WAN 接口的 NAT 发生奇怪的数据包丢失

通过具有两个 WAN 接口的 NAT 发生奇怪的数据包丢失

我有一台 Linux 服务器,我也将其用作网络网关/“路由器”。它有三个活动网络接口 - 两个网络接口通过不同的 ISP 连接到互联网,第三个网络接口通过 NAT 为我的本地机器提供互联网访问。我在 WAN 链路之间进行了负载平衡。

从服务器上,网络可以正常访问 - 一切正常,负载平衡正常,通常没有数据包丢失。服务器和本地计算机之间的连接也完全正常。但如果我通过服务器从本地计算机访问互联网/WAN,我总是看到约 40% 的持续数据包丢失。这使得连接非常不稳定。经过一番调查,我发现我收到(和丢失)来自两个接口的数据包或多或少是相等的,所以不是就好像其中一个接口会丢失所有数据包,从而拖累其他所有接口。

如果我禁用两个 WAN 链接中的任意一个,数据包丢失现象就会立即消失。如果我再次启用两个 WAN 链接,该现象又会立即重新出现。

这可能是什么原因造成的?有没有提示如何在不放弃其中一个 WAN 链接的情况下解决此问题?

我的iptables过滤表:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

我的iptablesnat表:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  10.42.0.0/24        !10.42.0.0/24 

我的iptablesmangle 表:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
MARK       all  --  0.0.0.0/0            0.0.0.0/0            state NEW MARK set 0x2
MARK       all  --  0.0.0.0/0            0.0.0.0/0            state NEW statistic mode random probability 0.50000000000 MARK set 0x1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination    

ip route show输出:

default 
    nexthop via 10.7.0.254  dev eth0 weight 1
    nexthop via 78.62.255.254  dev eth2 weight 1
10.7.0.0/16 dev eth0  proto kernel  scope link  src 10.7.5.102 
10.42.0.0/24 dev eth1  proto kernel  scope link  src 10.42.0.254 
78.62.192.0/18 dev eth2  proto kernel  scope link  src 78.62.239.10 
169.254.0.0/16 dev eth1  scope link  metric 1000 

所有内容都未经编辑——在这种情况下,不太关心“隐私”

答案1

根据您显示的表格,您没有采取任何措施来确保 NAT 保持流量从其开始的相同接口流出,这意味着大约一半的传出数据包可能被错误翻译。

为了正确进行 NAT 负载平衡,您需要在 mangle 表上制定一个预路由规则,随机地用 1 或 2 标记新流,您需要将ip rule标记为 1 的数据包路由到 WAN 接口 1,将标记为 2 的数据包路由到 WAN 接口 2,并且您需要在iptablesNAT 表上制定单独的 SNAT 规则,每个 WAN 接口一个。

有关更详细的描述,请参阅 Diego Lima 的 Iptables 负载均衡简介

相关内容