几天来我一直在努力思考这个问题,所以我画了一幅图(在帖子的底部)。
语境
我有一个具有两个命名空间的 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 等。