Networking

虛擬網關 iptables

  • September 29, 2021

我正在嘗試設置一種簡單的網路配置,但我無法解決這個問題。我的目標是讓 LAN 客戶端通過 VPN,同時有可能到達伺服器本身。目前設置:

GW機器:

VPN interface -> vpn0 [10.x.y.z]
LAN interface -> lan0 [172.16.1.0/24], machine itself is 172.16.1.1

我為 vpn 連接創建了單獨的路由表,並且可以訪問它;例如ping -I vpn0 10.20.30.40(VPN 網路中的機器)執行良好。目前,如果我這樣做,我可以為 LAN 客戶端啟用 VPN 訪問:

ip rule add from 172.16.1.0/24 table vpntable
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o vpn0 -j MASQUERADE

但是,在這種情況下,客戶端無法訪問網關機器 ( 172.16.1.1) 本身,這是意料之中的。我的目標是能夠從LAN端訪問網關機器和 VPN 之一。我很確定MASQUERADE是這裡的罪魁禍首,但我不確定我應該去哪個方向。我有兩個想法:

  1. 通過模組創建虛擬介面dummy並嘗試將其配置為 LAN 客戶端的“網關”?就像預設情況下他們能夠訪問172.16.1.1一樣,如果他們執行類似的操作,那麼該虛擬介面的地址ip route add 10.20.30.0/24 via 172.16.16.1在哪裡;172.16.16.1但是我擔心我最終會遇到很多SNAT規則,並且會產生更多的成本。
  2. 通過連接標記基於策略的路由?在這種情況下,客戶不必執行任何其他步驟。

GW 機器是 Ubuntu LTS,轉發打開,iptables 是空的,除了提到的規則。

我將不勝感激有關該主題的任何意見。謝謝!

更新:

vpntable包含特定於 vpn 網路的路由:

default via 10.20.1.1 dev vpn0

這裡不涉及 Netfilter 和 NAT,都是關於路由的。


由於策略規則首先遍歷vpntable,並且由於預設路由,此路由表始終匹配以提供路由查找的答案,因此當使用網關自己的 172.16.1.1 時,不再使用主路由表。所以沒有什麼可以告訴使用lan0了。

因此,雖然初始路由選擇將使用lan0

$ ip route get to 172.16.1.2
172.16.1.2 dev lan0 src 172.16.1.1 uid 1000 
   cache 

一旦選擇了這條路線,這會將地址設置為 172.16.1.0/24 的 172.16.1.1 部分,因此將切換到使用vpn0

$ ip route get from 172.16.1.1 to 172.16.1.2
172.16.1.2 from 172.16.1.1 via 10.20.1.1 dev vpn0 table vpntable uid 1000 
   cache 

解決方法是在這種情況下添加一個例外以留在lan0上。

有幾種方法可以做到這一點,都應該解決問題,通常使用第一個或最後一個(最簡單的):

  • 在 VPN 路由表中指定 LAN 路由
ip route add 172.16.1.0/24 dev lan0 table vpntable
  • 或者先用呼叫路由表的路由規則為本地流量解析區域網路(iif lo這裡的特殊意思是本地發起的流量,它實際上並不涉及lo介面)。在它具有較低的首選項並在呼叫vpntable路由表之前對其進行評估後添加:
ip rule add iif lo to 172.16.1.0/24 lookup main
  • 或者作為上一個項目符號的變體:跳過 VPN 規則,直接到呼叫路由表的規則:
ip rule add iif lo to 172.16.1.0/24 goto 32766
  • 或者在初始路由規則中指定介面而不是地址(必須刪除):
ip rule delete from 172.16.1.0/24 lookup vpntable
ip rule add iif lan0 lookup vpntable

這樣它就不會觸發本地地址,因為它不是從lan0收到的。

與第一種方法相反,當綁定到 172.16.1.1 的源時,最後一種方法甚至不允許在網關上預設使用 VPN(然後仍將通過 MASQUERADE 規則進行 NAT)。

引用自:https://unix.stackexchange.com/questions/670832