当尝试从客户端到客户端而不是客户端到服务器进行通信时,wireguard“需要目标地址”

当尝试从客户端到客户端而不是客户端到服务器进行通信时,wireguard“需要目标地址”

我有一个简单的 wireguard 网络,由一个“服务器”(唯一具有外部可路由 IP 地址的设备)和两个客户端组成。服务器和客户端之间的通信似乎运行良好:从服务器,我可以使用它们的 wireguard 地址访问客户端,并且可以访问客户端“后面”的地址。同样,从客户端,我可以访问服务器的 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

答案1

让我们看看发生了什么:

  • 客户端1的路由表告诉它 192.168.64.11 可以通过WG0
  • 客户端1WG0 密钥路由设置表明 192.168.64.11 可以通过第二个对等体 (使用以 开头的密钥mRjd9) 访问,又称客户端2
  • 有效载荷已准备好通过隧道传输到第二对等点的当前端点……但尚未Endpoint定义到达第二对等点,并且由于从未在另一个方向收到流量(出于同样的原因),因此不存在端点。这与服务器在收到第一个数据包时客户端1将设置当前客户端1的源地址作为端点。

同样的情况也发生在另一个方向客户端2客户端1:没有Endpoint定义并且没有接收到要设置端点的流量。

因此,隧道目前尚未完工,因此失败。电线保护发送错误EDESTADDRREQ/需要目的地地址当发生这种情况时。仅仅因为指定另一侧是什么更加困难,并不意味着省略它就能奇迹般地使其起作用。

由于两者都是 NATed,因此您会遇到两个 NAT 设备之间常见的 NAT 连接问题。

要解决此问题,您可以:

  • 使用服务器作为类似 STUN 的服务器(甚至可能运行实际的 STUN 服务器,但在隧道之外)来同步方法客户端1客户端2尝试UDP 打洞使用 WireGuard 隧道,假设没有对称 NAT或者CG网络地址转换这样做超出了 WireGuard 问题的范围,但应该这样做以避免需要服务器适用于所有流量。

  • 或者,正如 OP 中所述,通过以下方式中继流量服务器这需要设置服务器作为其上的路由器WG0接口(用于入口和出口)并更改配置客户端1客户端2。没有“动态加密密钥路由”协议,更改必须手动完成或使用两个客户端上的脚本完成(直到出现一些能够为 WireGuard 执行此操作的路由守护程序)。例如(这里只需使用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
      

      下面的部分变得无用:客户端1从来没有客户端2作为同辈,服务器。但仍然可以保留配置:

      [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
      

相关内容