Vpn

嘗試從客戶端到客戶端而不是客戶端到伺服器進行通信時,wireguard“需要目標地址”

  • October 12, 2020

我有一個簡單的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_forward1
  • 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到達。
  • Client1wg0 加密 密鑰路由設置告訴 192.168.64.11 可以通過第二個對等點(密鑰以 開頭mRjd9)又名Client2訪問。
  • 有效負載已準備好通過隧道傳輸到第二個對等點的目前端點……除了沒有Endpoint定義到達第二個對等點並且因為從未在另一個方向接收到流量(出於同樣的原因)沒有端點存在。這與Server不同,它在從**Client1接收到第一個數據包時會將目前Client1的源地址設置為端點。

從Client2Client1的另一個方向也是如此:沒有Endpoint定義,也沒有收到流量來設置端點。

所以隧道目前不完整,失敗了。發生這種情況時, wireguard 會發送所需的錯誤EDESTADDRREQ/目標地址。僅僅因為很難指定另一面是什麼,並不意味著省略它會神奇地使它起作用。

由於兩者都是經過 NAT 的,因此您會在兩個經過 NAT 的設備之間遇到常見的 NAT 連接問題。

要解決此問題,您可以:

  • 使用Server作為類似 STUN 的伺服器(甚至可能執行一個實際的 STUN 伺服器,但在隧道之外)以同步Client1Client2的方法,以嘗試使用 WireGuard 隧道進行UDP 打孔,假設沒有對稱 NATCG NAT在方式。正確執行此操作超出了此 WireGuard 問題的範圍,但這應該是避免所有流量都需要伺服器的好處。

請注意,一旦定義了兩個對等點,每個對等點都使用 0.0.0.0/0inAllowedIps的值,在每個客戶端上使用 in 就毫無意義AllowedIps0.0.0.0/0最終將從加密密鑰路由中默默丟棄,不應使用。一個 IP 地址可以解析(即:被加密密鑰路由)到一個對等點(或沒有一個),但不能超過一個。

  • 或者,正如它在 OP 中顯示的那樣,通過Server中繼流量,這需要在其wg0介面上將**Server設置為路由器(用於入口和出口)並更改Client1Client2上的配置。沒有“動態加密密鑰路由”協議,必須手動或使用兩個客戶端上的腳本進行更改(直到出現一些能夠為 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
    

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