因此,我将一台计算机设置为服务器,将所有其他计算机设置为对等计算机。以下是服务器配置:
[Interface]
Address = 10.0.0.1/16
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp6s0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp6s0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <key>
# ... more peers that work fine ...
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.55.2
以下是导致问题的新对等体的配置:
[Interface]
Address = 10.0.55.2
SaveConfig = false
ListenPort = 51820
PrivateKey = <key>
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.0/16
Endpoint = my.endpoint.com:51820
我只能连接到这个新的对等点后我从新对等点 ping 了服务器。在此之前,我只收到Destination Host Unreachable
消息。
我也尝试过仅使用 /24 地址,但没有任何改变。
有人知道发生了什么问题吗?
我想我可以添加一个 ping 命令作为PostUp
命令,但这似乎是一个糟糕的解决方案。
答案1
数据包最终会发送到目标主机的 MAC 地址。这要求目标主机的 MAC 地址位于发送主机的 ARP 表中,或者发送主机默认网关的 MAC 地址位于发送主机的 ARP 表中(用于非本地通信)。如果发送主机和目标主机位于同一第 3 层网络上,则发送主机将在本地网络上广播目标主机的 MAC 地址。如果发送主机和目标主机位于不同的第 3 层网络上,则发送主机将在本地网络上广播其配置的默认网关的 MAC 地址。当它收到回复时,它会将该 MAC 地址添加到其 ARP 表中。
在您从客户端发起与服务器的通信之前,客户端的 ARP 表中既没有服务器的 MAC 地址,也没有其默认网关的 MAC 地址......除非客户端已经与非本地主机通信。
我猜这就是导致问题的原因。客户端和服务器是否在同一个第 3 层网络上?我们无法判断,因为您在问题中省略了客户端的网络掩码。
答案2
我已经在家里的实验室测试了 WireGuard,发现了同样的问题。
我有两个路由器,一个是目标网络中的默认网关,另一个位于网关的 NAT 后面,带有 WireGuard 服务器。我甚至在默认网关中拥有到 WireGuard 网络的路由,并且从 WireGuard 客户端 ping 到目标网络上的每个主机(如您所说),我需要在目标主机上手动将路由添加到 WireGuard 网络。
终于成功了。
理论上,如果你的默认路由器也充当 WireGuard 服务器。它应该可以正常工作,但就我而言,我应该这样做。