Openvpn

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

  • September 24, 2021

我正在嘗試讓一些 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

使用network-manager-openvpn(1.8.12)和上述配置文件時問題開始。連接已建立,推送的 DNS 伺服器在 systemd-resolved中正確更新(即使在 openvpn 配置中沒有附加up和腳本)。down

但是,所有流量都會路由到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 

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 

2.DNS伺服器

ipv4.neverdefault=no具有覆蓋的網路管理器/run/systemd/resolve/resolv.conf

nameserver 172.**.***.**

網路管理器ipv4.neverdefault=yes不:

nameserver 192.168.***.**
nameserver ****:***:****:****::**

openvpn在終端中將 dns 伺服器添加到現有伺服器中,並添加由遠端 dns 伺服器提供的域名,如以下定義config.ovpn

nameserver 192.168.***.**
nameserver ****:***:****:****::**
nameserver 172.**.***.***
search <domainToResolveWithRemoteSiteDNS>

如果您知道可以在網路管理器中更改哪些選項以config.ovpn像 openvpn 終端客戶端那樣處理,我將很高興聽到您的想法。

謝謝,瓦倫丁

經過一些額外的“研究”(主要是反複試驗),我能夠通過網路管理器成功連接到遠端站點,同時僅路由推送路由的流量使用推送的 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>可以替換為~.將導致覆蓋的run/systemd/resolve/resolv.confDNS 伺服器,從而使推送的 DNS 伺服器成為唯一回答所有 dns 請求的伺服器。

引用自:https://serverfault.com/questions/1046720