如何与命名空间共享wireguard?

如何与命名空间共享wireguard?

wg0我有一个到 $DAYJOB 管理网络内受信任机器的wireguard 连接(接口名称)。通常,我不想使用 wg0全部我的流量,仅适用于 172.16.0.0/12 范围内的 IP 地址。这可以通过如下所示的节轻松完成/etc/wireguard/wg0.conf

[Peer]
# ...
AllowedIPs  = 172.16.0.0/12

但对于一个 Firefox 配置文件,我确实希望通过 wg0 路由所有内容,即使流量不是发往 172.16.0.0/12。此外,对于 DNS,我通常使用 dnscrypt-proxy + dnsmasq,但对于 wg0 流量,我想使用 $DAYJOB 的名称服务器。

我可以几乎ip netns通过使用veth对创建网络命名空间来匹配这些约束。在命名空间内,只需将默认的 resolv.conf 替换为包含备用名称服务器的 resolv.conf 即可。唯一的问题是我还没有完全弄清楚如何使用 wg0 作为唯一数据包离开命名空间的方式。

  • 使用非默认 DNS:✓
  • 来自命名空间、发往 172.16.0.0/12 的流量已通过 wg0 正确路由: ✓
  • 退出命名空间的所有其他流量也通过 wg0:✗

线卫有netns相关文档但似乎假设您仍然不需要命名空间之外的wireguard 接口。我确实希望命名空间之外的所有内容仍然可以访问wireguard 接口。

一些来源,例如1,建议使用 VLAN 进行类似的操作。但是,wireguard 接口似乎不支持 VLAN。发生的情况如下:

$ sudo ip link add link wg0 name wg0.4 type vlan id 4
$ sudo ip netns add ns-wg-test-1
$ sudo ip link set wg0.4 netns ns-wg-test-1
$ sudo ip netns exec ns-wg-test-1 su -c "/bin/bash -l" $USER
$ sudo ip addr add 192.168.126.2 dev wg0.4
$ sudo ip link set dev wg0.4 up
RTNETLINK answers: Cannot assign requested address

所以现在我在各种都有问题的替代方法之间犹豫不决。

可能性1:添加第二个wireguard接口。这将需要在/etc/wireguard/wg1.conf.目前还不清楚这是否可行或者是一个好主意。拥有多个wireguard接口和冗余配置似乎不太优雅。

可能性2:添加ip routeiptables -A规则的一些组合,以强制退出命名空间的所有内容都被引导到 wg0。然而,我还没有遇到任何示例或文档可以清楚地说明如何强制将从一个接口传入的所有流量路由通过另一个接口传出。再说一遍,我对这是否是一个好方法持一定程度的怀疑。

可能性3:对 Wireguard 文档有信心。将 wg0 放入命名空间内,并告诉命名空间外部的所有 172.16.0.0/12 流量通过连接到命名空间的 ve​​th 对进行。在命名空间内,可能有路由/防火墙规则将所有内容从 veth 对转发到 wg0。该解决方案的问题在于,即使它有效,它也要求命名空间始终处于活动状态。我希望发往 172.16.0.0/12 的流量始终能够找到通往 wg0 的路径,无论我今天早上是否记得激活命名空间。

所以问题是:与网络命名空间共享wireguard接口,同时仍然保留对命名空间之外的wireguard的访问的最佳或最规范的方法是什么?

这不是基于意见的。当我看到一个健壮、高效、安全且可编写脚本的工作示例时,我就会知道答案是正确的。它不需要跨平台。我仅在 Void Linux(有时是 Arch Linux)上执行此操作。

或者,如果整个企业不是一个好主意,或者由于某种原因不可能实现,那么否定的答案可能包括论证、证据和引文来解释原因。如果没有更好的结果,我仍然会将其标记为正确。

答案1

所以问题是:与网络命名空间共享wireguard接口,同时仍然保留对命名空间之外的wireguard的访问的最佳或最规范的方法是什么?

IMO,一个好的方法是使用基于策略的路由为了这。例如,“来自接口 A 的任何数据包都应使用路由表 B”,其中接口 A 是 netns 外部的 veth/bridge 接口,而路由表 B 仅包含通过您的wireguard 接口的路由(当然还有返回原始网络的路由)命名空间)。使用iproute2, 类似以下内容:

# echo "100 dayjob" >> /etc/iproute2/rt_tables
# ip route add <wireguard glue net> dev wg0 table dayjob
# ip route add default via <wireguard gw> dev wg0 table dayjob
# ip route add <netns net> dev <veth/bridge interface> table dayjob
# ip rule add iif <veth/bridge interface> lookup table dayjob

答案2

您的问题要求通过您的服务器路由 Firefox 流量。一种更简单的方法是将配置文件配置为使用 SOCKS 代理。

只需使用 ssh 连接到您的服务器ssh -D 1080 SERVERNAME

 -D [bind_address:]port
         [...] Currently the SOCKS4 and SOCKS5 protocols are supported, and ssh will
         act as a SOCKS server.

network.proxy.socks_remote_dns也可以在firefox中配置

相关内容