![WireGuard 双重 VPN:仅转发 WireGuard 流量](https://linux22.com/image/781646/WireGuard%20%E5%8F%8C%E9%87%8D%20VPN%EF%BC%9A%E4%BB%85%E8%BD%AC%E5%8F%91%20WireGuard%20%E6%B5%81%E9%87%8F.png)
目标:VPN 链
我正在尝试实现 VPN 链。第一台服务器是我自己的 VPS,而第二台服务器来自穆瓦德 VPN。我将 VPS 用于多种用途,并且只想重定向 WireGuard 流量。所有剩余流量都不应通过 Mullvad。
客户端到 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
我想,我正在寻找一种方法来仅将流量从 路由wg0
到wg1
。所有剩余流量都应排除。
答案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
例如,请参见上面的我的路线。
我希望这能帮助您入门。