如何在具有公共互联网访问的网络命名空间内路由 Wireguard?

如何在具有公共互联网访问的网络命名空间内路由 Wireguard?

几天来我一直在努力思考这个问题,所以我画了一幅图(在帖子的底部)。

语境

我有一个具有两个命名空间的 VPS:

  • 初始化命名空间(根)
  • 自定义命名空间(我的酷命名空间)

作为一个思想实验,我希望只有通过 Wireguard(托管在 中my cool namespace)连接的应用程序才能访问 10.0.0.0/16 子网上的应用程序,而出站请求则在子网外仍然能够访问公共互联网。

例如:

  • WG 客户端 1 ping 10.0.0.1:8000 -> 应用程序加载
  • WG 客户端 1 ping 1.1.1.1 -> 应用程序加载

我正在做的工作

首先我应该说,我正在使用wg-quick,在尝试破译所有路由表后,我认为它在网络命名空间内存在一些固有的怪异性,但还是继续吧。

  • 我添加了 iptables dnat 规则,将 eth0 上的 UDP 流量 + WG 端口转发到我的 veth 对。这似乎让连接的对等方能够访问托管在命名空间中的应用程序。但是,我无法从客户端(或服务器)ping 外部世界。
  • 如果我删除该wg0接口(wg-quick down),我就能再次 ping 外面的世界。

这告诉我这肯定是一个路由表问题,很可能是默认路由表和 wg-quick 构建的 wireguard 路由之间的默认路由发生冲突。

我希望有人可以简化我的整体思维模型,即数据包应该流向何处、重定向到何处以及执行此操作时应该考虑的 IPtables 规则。

由于我正在学习,所以我想保留这个带有 veth 对的设置,而不引入任何桥梁、tun/taps 等。

在此处输入图片描述

相关内容