两个 ISP 和多路径网关配置

Mik*_*kov 3 routing debian

我有两个不同的 ISP。我想设置某种负载平衡设置,将数据包分发给这些提供商。我知道这可以使用不同的路由表来完成,但我想使用称为“多路径网关”的东西。

我已经在/etc/network/interfaces文件中配置了两个接口。这两个连接单独工作。我用以下网关替换了默认网关:

# ip route add default \
    nexthop via 192.168.1.1 dev bond0 weight 1 \
    nexthop via 10.143.105.17 dev wwan0 weight 1
Run Code Online (Sandbox Code Playgroud)

iptables在两个接口上都添加了伪装目标:

iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o bond0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

我还通过sysctl以下方式启用(部分)反向路径过滤:

net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
Run Code Online (Sandbox Code Playgroud)

此设置有效。数据包(连接)通过两个接口发送。只有一个问题我不明白。

当我想使用以下命令检查我的 IP 地址时:

$ curl text.whatisyourip.org
$ curl eko.one.pl/host.php
Run Code Online (Sandbox Code Playgroud)

两种情况下的 IP 地址不同,这意味着该机制运行良好。我也可以看到它在wireshark. 但是,例如,当我尝试向上述第一个域发送多个请求时,我总是得到相同的 IP 地址作为响应。所以看起来去往特定 IP 地址的数据包总是通过同一个接口。我只是想知道为什么。是否有任何机制可以记住先前请求的目标 IP 地址,并使下一个请求到相同的地址通过相同的接口?

Mik*_*kov 5

我已经设法解决了这个问题。在此链接中,您可以阅读以下内容:

IPv4:基于哈希的多路径路由。当路由缓存在 3.6 中被移除时,IPv4 多路径算法从或多或少基于目的地变为准随机每包调度。这增加了无序数据包的风险,并且无法将多路径与任播服务一起使用。在此版本中,多路径路由实现被替换为基于对源地址和目标地址合并提交的哈希的基于流的负载平衡

因此,即使在内核 3.6 中删除了缓存,请求仍在缓存中。现在源地址和目标地址很重要。所以这就是数据包总是通过同一个接口的原因。

  • 您还应该提及*为什么*需要对源和目标进行散列:普通 Internet 协议 (TCP/UDP) 不是“多宿主”,并且您的两个 ISP 将为您提供不同的公共地址。协议无法处理这种情况,因此随机分发到“其他”ISP 的数据包将仅计为数据包丢失。您需要根据连接选择确定性。 (2认同)