Iptables

減少 VPN 集群中的靜態路由數量

  • August 11, 2018

我正在嘗試為具有固定 IP 的工作節點設置高可用性 OpenVPN 集群,無論它們連接到哪個 OpenVPN 伺服器。這是一項要求,因為事物專門綁定到該 IP 地址。我計劃在每個主節點上都有一個分佈式 etcd,我推送哪個主節點具有哪些工作節點(使用 OpenVPN 連接/斷開腳本)並更新然後相應地更新每個主節點的路由表(通過查看 etcd 密鑰)。

一切都將在 docker 容器中執行。

我已經繪製了我現在的情況圖,其中有 3 個主節點(M1、M2、M3)、3 個工作節點(w1、w2、w3)和“sidecar”容器(M2M1、M3M1、M3M2)來連接每個主節點給其他大師。

使用以下路由表設置一切正常,但需要更新主節點和邊車容器上的路由。除了標準的 iptables -A FORWARD 規則以確保在介面之間轉發流量,我只需要在工作節點上添加一個 iptables 規則,例如iptables -A POSTROUTING -o tap0 -m iprange --dst-range 5.0.0.0-5.255.255.255 -j SNAT --to-source 5.0.0.1 -t nat對於 w1,否則它將使用主 IP 地址發送數據包。

網路情況

我想知道是否可以在邊車容器上設置基於策略的路由以僅具有規則"if it's coming from tap0 and it's from an ip in 5.0.0.0/8 then put it on eth0 towards the master node inside the same subnet",反之亦然"if it's coming from eth0 and it's in an ip in 5.0.0.0/8 then put it on tap0 towards the vpn gateway"。如果我能做到這一點,那麼我只需要操縱主節點上的路由

我是否需要用 iptables 標記數據包,然後設置 2 個路由表,一個對應於每個標記,然後在該表上設置路由?

我之前嘗試過架設一座橋,但我無法讓它工作。

(如果有比我相當複雜的設置更好的方法來設置具有固定 IP 的 vpn 集群,請告訴我)

編輯:

在下面的答案的幫助下,我測試了 M2M1 的以下語句,效果很好:

# Create the 2 tables to add specific routes on
echo "2     toeth" >> /etc/iproute2/rt_tables
echo "3     totap" >> /etc/iproute2/rt_tables

# Everything coming from eth0 will be going to the totap table and everything from tap0 will be going to the toeth table
ip rule add table totap iif eth0
ip rule add table toeth iif tap0

# Add the routes but on the specific table
ip r r 5.0.0.0/8 via 192.168.1.1 table totap
ip r r 5.0.0.0/8 via 172.30.2.2 table toeth

編輯2:

如果有人有興趣玩它,我已經建立了一個github repo

您可以使用ip rule(參見 參考資料man ip-rule)來設置基於源或目標 IP 以及基於源或目標介面的特定路由表。它應該能夠實現你想要的。

SELECTOR := [ from PREFIX ] [ to PREFIX ] [ iif STRING ] [ oif STRING ] ...

引用自:https://serverfault.com/questions/925941