Networking

連結 WireGuard 伺服器:可以從客戶端 ping 兩者,但無法訪問網際網路。IP路由問題?

  • October 21, 2021

我正在嘗試鍊式/雙跳 VPN 設置,其中所有客戶端流量在到達 Internet 之前都通過 2 個伺服器:

Client → Server1 → Server2 → Public Internet

所有對等點都位於這些私有地址塊上:10.103.213.0/24(IPv4) 和fd6f:9403:2887:9cd6:10:103:213:0/112(IPv6)。以下是對等點的配置和現有的 IPTables 規則。(請注意配置文件的名稱,以防萬一。)


伺服器 2 配置

文件:/etc/wireguard/wg0.conf

# Server2

[Interface]
PrivateKey = SERVER2_PRIVATE_KEY
Address = 10.103.213.2/24, fd6f:9403:2887:9cd6:10:103:213:2/112
ListenPort = 53701
SaveConfig = false

# CLIENTS

[Peer] # Server1
PublicKey = SERVER1_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
# ↓ to allow traffic from client (10.103.213.11/32) via Server1 (10.103.213.1/32), allow both
AllowedIPs = 10.103.213.0/24, fd6f:9403:2887:9cd6:10:103:213:0/112

防火牆配置。命令:

ufw allow 53701/udp comment 'WireGuard VPN'

iptables -A FORWARD -i wg0 -j ACCEPT &&
iptables -A FORWARD -o wg0 -j ACCEPT &&
ip6tables -A FORWARD -i wg0 -j ACCEPT &&
ip6tables -A FORWARD -o wg0 -j ACCEPT

iptables -t nat -A POSTROUTING -s 10.103.213.0/24 -o enp8s0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s fd6f:9403:2887:9cd6:10:103:213:0/112 -o enp8s0 -j MASQUERADE

伺服器 1 配置

文件:/etc/wireguard/wg0.conf

# Server1

[Interface]
PrivateKey = SERVER1_PRIVATE_KEY
Address = 10.103.213.1/24, fd6f:9403:2887:9cd6:10:103:213:1/112
ListenPort = 53701
SaveConfig = false

# CLIENTS

[Peer] # Server2
PublicKey = SERVER2_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
Endpoint = SERVER2_PUBLIC_IP:53701
AllowedIPs = 10.103.213.2/32, fd6f:9403:2887:9cd6:10:103:213:2/128
#PersistentKeepalive = 25

[Peer] # PC
PublicKey = CLIENT_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
AllowedIPs = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128

防火牆配置。命令:

ufw allow 53701/udp comment 'WireGuard VPN'

iptables -A FORWARD -i wg0 -j ACCEPT &&
iptables -A FORWARD -o wg0 -j ACCEPT &&
ip6tables -A FORWARD -i wg0 -j ACCEPT &&
ip6tables -A FORWARD -o wg0 -j ACCEPT

客戶端配置

# CLIENT: PC

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.103.213.11/24, fd6f:9403:2887:9cd6:10:103:213:11/112
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1

[Peer] # Server1
PublicKey = SERVER1_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Endpoint = SERVER1_PUBLIC_IP:53701
AllowedIPs = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

現在,就像我說的那樣,當所有對等方都啟用 VPN 時,我可以從專用 (WireGuard) 網路上的客戶端 ( ) ping Server1 ( 10.103.213.2) 和 Server2 ( ),但我無法訪問網際網路10.103.213.1``10.103.213.11

我知道我缺少一些急需的 IP 路由或 IPTables 規則,但儘管我試圖找到一個我能理解幾天的解決方案,但我沒有成功。我發現如果沒有真正閱讀有關 Linux 網路/防火牆的書,我幾乎沒有希望。

現在,我希望有人可以幫助我解決問題,並解釋我們在做什麼以及為什麼這樣做,這樣我就可以更好地理解並做筆記。

非常感謝你!


筆記:

  • 如果我錯過了任何有用的資訊,請詢問,我很樂意得到它。
  • 客戶端執行 macOS。Server1 和 Server2 執行 Debian 11 “Bullseye”。僅供參考,以防萬一。
  • Server1 和 Server2 已安裝 Unbound 並設置為本地 DNS 解析。這就是您DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1在客戶端配置中看到的原因。如果不是這樣,我會在那裡使用 CloudFlare 或 Google 的 IP。
  • #wireguard IRC 上有人建議我嘗試Table = 123[Interface]Server1 的 WireGuard 配置中添加。然後執行命令ip rule add iif wg0 table 123。那沒有用,我也不明白它應該做什麼(我無法理解手冊頁或技術細節)。
  • 從我的閱讀中,我得出的結論是iptablesufw可以一起使用——除了在使用時必須小心iptables-persistentnetfilter-persistent save即使在執行防火牆規則的命令後,您也需要執行ufw以在重新啟動時保持不變,即使 ufw status它們已經到位。如果由於某種原因您在保存之前重新啟動,請刪除 UFW 規則並再次添加它們,然後執行netfilter-persistent save.

