我在 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 完成的。
有人知道它是如何做到的吗?
答案1
通过在linux上设置NameSpaces你可以实现这一点,你可以让不同的进程拥有不同的网络或路由。
例如
要创建一个名为 test 的新命名空间:
ip netns add test
分配网络接口(或隧道接口):
ip link set tun0 netns test
网络接口一次只能在一个名称空间中处于活动状态。
要在该名称空间中执行程序,您可以这样做:
ip netns exec test <command to run against that namespace>