嘗試從客戶端到客戶端而不是客戶端到伺服器進行通信時,wireguard“需要目標地址”
我有一個簡單的wireguard 網路,由一個“伺服器”(唯一具有外部可路由IP 地址的設備)和兩個客戶端組成。伺服器和客戶端之間的通信似乎工作得很好:從伺服器,我可以使用它們的線保護地址訪問客戶端,並且我可以訪問客戶端“後面”的地址。同樣,我可以從客戶端訪問伺服器的wireguard 地址。
不起作用的是客戶端到客戶端的通信。如果我從一個客戶端嘗試
ping
使用其wireguard ip地址到另一個客戶端,則ping
失敗並顯示:From 192.168.64.10 icmp_seq=1 Destination Host Unreachable ping: sendmsg: Destination address required
此外,該
ping
嘗試不會導致客戶端和伺服器之間的任何 UDP 流量。我在下麵包含了我的wireguard配置。
VPN 節點
在所有節點上:
net.ipv4.ip_forward
是1
FORWARD
餐桌上沒有限制- 我不用來
wg-quick
調出vpn。我正在使用包含在這篇文章底部的 shell 腳本。伺服器
# ip addr show wg0 39: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.168.64.1/24 scope global wg0 valid_lft forever preferred_lft forever
# ip route show | grep wg0 10.0.0.0/8 dev wg0 scope link 192.168.1.0/24 dev wg0 scope link 192.168.11.0/24 dev wg0 scope link 192.168.13.0/24 dev wg0 scope link 192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.1
[Interface] PrivateKey = <secret key> ListenPort = 50001 [Peer] PublicKey = 1cML7... AllowedIps = 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32 PersistentKeepalive = 30 [Peer] PublicKey = mRjd9... AllowedIps = 10.0.0.0/8, 192.168.64.11/32 PersistentKeepalive = 30
客戶 1
# ip addr show wg0 33: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.168.64.10/24 scope global wg0 valid_lft forever preferred_lft forever
# ip route | grep wg0 10.0.0.0/8 dev wg0 scope link 192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.10
[Interface] PrivateKey = <secret key> ListenPort = 50001 [Peer] PublicKey = 2VtQ/... Endpoint = wg.example.com:50001 AllowedIps = 0.0.0.0/0, 192.168.64.1/32 PersistentKeepalive = 30 [Peer] PublicKey = mRjd9... AllowedIps = 10.0.0.0/8, 192.168.64.11/32 PersistentKeepalive = 30
客戶 2
# ip addr show wg0 11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.168.64.11/24 scope global wg0 valid_lft forever preferred_lft forever
# ip route show | grep wg0 192.168.1.0/24 dev wg0 scope link 192.168.11.0/24 dev wg0 scope link 192.168.13.0/24 dev wg0 scope link 192.168.64.0/24 dev wg0 proto kernel scope link src 192.168.64.11
[Interface] PrivateKey = <secret key> ListenPort = 50001 [Peer] PublicKey = 2VtQ/... Endpoint = wg.example.com:50001 AllowedIps = 0.0.0.0/0, 192.168.64.1/32 PersistentKeepalive = 30 [Peer] PublicKey = 1cML7... AllowedIps = 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32 PersistentKeepalive = 30
介面配置腳本
節點上的
wg0
介面使用以下腳本配置:#!/bin/sh dev=$1 addr=$2 ip link add $dev type wireguard ip addr add $addr dev $dev wg setconf $dev /etc/wireguard/$dev.conf ip link set $dev up
讓我們看看會發生什麼:
- Client1的路由表告訴它 192.168.64.11 可以通過wg0到達。
- Client1的wg0 加密 密鑰路由設置告訴 192.168.64.11 可以通過第二個對等點(密鑰以 開頭
mRjd9
)又名Client2訪問。- 有效負載已準備好通過隧道傳輸到第二個對等點的目前端點……除了沒有
Endpoint
定義到達第二個對等點並且因為從未在另一個方向接收到流量(出於同樣的原因)沒有端點存在。這與Server不同,它在從**Client1接收到第一個數據包時會將目前Client1的源地址設置為端點。從Client2到Client1的另一個方向也是如此:沒有
Endpoint
定義,也沒有收到流量來設置端點。所以隧道目前不完整,失敗了。發生這種情況時, wireguard 會發送所需的錯誤
EDESTADDRREQ
/目標地址。僅僅因為很難指定另一面是什麼,並不意味著省略它會神奇地使它起作用。由於兩者都是經過 NAT 的,因此您會在兩個經過 NAT 的設備之間遇到常見的 NAT 連接問題。
要解決此問題,您可以:
- 使用Server作為類似 STUN 的伺服器(甚至可能執行一個實際的 STUN 伺服器,但在隧道之外)以同步Client1和Client2的方法,以嘗試使用 WireGuard 隧道進行UDP 打孔,假設沒有對稱 NAT或CG NAT在方式。正確執行此操作超出了此 WireGuard 問題的範圍,但這應該是避免所有流量都需要伺服器的好處。
請注意,一旦定義了兩個對等點,每個對等點都使用
0.0.0.0/0
inAllowedIps
的值,在每個客戶端上使用 in 就毫無意義AllowedIps
。0.0.0.0/0
最終將從加密密鑰路由中默默丟棄,不應使用。一個 IP 地址可以解析(即:被加密密鑰路由)到一個對等點(或沒有一個),但不能超過一個。
或者,正如它在 OP 中顯示的那樣,通過Server中繼流量,這需要在其wg0介面上將**Server設置為路由器(用於入口和出口)並更改Client1和Client2上的配置。沒有“動態加密密鑰路由”協議,必須手動或使用兩個客戶端上的腳本進行更改(直到出現一些能夠為 WireGuard 執行此操作的路由守護程序)。例如(這裡只使用而不是明確說明所有路由就可以了,現在只有一個實際的 Peer):
0.0.0.0/0
- 客戶1
[Interface] PrivateKey = <secret key> ListenPort = 50001 [Peer] PublicKey = 2VtQ/... Endpoint = wg.example.com:50001 AllowedIps = 192.168.64.1/32, 10.0.0.0/8, 192.168.64.11/32 PersistentKeepalive = 30
下面的部分變得無用:Client1永遠不會有Client2作為對等方,只有Server。但它仍然可以保留在配置中:
[Peer] PublicKey = mRjd9... AllowedIps = PersistentKeepalive = 30
- 客戶2
[Interface] PrivateKey = <secret key> ListenPort = 50001 [Peer] PublicKey = 2VtQ/... Endpoint = wg.example.com:50001 AllowedIps = 192.168.64.1/32, 192.168.1.0/24, 192.168.11.0/24, 192.168.13.0/24, 192.168.64.10/32 PersistentKeepalive = 30 [Peer] PublicKey = 1cML7... AllowedIps = PersistentKeepalive = 30