我正在尝试配置一个为几百个用户提供互联网服务的路由器。该路由器有 4 个基本有线上行链路,全部使用 DHCP,容量约为 10/1 Mbps。
路由器有3个接口:
- eth0 连接到管理网络,192.168.A.0/24(可以忽略)
- eth1 连接到用户网络,192.168.B.0/23
- eth2 连接到 VLAN 交换机,调制解调器位于 4 个不同的 VLAN 上。
ip 路由、ip 规则和 iptables 详细信息可在此处找到:http://pastebin.com/Qi3KBR79
VLAN 编号为 24 至 27,相应的路由表具有相同的编号。每个路由表都包含 eth0、eth1 和 eth2.X 的链路级条目,以及 DHCP 服务器提供的默认路由。请注意,两个调制解调器可能最终位于同一子网上...
我使用 CONNMARK 和 ip 规则来标记连接并将它们重定向到特定于调制解调器的路由表。我还有一个 dhclient-hook,它负责在 DHCP 租约更新时更新这些辅助路由表。
默认 iptables 策略是 INPUT 和 FORWARD 的 DROP 和 OUTPUT 的 ACCEPT。请注意,ip 规则部分将 fwmarks 3 和 4 重定向回调制解调器 1 和 2,但这是暂时的,因为其他 2 个调制解调器仍在传递来自用户的流量(我们无法完全断开它们...)
综上所述,这个解决方案确实有点用,但无论选择哪个上行链路,数据包丢失率都高达 50% :-/ 有人能告诉我我到底做错了什么吗?我已经研究这个问题好几个小时了,现在非常令人沮丧...
提前致谢,-托马斯
答案1
我认为我已经找到问题所在:CONNMARK
。在中mangle-PREROUTING
,似乎--restore-mark
只为下一个表设置标记,因此后续规则匹配--mark=0
并为每个数据包设置一个新标记。
解决方案是仅标记匹配的数据包--state NEW
。但是,我们还决定客户端在访问网站时应具有一致的 IP,否则某些应用程序(尤其是电子银行)将失败。
因此,最终的标记是在 IP 基础上完成的,我们的源池分布在多个 /25 子网中。
呼呼!
托马斯