我正在尝试让一些 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 子网没有直接访问互联网的功能。
更改选项仅将此连接用于其网络上的资源ipv4.neverdefault
网络管理器中的 openvpn config(与通过 显示的选项相对应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 服务器。
在网络管理器中将 vpn 连接设置为
neverdefault
(如 OP 中所述):nmcli c modify <connectionname> ipv4.never-default yes
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
谢谢@Valentin!
您的解决方案非常准确!
在我使用 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 表示法。