我有两个不同的 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
iptables
我在两个界面上添加了伪装目标:
iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o bond0 -j MASQUERADE
我还通过以下方式启用了(部分)反向路径过滤sysctl
:
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
这个设置有效。数据包(连接)通过两个接口发送。只有一个问题我不明白。
当我想使用以下命令检查我的 IP 地址时:
$ curl text.whatisyourip.org
$ curl eko.one.pl/host.php
两种情况下的 IP 地址不同,这意味着该机制运行良好。我也可以看到它在wireshark
.但是,例如,当我尝试向上述第一个域发送多个请求时,我总是得到相同的 IP 地址作为响应。因此,发往特定 IP 地址的数据包看起来总是通过同一接口。我只是想知道为什么。是否有任何机制可以记住先前请求的目标 IP 地址,并使下一个请求通过相同的接口发送到相同的地址?
答案1
我已经成功解决了这个问题。在这个链接您可以阅读以下内容:
IPv4:基于哈希的多路径路由。当路由缓存在 3.6 中被删除时,IPv4 多路径算法从或多或少基于目的地变为准随机的每数据包调度。这增加了数据包乱序的风险,并且无法将多路径与选播服务一起使用。在此版本中,多路径路由实现被替换为基于流的负载平衡,该负载平衡基于源地址和目标地址合并提交的哈希值
因此,即使在内核 3.6 中删除了缓存,请求仍然会被缓存。现在源地址和目标地址很重要。这就是为什么数据包总是通过相同的接口。