使用iptables和4个DHCP上行链路进行NAT盒子负载平衡

我正在尝试configuration一个为几百个用户提供Internet的路由器。 该路由器configuration有4个基本电缆上行链路,全部使用DHCP,容量大约为10/1 Mbps。

路由器有3个接口:

  • eth0连接到pipe理networking,192.168.A.0 / 24(可以忽略)
  • eth1连接到用户networking,192.168.B.0 / 23
  • eth2连接到VLAN交换机,调制解调器位于4个不同的VLAN上。

IP路由,IP规则和iptables的细节可以在这里find : http : //pastebin.com/Qi3KBR79

VLAN编号为24〜27,对应的路由表中编号相同。 每个路由表都包含eth0,eth1和eth2.X的链接级别条目,以及DHCP服务器给出的默认路由。 请注意,有可能是2个调制解调器在同一个子网上。

我使用CONNMARK和IP规则来标记连接并将它们redirect到调制解调器特定的路由表。 我也有一个dhclient挂钩,负责在DHCP租约更新时更新这些辅助路由表。

对于INPUT和FORWARD,缺省的iptables策略是DROP,而对于OUTPUT则是ACCEPT。 请注意,ip规则部分将fwmarks 3和4redirect回到调制解调器1和2,但这是暂时的,因为其他2个调制解调器仍然在传递来自用户的stream量(我们不能完全断开它们…)

现在所有这些说,这个解决scheme有点作用,但展品约50%的数据包丢失,无论select的上行链路: – /有人能告诉我什么是我做错了? 我一直在这个问题上捅了好几个小时,现在变得非常沮丧…

在此先感谢 – 托马斯

我认为我发现了问题: CONNMARK 。 在mangle-PREROUTING ,似乎--restore-mark只为下一个表设置标记,所以后面的规则匹配--mark=0并为每个数据包设置一个新的标记。

解决办法是只标记匹配 – --state NEW数据包。 但是我们也决定客户访问网站时应该有一致的IP,否则一些应用程序,特别是电子银行,就会失败。

所以最后标记是在IP的基础上完成的,我们的源码池分割成多个/ 25个子网。

HTH!

托马斯