帶有 iptables 和 4 個 DHCP 上行鏈路的 NAT 盒負載平衡
我正在嘗試配置一個路由器,為幾百個使用者提供 Internet。該路由器有 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 伺服器給出的預設路由。請注意,有可能 2 個調製解調器最終位於同一子網中…
我使用 CONNMARK 和 ip 規則來標記連接並將它們重定向到特定於調製解調器的路由表。我還有一個 dhclient-hook,它負責在更新 DHCP 租約時更新這些輔助路由表。
預設的 iptables 策略對於 INPUT 和 FORWARD 是 DROP,對於 OUTPUT 是 ACCEPT。請注意,ip 規則部分將 fwmarks 3 和 4 重定向回調製解調器 1 和 2,但這是暫時的,因為其他 2 個調製解調器仍在傳遞來自使用者的流量(我們不能完全斷開它們……)
現在說了這麼多,這個解決方案有點工作,但是無論選擇什麼上行鏈路,都會出現大約 50% 的封包遺失:-/ 有人能告訴我我做錯了什麼嗎?我已經在這個問題上戳了幾個小時了,它變得非常令人沮喪……
在此先感謝 - 托馬斯
我認為我發現了問題:
CONNMARK
。在mangle-PREROUTING
中,似乎--restore-mark
只是為下一個表設置了標記,因此後續規則匹配--mark=0
並為每個數據包設置一個新標記。解決方案是只標記匹配的數據包
--state NEW
。然而,我們也決定客戶端在訪問網站時應該有一致的 IP,否則一些應用程序,特別是電子銀行,會失敗。所以最後標記是在 IP 的基礎上完成的,我們的源池分成多個 /25 子網。
!
托馬斯