基于每个应用程序的路由

基于每个应用程序的路由

我在 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>

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

相关内容