我想设置 Wireguard,以便只通过隧道路由特定进程(如 qBittorrent),而其他进程默认使用物理接口。由于我的 VPN 提供商似乎只有在allowed-ips
设置为时才有效0.0.0.0/0
,因此我决定使用命名空间内的 Wireguard 接口这例子。
我的初始设置脚本如下所示:
ip netns add tunnel0
ip link add wg0 type wireguard
ip link set wg0 netns tunnel0
ip netns exec tunnel0 wg set wg0 \
private-key /etc/wireguard/wg0_privkey \
peer <public_key> \
endpoint x.x.x.x:51820 \
allowed-ips 10.64.0.0/16,0.0.0.0/0
ip netns exec tunnel0 ip addr add 10.64.189.228/32 dev wg0
ip netns exec tunnel0 ip link set mtu 1420 up dev wg0
ip netns exec tunnel0 ip route add default dev wg0
这导致我的设置看起来类似这样的。
正如标题所示,我想vpn0
在我的主机上创建一个接口 ( ),该接口与命名空间内的 Wireguard 接口 ( wg0
)桥接tunnel0
,这样我就可以在 qBittorrent 等应用程序中选择该接口,而无需通过隧道路由任何其他进程。我的设置看起来如下类似这样的。
我曾在某处读到过我需要使用类似 VXLAN 的东西,但是,由于我对 Linux 网络不是很有经验,所以我无法找到任何我想要具体实现的示例。
我这样做对吗,或者有没有更简单的解决方案?
答案1
由于我的 VPN 提供商似乎仅在将 allowed-ips 设置为 0.0.0.0/0 时才起作用,
是的,这对于 VPN 来说很正常,因为您使用隧道访问整个互联网,并且您还希望收到来自整个互联网的回复数据包。因此,隧道需要允许对等端代表整个互联网。
这并不意味着必须使用命名空间。wg0
接口上的 AllowedIPs 设置可用作过滤器,但才不是实际上通过该接口抓取并路由所有 IP 流量。它更像是防火墙规则。¹
简而言之,您只需进行完全相同的wg0
配置即可没有命名空间,那么您就不需要桥接任何东西,因为这里已经有了接口。
但是,不要通过 wg0 创建全局默认路由,而是使用 将其放入不同的路由表中,并且仅当程序尝试将 VPN 地址绑定到“源”地址时,才ip -4 route add default dev wg0 table 3
使用“策略路由”规则来选择该表。ip -4 rule add
¹ (只有同名的wg-quick设置还会为所有允许的前缀创建 IP 路由,从而为您提供您不想要的通过 VPN 的默认路由。但由于您没有使用 wg-quick 来创建隧道,因此这不会对您造成影响 - 即使您使用它,wg-quick 也可以选择将路由放在不同的路由表中,或者根本不创建它们。)