我在我的Ubuntu Linux工作站(Astrill)上使用专有的VPN客户端,它支持几种类型的VPN.其中一种VPN类型是OpenVPN,它在连接时创建虚拟接口tun0.
令我感到困惑的是,当我在客户端选择OpenVPN时,我可以选择仅通过VPN路由来自计算机上某些应用程序的流量,而来自其他应用程序的流量不使用VPN并通过物理离开我的计算机接口.
我想我有点理解Linux中的路由是如何工作的,但是我无法看到/理解这个VPN客户端如何管理每个应用程序的不同流量.
当我启用此每应用程序路由时,我可以看到客户端将以下条目添加到路由表中,但没有其他内容:
198.18.32.0/21 dev tun0 proto kernel scope link metric 950
没有一个IPTables规则,因此不是通过IPTables完成的.
有人知道它可能会这样做吗?
解决方法:
通过在Linux上设置NameSpaces可以实现这一点,您可以拥有不同的进程来拥有不同的网络或路由.
例如,要创建名为test的新命名空间:
ip netns添加测试
要分配网络接口(或隧道接口):
ip link set tun0 netns test
A network interface can just be active in one namespace at a time.
要在该命名空间中执行程序,您可以执行以下操作:
ip netns exec test<命令对该命名空间运行>
more info on ip net-ns
more info on namespace