Iptables

iptables,wireguard:VPN 和 LAN 之間的 2 路路由

  • October 18, 2020

我正在使用 WireGuard 設置 VPN,並且在相應的 VPN 伺服器上配置我的防火牆時卡住了。我想要以下功能:

  • VPN 設備 ( 10.6.0.0/24) 可從 LAN ( 10.20.0.0/24) 獲得(問題!)
  • 10.20.0.0/24可從 VPN ( ) 獲得的LAN 設備 ( 10.6.0.0/24)(有效!)

目前的 iptables 配置:

向任何方向轉發來自現有(已打開)連接的所有流量

iptables -t filter -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

這使得 LAN 設備可以從 VPN 獲得(工作正常)

# Direction: VPN -> LAN -------------------------------------------------------------
iptables -t nat -A PREROUTING -d 10.20.0.0/24 -j DNAT --to-destination 10.6.0.1     # Act as destination NAT from VPN to LAN (be the LAN-gateway for the VPN)
iptables -t filter -A FORWARD -s 10.6.0.0/24 -d 10.20.0.0/24 -j ACCEPT              # Accept traffic from VPN to LAN
iptables -t nat -A POSTROUTING -s 10.6.0.0/24 -d 10.20.0.0/24 -j MASQUERADE         # Mask traffic from VPN to LAN for responses

這將使 VPN 設備可以從 LAN 中使用(需要幫助!)

# Direction: LAN -> VPN -------------------------------------------------------------
iptables -t filter -A FORWARD -s 10.20.0.0/24 -d 10.6.0.0/24 -j ACCEPT              # Accept traffic from LAN to VPN
iptables -t nat -A POSTROUTING -s 10.20.0.0/24 -d 10.6.0.0/24 -j MASQUERADE         # Mask traffic from LAN to VPN for responses

目前的發現:

通過查看這些規則,我可能在下部錯過了另一個 DNAT/SNAT,但我仍然無法弄清楚……

VPN 介面上的介面計數器顯示,ping 被發送到 VPN 客戶端並返回!所以問題似乎是到達的 VPN 數據包要被轉換並轉發到 LAN。

如果需要更多資訊,請詢問:) 感謝您的寶貴時間!

問題已解決

正如@MichaelHampton 上面正確評論的那樣,在這種情況下不需要NAT。整個任務僅僅是正確路由的問題,而不是 NAT-ing。

問題的根源

為了讓客戶端能夠連接到 LAN ( 10.20.0.0/24),您必須將此子網添加到AllowedIPs伺服器配置中的指令中才能被允許。

然而,這會自動為相應的子網設置一條新路由,覆蓋原始路由。結果:您的伺服器無法再訪問 LAN 子網中的主機,這導致所有連接嘗試都失敗:

     Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
-ok-> 10.6.0.0        0.0.0.0         255.255.255.0   U     0      0        0 wg0
-!!-> 10.20.0.0       0.0.0.0         255.255.255.0   U     0      0        0 wg0
-ok-> 10.20.0.0       0.0.0.0         255.255.255.0   U     303    0        0 wlan0

由於此路由的度量為 0(低於下面預設路由的度量),因此該路由將始終是首選,並且無法嘗試連接到 LAN。

永久決議

就我而言,我只是在我的/etc/wireguard/wg0.conf:

PostUp = route del -net 10.20.0.0/24 dev wg0

這刪除了每次wireguard重新啟動時將創建的路由。這需要對所有不是 VPN 子網的子網進行,並且不應被覆蓋。

**編輯:**您可以添加Table=off到您的/etc/wireguard/wg0.conf和 WireGuard 將停止弄亂您的路由表 :)


總而言之,這是一次相當傷腦筋的經歷。我很確定會編寫一個腳本來處理這些事情,使 WireGuard 更加“即插即用”:)

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