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

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

我正在嘗試讓一些 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 設定中沒有附加腳本)updown

然而,全部流量被路由到tun0接口,甚至是公共流量。結果是我即使使用內部網域名稱也可以存取遠端站點的資源,但是無法訪問Internet,因為 OpenVPN 子網路無法直接存取 Internet。

更改選項僅將此連接用於其網路上的資源ipv4.neverdefault在網路管理器 openvpn 配置中(與透過顯示的選項相對應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 終端用戶端一樣進行處理,我將很高興聽到您的想法。

謝謝,瓦倫丁

答案1

經過一些額外的「研究」(主要是試驗和錯誤),我能夠透過網路管理器成功連接到遠端站點,同時僅路由推送路由的流量使用推送的 DNS 伺服器。

  1. 將網路管理器中的 VPN 連線設定為neverdefault(如 OP 中已討論的):

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

  2. dns-search設定與遠端站台內部網域的連線:

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

此選項可讓網路管理員以某種方式再次新增 DNS 伺服器run/systemd/resolve/resolv.conf添加,不覆蓋),儘管處於ipv4.never-default活動狀態。

或者,<domainname>可以替換為~.,這將導致覆蓋run/systemd/resolve/resolv.conf,從而使推送的 DNS 伺服器成為唯一應答所有 dns 請求的伺服器。

答案2

謝謝@瓦倫丁!
您的解決方案非常正確!
在我的例子中,使用 Ubuntu 20.04 用戶端連接到 20.04 伺服器,也使用 gnome-network-manager openvpn 選項,不需要設定 dns-search - 只需設定 never-default 選項。
為了允許資料夾/網路 (samba) 連接,我還必須編輯伺服器上 smb.conf 檔案的「Networking」指令下的「interfaces」選項,如下所示

interfaces = 127.0.0.0/8 eth0
interfaces = 127.0.0.0/8 enp2s0
interfaces = X.X.X.X/XX enp2s0

最後一行新增了 XXXX/XX 是將由相同 openvpn 伺服器指派的 IP 位址範圍的 CIDR 表示法。

相關內容