我在 Ubuntu 上运行 VPN 客户端,正在寻找有关如何排除肯定端口通过 VPN 客户端(OpenVPN)进行路由。
例如,如何排除端口 22 和 80 通过 VPN 路由?
我不是网络专家,但我知道这应该称为基于策略的路由,并且在 Linux 机器上是可行的。但是我找不到任何关于如何实现这一点的明确指导。
编辑:我找到了一个工作解决方案 这里。
在 Piotr P. Karwasz 的帮助下,以下内容仅在所需端口上排除通过 VPN 路由的流量(在此示例中,为运行 VPN 客户端的计算机的端口 22 和 80):
# run with sudo
ip rule add sport 22 table 128
ip rule add sport 80 table 128
ip route add table 128 to y.y.y.y/y dev ethX
ip route add table 128 default via z.z.z.z
其中 yyyy/y 应该是您的 [机器] 公共 IP 地址的子网,ethX 应该是您的 [机器] 公共以太网接口,zzzz 应该是默认网关。
例如:
ip rule add sport 22 table 128
ip rule add sport 80 table 128
ip route add table 128 to 172.16.9.0/24 dev eth0
ip route add table 128 default via 172.16.9.1
这些端口上的流量(特别是传出)将通过主界面[eth0
或任何相关界面]而不是VPN界面,这解决了上述链接中解释的以下问题:
这是一个经典问题:当您通过公共 IP 地址连接到 [机器] 时,返回的数据包将通过 VPN 路由。您需要强制将这些数据包路由到公共 eth 接口。
请注意ip rule add sport
(或dport
就此而言)需要iproute2
高于4.15
(否则会得到Error: argument "sport" is wrong: Failed to parse rule type
)的版本。
就我而言,我使用 Ubuntu 的 backports 频道来获取4.18
有效的版本:apt install iproute2/bionic-backports