
我的目標是配置一個充當路由器的容器,透過多個 VPN 連線進行負載平衡。
為此,我用以下方法機率性地標記發起資料包:
iptables -I PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m statistic --mode random --probability .50 -j MARK --set-mark 200 -m mark --mark 0
iptables -A PREROUTING -t mangle -j MARK --set-mark 201 -m mark --mark 0
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
它選擇兩個路由表之一:
echo "200 tun0" >> /etc/iproute2/rt_tables
echo "201 tun1" >> /etc/iproute2/rt_tables
ip rule add fwmark 200 table tun0
ip rule add fwmark 201 table tun1
我相信路由表選擇正確,因為當我配置任一表 tun0/1 以使用 VPN 網關流量時,似乎不會返回。 Atcpdump
顯示流量正在退出,但任何指令都失敗。
ip route add default 10.7.7.1 dev tun0 table tun0
ip route add default 10.7.7.1 dev tun1 table tun1
如果表 tun0/1 使用非 VPN 閘道10.10.10.1
流量將會如預期運作。我還可以透過在主表上設定預設路由來在 VPN 網關之間進行選擇:
ip route add default 10.7.7.1 dev tun0/1
因此,問題似乎出在透過自訂表之一而不是主表選擇 VPN 閘道時。歡迎任何線索/診斷/建議!
注意我已經配置了必要的選項:
echo 0 > /proc/sys/net/ipv4/conf/**/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
sysctl -w net.ipv4.fwmark_reflect=1
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
答:
@AB 的答案提供了解決方案。我需要在 tun0/1 表中新增返回本地網路的流量路由:
ip r a 10.10.10.0/24 via 10.10.10.1 table tun0
ip r a 10.10.10.0/24 via 10.10.10.1 table tun1
正如@AB所說,如果沒有這些標記的資料包將被發送回接收它們的tun。
答案1
讓我們關注發生了什麼。
- 封包(新流的第一個)從非隧道介面到達
- 連線為此資料包建立一個新條目,開始新的串流
- 資料包在路由決策之前接收(隨機,這次:)標記 200
- 資料包使用表 200 進行路由
- 表 200 有一種可能性:資料包將透過屯0
- 資料包的標記被保存在其整個流中連線條目(即:康馬克)。
到目前為止,一切順利,資料包(及其流)已通過屯0。
現在當一個回覆這個流中的資料包回來了嗎?
回覆資料包來自屯0
回覆資料包由以下內容標識連線作為現有流程的一部分
資料包從其繼承標記 200康馬克在路由決策之前與現有流關聯
資料包使用表 200 進行路由
表 200 有一種可能性:資料包將透過屯0
Oups:回复資料包從其來源處路由回:隧道接口,而不是從流的初始資料包的來源處路由回。
根據是否也停用嚴格反向路徑轉送 (
rp_filter=0
) 的下一跳路由器(隧道遠端端點),封包要麼被丟棄,要麼再次路由回去,從而形成環路,直到其遞減的 TTL 達到 0。
因此,問題似乎出在透過自訂表之一而不是主表選擇 VPN 閘道時。
確實,主要的路由表具有多個預設路由。它通常包括一條或多條 LAN 路由。因此,當不涉及標記時,響應會根據以下評估正確路由全部主路由表條目的一部分,而不僅僅是遵循其預設路由。
這些額外的 LAN 路由:使用的路由乙太網路0和乙太網路1或至少涉及客戶端請求的一個(如果不是兩者)也必須複製到附加路由表200和201。
附加說明(不適用於 OP 的情況):在相反方向工作的設定中:來自使用完全相同(私有)IP 來源位址的不同節點的原始流向同一服務,可能有兩個不同的流看起來相同(相同的5-uple 協定、saddr、sport、daddr、dport),但隧道介面除外。預設情況下連線會看到單一流。為了防止這種情況,可以使用連線區域,(選擇一個值來代表介面)連線分別處理它們。