我有一个简单的 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_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
答案1
让我们看看发生了什么:
- 客户端1的路由表告诉它 192.168.64.11 可以通过WG0。
- 客户端1的WG0 密钥路由设置表明 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