我有一台 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
我的iptables
nat表:
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
我的iptables
mangle 表:
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,并且您需要在iptables
NAT 表上制定单独的 SNAT 规则,每个 WAN 接口一个。
有关更详细的描述,请参阅 Diego Lima 的 Iptables 负载均衡简介