我有一个带有N个隧道接口、tun0
、等的 Linux 机器tun1
。
我想进行设置,以便特定进程组A将其默认(且唯一)路由指向tun0
. 同时,第二组进程B的默认(也是唯一)路由指向tun1
,依此类推。A、B等不一定是 POSIX 意义上的“进程组”;理想情况下,配置将提前建立,之后,任何进程都可以在启动时声明自己是A或B或 ... 的成员。(如果只有运行 as 的进程root
可以这样做,那也没关系。)
如果这些进程组中的任何一个曾经将流量发送到错误的隧道接口或真正的网络接口,这就是一个错误eth0
。如果同一主机上的不相关进程曾经将流量发送到任何隧道接口,这也是一个错误;他们应该继续eth0
直接使用。
我的印象是这可以通过“网络名称空间”来完成,但我一直无法弄清楚如何;我要求分步说明。
这确实可以通过网络命名空间来完成。假设您拥有以下所有信息(由隧道设备另一端的进程或您的控制器程序分配):
$namespace
网络命名空间的标签$device
要分配给命名空间的隧道设备$mtu
隧道设备的 MTU$address
分配给隧道设备的 IP 地址$netmask
分配给隧道设备的网络掩码$broadcast
分配给隧道设备的广播地址$gateway
在命名空间内使用的默认网关$dns_servers
在命名空间内使用的 DNS 服务器列表然后下面的伪 shell 脚本将设置命名空间:
再把它拆掉,你做
要在命名空间内运行程序,只需使用
ip netns exec
.可以在此处找到此机制的 OpenVPN 隧道的实际工作实现;不幸的是,因为我需要它必须是setuid,所以上面变成了1200行C。