我有一个简单的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
让我们看看会发生什么:
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
下面的部分变得无用:Client1永远不会有Client2作为对等方,只有Server。但它仍然可以保留在配置中:
客户2