我的 Linux 机器上有一个 wg-quick wireguard vpn。它使用 FwMark 路由技术,因此默认情况下所有数据包都通过 wireguard 接口发送。它还充当我本地网络的默认网关,因此也通过 VPN 转发所有网络数据包。
我也将 nftables 用于我的防火墙。
我正在尝试绕过特定用户“no_vpn”(uid 1003)的 wireguard 接口。
我尝试过几种方法,但都没有完全奏效。
利用 wireguards Fw 标记。
我发现由于 wireguard 使用 fw 来路由数据包,并且带有 fw 标记的数据包会被路由到默认接口,例如 eth0。
因此,我尝试将 fw 标记添加到来自用户“no_vpn”的所有数据包中。我尝试通过添加 nfttable 链来实现这一点,如下所示:
chain outbound_mangle {
type route hook output priority mangle; policy accept;
meta skuid 1003 meta mark set 0x76BA
}
但是,这并没有达到我想要的效果,在数据包路由到接口之前似乎没有添加标记。当我将日志添加到规则中时,在添加标记之前,输出接口已经设置为“wg0”。
自定义路由规则
我的第二次尝试是添加一个优先级比 wireguard 规则更高的路由规则。
规则如下:ip rule add uidrange 1003-1003 lookup main
当我查看数据包时,这似乎更幸运,出站数据包通过 eth0 路由,但是没有收到响应数据包。我的 nftables 允许所有接口上已建立和相关的数据包。
网络命名空间
我设置了一个网络命名空间,其中 macvlan 接口以桥接模式链接到 eth0。当在其中执行命令时,这可以绕过 VPN。但是,macvlan 无法访问主机命名空间,而我的本地 DNS 服务器位于那里。所以我无法解析 DNS。
绕过/拆分隧道的Wireguard VPN的最佳方法是什么?