基于每个应用程序的路由

rep*_*lay 8 linux routing

我在我的 Ubuntu Linux 工作站 (Astrill) 上使用专有 VPN 客户端,它支持多种类型的 VPN。其中一种 VPN 类型是 OpenVPN,它tun0在连接时创建一个虚拟接口。

让我感到困惑的是,当我在客户端选择 OpenVPN 时,我可以选择仅通过 VPN 路由来自我计算机上某些应用程序的流量,而来自其他应用程序的流量不使用 VPN 并通过物理离开我的计算机界面。

我想我有点了解 Linux 中的路由是如何工作的,但我无法看到/理解这个 VPN 客户端如何管理每个应用程序的不同流量。

当我启用此 per-application 路由时,我可以看到客户端将以下条目添加到路由表中,但没有其他内容:

198.18.32.0/21 dev tun0  proto kernel  scope link  metric 950
Run Code Online (Sandbox Code Playgroud)

没有单一的 IPTables 规则,所以它不是通过 IPTables 完成的。

有人知道它是如何做到的吗?

Ara*_*ash 3

通过在linux上设置NameSpaces你可以实现这一点,你可以让不同的进程拥有不同的网络或路由。
例如
要创建一个名为 test 的新命名空间:
ip netns add test

分配网络接口(或隧道接口):
ip link set tun0 netns test

网络接口一次只能在一个名称空间中处于活动状态。

要在该名称空间中执行程序,您可以这样做:
ip netns exec test <command to run against that namespace>

有关 ip net-ns 的更多信息
有关命名空间的更多信息