我正在尝试使用 Wireguard 在两个 Linux 机器之间建立一个“简单”的 VPN。不幸的是,我发现现有的教程没有那么有用,因为它们通常 A) 仅设置 IPv4,B) 通常使用 IP 伪装...
机器A的配置:
[Interface]
Address = 192.168.10.2/24
ListenPort = 51820
[Peer]
AllowedIPs = 192.168.10.0/24, 172.16.0.0/24, fdbb:bbbb:bbbb::/48, 2001:db8:bbbb:0000::/64
Endpoint = [2001:db8:bbbb:0000:1234:56ff:fe78:90ab]:51820
PersistentKeepalive = 20
机器B的配置:
[Interface]
Address = 192.168.10.1/24
ListenPort = 51820
[Peer]
AllowedIPs = 192.168.10.2/32, 10.0.0.0/16, fdaa:aaaa:aaaa::/48, 2001:db8:aaaa:0000::/64
Endpoint = [2001:db8:aaaa:0000:ba09:87ff:fe65:4321]:51820
PersistentKeepalive = 20
(省略钥匙,因为隧道本身正在通过交通,所以我知道这些是正确的)。所以,理论上来说,配置很简单。机器 A 没有本地防火墙(只有一个典型的内置防火墙的消费者路由器,打开 UDP/51820),机器 B 有 ip(6) 表,但仅适用于所有 Docker 规则,默认策略设置为接受。
两台机器都有net.ipv4.ip_forward=1
和net.ipv6.conf.all.forwarding=2
。
该配置不起作用,因为 Wireguard 显然尝试路由自己的wireguard流量通过隧道本身,因为端点 IPv6 包含在AllowedIPs 网络中。为什么默认情况下不排除...
我尝试通过添加固定路由来通过普通接口(而不是 wg0)发送该端点的流量来解决这个问题:
PostUp = /usr/sbin/ip -6 route add 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0
PreDown = /usr/sbin/ip -6 route del 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0
通过该设置(在双方),对等方可以 A) 通过 WG 对等方地址 (192.168.10.X) 互相 ping 通,B) 通过其本地 IPv4(10.0.XX 或 172.16.XX),以及 C) 通过其本地 IPv4(10.0.XX 或 172.16.XX)互相 ping 通。 ULA 地址。
但是,我的隧道仍然存在两个问题:
A) 因为我必须添加到端点的 IPv6 路由,这意味着到另一个对等点的公共 IPv6 地址的流量不会通过 WG 隧道,而是直接通过 Internet 传输。对等方无法使用其公共 GUA IPv6 地址互相 ping 通。我需要类似使用 PostUp 参数添加的 IP 路由,但它仅适用于隧道本身,不适用于通过隧道的流量。就像 IPv6 路由一样,我可以说“通过该路由路由 UDP/51820(直接到互联网),但通过该路由 (wg0) 将其他流量发送到同一 IP”。
B) 我无法从网络中的其他计算机(通过 IPv4)获得所有功能。在网络 A 的另一台机器上,我添加了一条到另一个网络的 IPv4 的静态路由:172.16.0.0/24 via 10.0.1.25 dev enp7s0 metric 100
。
当我现在进行跟踪路由时,第一跳是wireguard机器(10.0.1.25),第二跳是远程机器的WG对等方的地址(192.168.10.1)(因此它确实穿过隧道!),但是之后,繁荣,就是这样。没有与实际目的地的第三跳(即使另一侧的默认网关确实有一个静态路由将 10.0.0.0/8 路由到该侧的wireguard 机器。我不想进行 IP 伪装,这是我发现的多个“解决方案”我希望其他网络上的其他机器准确地看到请求来自哪里——隧道另一边的机器。
通过 IPv6,使用 ULA,一切都很好。在网关上添加 IPv6 路由,将对方的 ULA 路由到wireguard 机器,然后完成。我只需要为 GUA 找到一个解决方案,可能是使用 radvd 在 wireguard 机器上宣布到该网络的路由。
TL;DR:两个对等点之间的 Wireguard 连接可以正常工作,但是 A)如何通过隧道将非 Wireguard 流量发送到 Wireguard 端点 IP,以及 B)为什么 IPv6 ULA 路由可以工作,而 IPv4 路由却不能他们的设置是一样的。
答案1
我设法通过使用 IP 规则并在wireguard 配置中使用以下命令来使其正常工作:
PostUp = ip -6 rule add to 2001:db8:aaaa::ba09:87ff:fe65:4321/128 ipproto udp dport 51820 table 200
PostUp = ip -6 route add default via fe80::1 dev eth0 table 200
PreDown = ip -6 rule del lookup 200
PreDown = ip -6 route del default via fe80::1 dev eth0 table 200
这将添加一个完全独立的路由表200
,其中只有一个(默认)路由将所有流量发送到本地路由器,然后添加一条 IP 规则,以便根据该新路由处理端口 51820 上端点 IPv6 的任何 UDP 流量桌子。
这样,WG 隧道本身的 UDP 流量将发送至路由器,但具有相同目标 IP 的任何其他数据包将通过 WG 隧道。
然后我在隧道两侧添加了 radvd,宣布一条到另一侧 GUA 前缀的路由,以便网络中的设备将流量发送到wireguard 机器。