仅支持 IPv6 且无 NAT 的 WireGuard VPN

仅支持 IPv6 且无 NAT 的 WireGuard VPN

目标

我正在尝试设置仅支持 IPv6 的 WireGuard VPN,我 (a) 希望通过它路由所有流量,并且 (b) 使用可从互联网访问的服务器。由于我甚至无法让 (a) 工作,所以我只会尝试让它工作,(b) 仅供参考。

我有一个 VPS,具有全局可路由的 IPv6,2a03:4000:xx:xx:18d7:b1ef:fe48:7d35/64(这就是ip a告诉我的)在eth0。我将使用主机名 来引用它vps。出于测试目的,服务器没有防火墙,并且net.ipv6.conf.all.forwarding=1net.ipv6.conf.all.accept_ra=2

然后,我的设备也开启了,它也有一个 IPv6 地址2001:1715:yy:yy:db2d:ab24:ed3f:39d4/64wlan0这应该不是相关信息,因为当我在另一个 WLAN 上时,这个地址会改变)。它带有主机名laptop

我希望得到这样的结果:

Internet <-> vps <-> laptop

对于 IPv4,我会使用 NAT,但在 IPv6 世界中,不建议使用 NAT。很难找出替代方法,但如果我读得没错,那么我应该从2a03:4000:xx:xx::/64VPS 获得的块中为笔记本电脑提供另一个 IP 地址。

设置

所以我写了这两个 wireguard 配置:

VPS:

[Interface]
Address = fc01::1/128 # Shouldn't really matter?
ListenPort = 1935 # This port is open to UDP on most networks
PrivateKey = uLxxxxxxxxxxxxxxxxxxxxxxxxEQ=

[Peer]
# laptop
PublicKey = swxxxxxxxxxxxxxxxxxxxxxxxxxmQ=
AllowedIPs = 2a03:4000:xx:xx:ffff::3/128 # Is inside the vps' /64 block

笔记本电脑:

[Interface]
Address = 2a03:4000:xx:xx:ffff::3/128 # The globally routable IP addr of my laptop via the vps
ListenPort = 1935
PrivateKey = yMxxxxxxxxxxxxxxxxxxxxxxxxxxxxm8=

[Peer]
PublicKey = pCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzs=
AllowedIPs = ::/0 # Route all traffic through this peer
Endpoint = [2a03:4000:xx:xx:18d7:b1ef:fe48:7d35]:1935

我提出这些观点:

[root@vps ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add fc01::1/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -6 route add 2a03:4000:xx:xx:ffff::3/128 dev wg0

[root@laptop ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n

... 而且它不起作用。

WireGuard 似乎无法成功连接。笔记本电脑显示已连接并计算发送流量(但接收流量为 0B),但 VPS 未显示连接。

如何正确设置仅支持 IPv6 的 WireGuard VPN?如果正确,为什么从一端发送的流量没有到达隧道的另一端?

如果更多信息(pcaps、ip输出等)有用,我会很乐意修改这个问题。

答案1

这不起作用,因为你的服务器网关假设整个 /64 是“在线”,也就是说,每个地址都可以在同一个以太网段上直接访问 - 因此网关会对您的笔记本电脑的 MAC 地址进行邻居发现查询,但不会收到任何回复,因为笔记本电脑根本不在同一个链接上。

(通常,服务器不会代表路由到其他地方的地址做出响应 - 它仅回复直接分配给其自己的 eth0 接口的地址。)

为了使此功能与在线地址配合使用,您需要使用“代理 NDP”,即实际使服务器代表笔记本电脑提供 NDP 答复(以及您尝试通过隧道路由的任何其他地址)。

对于 IPv6 来说,最可靠的方法是在 eth0 上运行ndpresponder守护进程。它将监听邻居请求数据包并发送正确的邻居通告。

(同样,你可以使用ndppd或甚至内核的内置proxy_ndp功能,但它们的行为轻微地与真正的 NDP 回复不同,有时不会通过某些 VPS 托管运营商进行的反欺骗检查。)

不过,理想情况下,托管公司应该为您提供路由字首– 数据中心网关明确配置为“通过”服务器的主地址路由所有内容。这对他们来说也略有好处,因为单个静态路由比许多动态邻居缓存条目更有效。

(不幸的是,许多服务器托管公司内部使用某个 VPS 管理平台,阻止他们提供路由前缀 - 我听说这是 SolusVM 的错误,它坚持使用“平面链路 /48”模型。)


注意:这绝不是 IPv6 特有的 - IPv4 中也存在“on-link”和“routed”之间的相同区别,唯一的区别是 IPv4 使用 ARP 而不是 NDP。(例如,如果您的服务器位于 eth0 上的 192.168.1.0/24 中,并且您想将 192.168.1.7 路由到 VPN 客户端,那么您会遇到完全相同的问题,并且需要代理 ARP 来解决这个问题。)

相关内容