WireGuard 双重 VPN:仅转发 WireGuard 流量

WireGuard 双重 VPN:仅转发 WireGuard 流量

目标:VPN 链

我正在尝试实现 VPN 链。第一台服务器是我自己的 VPS,而第二台服务器来自穆瓦德 VPN。我将 VPS 用于多种用途,并且只想重定向 WireGuard 流量。所有剩余流量都不应通过 Mullvad。

您的设备 <---> VPN 服务器 1 <---> VPN 服务器 2 <---> 互联网

客户端到 VPN 服务器 1

客户端和我的 VPS 之间的连接已经正常。这是服务器的 WireGuard 配置文件 ( wg0.conf):

[Interface]
PrivateKey = ********************************************
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = ********************************************
AllowedIPs = 10.0.0.2/32

这是客户端配置文件。所有客户端流量都通过 VPN。

[Interface]
Address = 10.0.0.2/32
ListenPort = 51820
PrivateKey = ********************************************

[Peer]
PublicKey = ********************************************
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = ***.***.***.***:51820

VPN 服务器 1 到 VPN 服务器 2 (Mullvad)

这是 Mullvad 配置文件 ( wg1.conf)。问题是,它通过 Mullvad 隧道传输所有服务器流量。

[Interface]
PrivateKey = ********************************************
Address = 10.67.221.119/32,fc00:bbbb:bbbb:bb01::4:dd76/128
DNS = 100.64.0.7
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = ********************************************
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = ***.***.***.***:51820

我想,我正在寻找一种方法来仅将流量从 路由wg0wg1。所有剩余流量都应排除。

答案1

可以使用所谓的source based routing/ policy based routing

简而言之,您需要在上创建第二个路由表Server 1,并将其设置Server 2为默认网关。

我假设您正在服务器上运行 Linux 发行版并使用该iproute2软件包。

在这种情况下,您将拥有该文件/etc/iproute2/rt_tables

该文件的内容类似于以下内容:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

该文件与命令相关:ip rules show,可以提供如下输出:

lasse@vps3:~$ ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

规则前面的数字表示优先级。数字越小,规则就越重要。

该表local包含直接连接到服务器的所有子网的列表。

因此,按照字面逻辑,ip rule show它的意思是:

   “无论包裹来自哪里:

  •     首先检查目标地址是否为local地址(即直接连接到服务器)。

  •     第二个是路由表中列出的目标子网 main

  •     如果一切都失败,请检查default路由表(即使用默认网关)。

换句话说,我们根据以下因素来决定 IP 包的去向:目标地址ip 包。

请注意,虽然我看到默认路由被添加到主路由表中,但实际上不应该,因为该规则属于路由default表。原因将在下文中说明。

--

与此相反,我们有source based routing(也称为policy based routing)。

在这里,我们根据 IP 包的位置来决定包要去哪里起源

幸运的是,实现起来并不难。

我们/etc/iproute2/rt_tables需要添加另一个条目,例如:

200     vpn

然后我们可以ip rule使用以下命令调用:

ip rule add from all to 0.0.0.0/0 iif wg0 lookup vpn

此命令的作用是告诉Server 1它必须对vpn使用入站接口wg0并前往任何其他地方的所有流量使用路由表。

该命令ip rule show现在应该显示:

lasse@vps3:~$ ip rule show
0:      from all lookup local
32765:  from all to 0.0.0.0/0 iif wg0 lookup vpn
32766:  from all lookup main
32767:  from all lookup default

但是vpn路由表是空的,所以我们不知道如何转发数据包。因此,让我们这样做。

如果我们假设 Mulvad 网关的 VPN IP 是,10.67.221.1那么您只需要调用命令

ip route add default via 10.67.221.1 table vpn

基本上就是这样,因为任何从客户端到互联网的包都将与vpn表进行匹配,而任何来自 Mulvad 连接的 IP 包都将与路由表进行local匹配main

然而:

如果您想使用 VPN 连接来连接到后面的网络,Your device您将需要向vpn路由表添加静态路由,并且很可能还需要向main路由表添加相同的规则。

语法很简单,因为它只是对ip route add命令进行了轻微的扩展。实际上,您只需要table vpn在语句末尾添加即可将其添加到 VPN 路由表,table main如果您想将其添加到主路由表。

add default例如,请参见上面的我的路线。

我希望这能帮助您入门。

相关内容