Libera.Chat上#wireguardIRC 頻道的好心人幫助了我!

我的配置問題。如下:

  • Server1 的配置中的 Server2AllowedIPs僅包含 Server2 的 IP 地址。那不會允許“網際網路”。它需要是0.0.0.0/0, ::0/0
  • Server1 的 WireGuard 介面必須配置為將路由(對於 中的所有條目AllowedIPs)添加到自定義 IP 路由表(我們稱之為wireguard2x)而不是main表。然後添加一個 IP 策略規則,說明帶有輸入介面 (iif) 的流量wg0會轉到自定義表——這也意味著其他類型的流量按照慣例採用預設路由。

更正配置

伺服器 2 配置

文件:/etc/wireguard/wg0.conf

# Server2

[Interface]
PrivateKey = SERVER2_PRIVATE_KEY
Address = 10.103.213.2/24, fd6f:9403:2887:9cd6:10:103:213:2/112
ListenPort = 53701
SaveConfig = false

# CLIENTS

[Peer] # Server1
PublicKey = SERVER1_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
# ↓ to allow traffic from client (10.103.213.11/32) via Server1 (10.103.213.1/32), allow both
AllowedIPs = 10.103.213.0/24, fd6f:9403:2887:9cd6:10:103:213:0/112

防火牆配置。命令:

ufw allow 53701/udp comment 'WireGuard VPN'

iptables -A FORWARD -i wg0 -j ACCEPT &&
iptables -A FORWARD -o wg0 -j ACCEPT &&
ip6tables -A FORWARD -i wg0 -j ACCEPT &&
ip6tables -A FORWARD -o wg0 -j ACCEPT

iptables -t nat -A POSTROUTING -s 10.103.213.0/24 -o enp7s0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s fd6f:9403:2887:9cd6:10:103:213:0/112 -o enp7s0 -j MASQUERADE

伺服器 1 配置

文件:/etc/wireguard/wg0.conf

# Server1

[Interface]
PrivateKey = SERVER1_PRIVATE_KEY
Address = 10.103.213.1/32, fd6f:9403:2887:9cd6:10:103:213:1/128
ListenPort = 53701
Table = wireguard2x
# ↓ should only be set if resolvconf or openresolv is installed on the system, otherwise let the system use defaults
# ↓ is unncessary if local DNS resolution is set up
#DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1
SaveConfig = false

# CLIENTS

[Peer] # Server2
PublicKey = SERVER2_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
Endpoint = SERVER2_PUBLIC_IP:53701
AllowedIPs = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

[Peer] # PC
PublicKey = CLIENT_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
AllowedIPs = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128

防火牆配置。命令:

ufw allow 53701/udp comment 'WireGuard VPN'

iptables -A FORWARD -i wg0 -j ACCEPT &&
iptables -A FORWARD -o wg0 -j ACCEPT &&
ip6tables -A FORWARD -i wg0 -j ACCEPT &&
ip6tables -A FORWARD -o wg0 -j ACCEPT

echo 123 wireguard2x >> /etc/iproute2/rt_tables
ip rule add iif wg0 table wireguard2x

客戶端配置

# CLIENT: PC

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1

[Peer] # Server1
PublicKey = SERVER1_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Endpoint = SERVER1_PUBLIC_IP:53701
AllowedIPs = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

筆記:

  • 您可以使用以下命令查看目前生效的所有策略路由規則:ip rule listip rule

  • 查看路由表,例如,ip route show table wireguard2xip route list table wireguard2x.

  • 刷新路由記憶體:ip route flush cache

  • 進一步閱讀:Linux 高級路由和流量控制 (LARTC) HOWTO

  • 您可以監控客戶端的網路流量——如果在 Linux 上,使用sudo iptraf-ng; 在 macOS 上使用sudo iftop. (要在客戶端上執行。)

    • 由於太多的實時更改,我發現執行很難解析。所以有人建議我嘗試route get 192.0.2.0(顯示正在使用的界面,例如,interface: utun2)然後在 macOS 上執行ifconfig <interface>(例如, )。ifconfig utun2後者應顯示客戶端的私有(WireGuard 對等)IP 地址,例如,10.103.213.11確認流量正在通過 WG 介面路由。這並不多,但這是一個開始。
    • UDPATE: traceroute非常棒!例如,traceroute 8.8.8.8。(給 Chrispus Kamau 的帽子小費。)
  • curl ipinfo.io在啟用 VPN 的情況下檢查您的 IP 地址。(要在客戶端上執行。)

有關的:

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