进程组默认路由tun0,B默认路由tun1等

我有一个有N个隧道接口的tun1tun0tun1等等。

我想设置一些特定的进程组A ,它的缺省path(只有)指向tun0 。 同时,第二组进程B ,其默认(且仅)路由指向tun1 ,依此类推。 AB等不一定是POSIX意义上的“过程组” 理想情况下,configuration将提前build立,之后,任何进程都可以在启动时声明自己是AB的成员。 (如果只有以root身份运行的进程可以这样做,那也没问题。)

如果这些进程组中有任何一个进程将stream量从错误的通道接口或者真正的networking接口eth0发送出去,那么这是一个错误。 这也是一个错误,如果在同一个主机上的不相关进程曾经将stream量发送出任何隧道接口, 他们应该继续直接使用eth0

我有这样的印象,这可以完成“networking命名空间”,但我一直无法弄清楚如何; 我要求一步一步的指示。

这确实可以通过networking名称空间来完成。 假设您拥有以下所有信息(由隧道设备另一端的进程或控制器程序分配):

  • $namespace是networking命名$namespace的标签
  • $device将隧道设备分配给名称空间
  • $mtu隧道设备的MTU
  • $address分配给隧道设备的IP地址
  • $netmask将networking掩码分配给隧道设备
  • $broadcast地址分配给隧道设备
  • $gateway在命名空间内使用的默认网关
  • $dns_servers在名称空间内使用的DNS服务器列表

然后下面的伪shell脚本将设置命名空间:

 mkdir /etc/netns/$namespace for dns_server in $dns_servers { echo "nameserver $dns_server" >> /etc/netns/$namespace/resolv.conf } ip netns add $namespace ip link set dev $device netns $namesapce ip netns exec $namespace { ip link set dev lo up ip addr add dev $device local $address/$netmask broadcast $broadcast ip link set dev $device mtu $mtu up ip route add default via $gateway dev $device } 

再次把它撕下来,你就可以了

 kill $(ip netns pids $namespace) ip netns delete $namespace rm -rf /etc/netns/$namespace 

而要在命名空间内运行一个程序,只需使用ip netns exec

这个OpenVPN隧道机制的实际工作实现可以在这里find; 不幸的是,因为需要它,所以它必须被设置,上面变成1200行C.