我正在从 Ubuntu 16.04 连接到 OpenVPN 服务器,使用 OpenVPN 2.3.10 从命令行使用sudo openvpn --config client.conf
,或者作为服务使用sudo service openvpn@client start
。
我希望生成的连接被用作最低优先级,因此我尝试将其创建的默认路由的度量设置为 1000,但我不确定如何实现这一点。OpenVPN 手册状态:
--route-metric m
指定与 一起使用的默认度量 m--route
。
我希望添加route-metric 1000
到我的配置文件中会影响 OpenVPN 自动创建的默认路由,但是我必须假设它仅与选项一起使用--route
,并且所讨论的路由仍然具有 0 的度量:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 x.x.x.x 128.0.0.0 UG 0 0 0 tun0
我发现有三种方法可以解决这个问题。我该如何实现其中一种呢?
选项1:告诉 OpenVPN 在创建默认路由时使用不同的度量标准
选项 2:首先防止创建路线,然后使用 该选项提供的变量--route
创建我自己的路线(我认为)vpn_gateway
选项 3:使用选项修改默认路由--route
。这需要了解路由的所有参数,因此可能需要编写一些脚本。
答案1
看起来像选项 2;阻止创建默认路由,可以使用选项来实现route-nopull
。
--route-nopull
--client
与或一起使用时--pull
,接受服务器推送的选项,但路由、block-outside-dns 和 dhcp 选项(如 DNS 服务器)除外。在客户端上使用时,此选项可有效禁止服务器向客户端的路由表添加路由,但请注意,此选项仍允许服务器设置客户端的 TUN/TAP 接口的 TCP/IP 属性。
答案2
我正在尝试实现您提到的类似目标:我想使用代理服务器控制哪些应用程序使用 VPN(而不仅仅是 VPN)接口。
首先,请注意 openvpn 正在使用一种称为以下的肮脏黑客手段def1
:
# "redirect-gateway def1" with metric:
route 0.0.0.0 128.0.0.0 vpn_gateway 1200
route -n:
0.0.0.0 10.0.2.1 128.0.0.0 UG 1200 0 0 tap1
0.0.0.0 192.168.50.1 0.0.0.0 UG 0 0 0 wlp0s20f3
内核不会关心第一个路由度量,它只会单独采用第一个路由,因为它的 genmask (128.0.0.0) 比第二个路由的 genmask (0.0.0.0) 更严格。严格的 genmask 是 openvpn 使用指令强制其路由的方式def1
。
我的解决方案如下:
route 0.0.0.0 0.0.0.0 vpn_gateway 1200
route -n:
0.0.0.0 192.168.50.1 0.0.0.0 UG 0 0 0 wlp0s20f3
0.0.0.0 10.0.2.1 0.0.0.0 UG 1200 0 0 tap1
我没有使用route-nopull
其他东西,只是在每个客户端 openvpn 配置中使用了这个额外的路由指令。我没有尝试使用服务器配置来推送此路由,因为这取决于客户端可以为不同的 VPN 链接应用哪些指标。某些 VPN 链接可能对当前客户端具有优先权,因为它会更快。