Ubuntu 20.04 Networkmanager OpenVPN:接受推送的 DNS 但不将所有流量路由到 tun 接口

Val*_*tin 5 openvpn networkmanager ubuntu-20.04

我正在尝试让一些 Ubuntu 20.04 客户端在工作,以连接到我们的新服务器提供商提供的新 OpenVPN 服务器。

目标是仅将某些流量路由到隧道中(相应的路由由 OpenVPN 服务器推送),并使客户端也使用 OpenVPN 服务器推送的 DNS 服务器。

这适用于开箱即用的 Windows 10 客户端和 OpenVPN GUI 2.5。它也可以使用openvpn(2.4.7) 来自终端,如下所示:sudo openvpn --config config.ovpn以及以下客户端配置文件config.ovpn

dev tun
tun-ipv6
persist-tun
persist-key
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
auth SHA256
tls-client
client
resolv-retry infinite
remote <ipadressOfProvider> <port> udp4
verify-x509-name "<name>" name
auth-user-pass
remote-cert-tls server
compress 
# The following is added only in the config for Ubuntu 20.04 
dhcp-option DOMAIN <domainToResolveWithRemoteSiteDNS>
script-security 2
up /etc/openvpn/update-systemd-resolved
up-restart
down /etc/openvpn/update-systemd-resolved
down-pre
Run Code Online (Sandbox Code Playgroud)

使用network-manager-openvpn(1.8.12) 和上述配置文件时出现问题。连接已建立,推送的 DNS 服务器在 systemd-resolved 中正确更新(即使没有openvpn 配置中的附加updown脚本)。

但是,所有流量都路由到tun0接口中,甚至是公共流量。结果是,即使使用内部域名,我也可以访问远程站点的资源,但无法访问互联网,因为 OpenVPN 子网无法直接访问互联网。

更改选项使用其网络上这方面只为资源在网络管理OpenVPN配置(与选项对应于ipv4.neverdefault通过显示nmcli c show config)解决路由问题:现在,只有关于推进路线交通引导到隧道。但是,它也会阻止推送的 DNS 服务器应用于/run/systemd/resolve/resolv.conf.

到目前为止,我还没有找到一个选项来接受推送的 DNS仅路由与网络管理器同时涉及推送路由的流量。

到目前为止,一些可能有趣的观察结果:

1. 路线

ipv4.neverdefault=no除了推送的路由之外,网络管理器还会创建具有较低度量的第二个默认网关:

$ ip route
default via 10.*.*.* dev tun0 proto static metric 50 
default via 192.168.***.** dev wlp3s0 proto dhcp metric 600 
10.*.*.*/24 dev tun0 proto kernel scope link src 10.*.*.* metric 50 
158.***.**.** via 192.168.***.** dev wlp3s0 proto static metric 600 
169.254.0.0/16 dev wlp3s0 scope link metric 1000 
172.**.***.*/24 via 10.*.*.* dev tun0 proto static metric 50 
192.168.*.*/24 via 10.*.*.* dev tun0 proto static metric 50 
192.168.*.*/24 via 10.*.*.* dev tun0 proto static metric 50 
192.168.***.*/24 dev wlp3s0 proto kernel scope link src 192.168.***.*** metric 600 
192.168.***.** dev wlp3s0 proto static scope link metric 600 
Run Code Online (Sandbox Code Playgroud)

ipv4.neverdefault=yes除了推送的路由之外,网络管理器不创建第二个默认网关(与上面相同,没有第一行)。

openvpn 除了推送的路由之外,在终端中不创建辅助默认网关:

default via 192.168.***.** dev wlp3s0 proto dhcp metric 600 
10.*.*.*/24 dev tun0 proto kernel scope link src 10.*.*.* 
169.254.0.0/16 dev wlp3s0 scope link metric 1000 
172.**.***.*/24 via 10.*.*.* dev tun0 
192.168.*.*/24 via 10.*.*.* dev tun0 
192.168.*.*/24 via 10.*.*.* dev tun0 
192.168.***.*/24 dev wlp3s0 proto kernel scope link src 192.168.***.*** metric 600 
Run Code Online (Sandbox Code Playgroud)

2.DNS服务器

网络管理器ipv4.neverdefault=no确实覆盖/run/systemd/resolve/resolv.conf

nameserver 172.**.***.**
Run Code Online (Sandbox Code Playgroud)

网络管理器ipv4.neverdefault=yes没有:

nameserver 192.168.***.**
nameserver ****:***:****:****::**
Run Code Online (Sandbox Code Playgroud)

openvpn在终端中,dns 服务器添加到现有服务器中,并添加远程 dns 服务器所服务的域名,如定义在config.ovpn

nameserver 192.168.***.**
nameserver ****:***:****:****::**
nameserver 172.**.***.***
search <domainToResolveWithRemoteSiteDNS>
Run Code Online (Sandbox Code Playgroud)

如果您有任何想法可以在网络管理器中更改哪些选项来处理config.ovpnopenvpn 终端客户端所做的处理,我将很高兴听到您的想法。

谢谢,瓦伦丁

Val*_*tin 5

经过一些额外的“研究”(主要是反复试验),我能够通过网络管理器成功连接到远程站点,同时只路由推送路由的流量使用推送的 dns 服务器。

  1. 将网络管理器中的 vpn 连接设置为neverdefault(如 OP 中已经讨论过的):

    nmcli c modify <connectionname> ipv4.never-default yes

  2. 设置与dns-search远程站点内部域的连接:

    nmcli c modify <connectionname> ipv4.dns-search <domainname>

尽管处于活动状态,但此选项使 networkmanager 以某种方式run/systemd/resolve/resolv.conf再次添加 DNS 服务器(添加,而不是覆盖)ipv4.never-default

或者,<domainname>可以替换为~.which 将导致覆盖,run/systemd/resolve/resolv.conf从而使推送的 DNS 服务器成为唯一响应所有 dns 请求的服务器。

  • 完毕。由于服务器故障设置的时间限制,之前无法执行此操作。 (2认同)