连接到OpenVPN时,Ubuntu 18.04无法解析DNS。

通过Gnome Network-manager连接到VPN网络时,我失去了DNS解析,在实际中无法访问VPN网络内部或外部资源。
在使用Ubuntu 16.04并且使用VPN时,“/etc/resolv.conf/”文件会包含我连接的(VPN)网络的DNS服务器。现在它始终包含以下条目:
nameserver 127.0.0.53
search myprovider.com

根据我所了解,127.0.0.53system-resolved使用的DNS存根地址。
我怀疑这是一个错误,因为在Ubuntu 16.04上VPN正常工作。在使用VPN服务时,有没有办法设置我的网络的DNS服务器?
更新:
我尝试使用附在帖子末尾的配置文件连接到OpenVPN网络,但是出现以下错误:
 Authenticate/Decrypt packet error: cipher final failed

我已经验证了服务器使用的lzo压缩,并且我也已经启用了它。连接保持活动状态,但我无法在VPN内外导航到任何页面。
在下面列出的配置文件中,我已经包含了回复中发布的解决方案。
 client
 dev tun
 proto udp
 remote openvpn.bibsys.no 1194
 remote my-server-2 1194
 resolv-retry infinite
 nobind
 user myuser
 group myuser
 persist-key
 persist-tun
 ca ca-cert.pem
 cert openvpn.crt
 key openvpn.key
 cipher AES-256-CBC
 comp-lzo yes
 script-security 2
 up /etc/openvpn/scripts/update-systemd-resolved
 down /etc/openvpn/scripts/update-systemd-resolved
 down-pre

2当调试类似的问题时,如果无法完全解决,我会使用resolvectl statusresolvectl help来找出我的具体解决方案。 - notbad.jpeg
7个回答

问题
由于Ubuntu 18.04默认情况下未安装resolvconf,因此/etc/openvpn/update-resolv-conf脚本无法更新/etc/resolv.conf文件。
实际上,该脚本的第一行之一是检查/sbin/resolvconf可执行文件:
[ -x /sbin/resolvconf ] || exit 0

通过apt-get安装resolvconf并不是一个解决方案,因为/etc/openvpn/update-resolv-conf脚本会更新/etc/resolv.conf文件中的推送DNS条目,但tun设备似乎忽略它。
解决方案:
  1. Ubuntu 18.04使用systemd-resolved,所以你只需要通过以下命令安装systemd-resolved的openvpn帮助脚本:

    sudo apt install openvpn-systemd-resolved
    

    或者按照这些GitHub说明进行操作。

  2. 更新你的config.ovpn文件,添加以下代码:

    script-security 2
    up /etc/openvpn/update-systemd-resolved
    down /etc/openvpn/update-systemd-resolved
    down-pre
    

    这样就不需要在配置文件中添加/etc/openvpn/update-resolv-conf的上行和下行代码了。

  3. 为了防止DNS泄漏,你应该在config.ovpn文件末尾添加以下代码(根据这个systemd问题评论):

    dhcp-option DOMAIN-ROUTE .
    

1非常感谢,对我在Ubuntu 18.04上运行正常。我想要指出的是,在up/down行之前仍然需要参数script-security 2,否则程序会因错误而崩溃(OpenVPN 2.4.4)。 - lucidyan
很高兴能帮到你 :) 在回答中修改了最后一句话,在我的情况下script-security 2 是不必要的。这可能是因为我以 root 用户身份(使用 sudo)运行 openvpn 客户端。 - Qlimax
我正在以root身份运行客户端,但仍需要添加script-security 2才能使此设置生效。顺便说一句,非常感谢@Qlimax的提示。 :-) - n1ghtm4n4g3r
1@Qlimax 你知道我们如何将这些设置导入到GNOME OpenVPN客户端吗? - orestis
2@orestis 你需要安装这个软件包 sudo apt-get install network-manager-openvpn-gnome 然后你就可以将.ovpn配置文件导入到gnome网络管理器中了。https://askubuntu.com/questions/187511/how-can-i-use-a-ovpn-file-with-network-manager 用户界面随着时间的推移发生了变化,你应该能在设置->网络->VPN中找到它。 - Qlimax
3这应该是被接受的答案。 - Vanessa Deagan
1谢谢!防止 DNS 泄漏的最后一行是必要的,因为系统仍然使用默认的 DNS。 - A. Ahanchi
4很惊讶这对你们中的许多人都有效:我有一个ovpn.config文件,但NetworkManager似乎没有使用它。你是否编辑了该文件并重新导入,特别是替换了up/down脚本?因为我看到了这个不透明的二进制文件/usr/lib/NetworkManager/nm-openvpn-service-openvpn-helper,但找不到相关文档。如果需要重新导入ovpn.config,请修改答案。 - Harald
这对我也起作用了 - Milan Maharjan
1真的无法再给这个点赞了。它真的应该成为被接受的答案。 - joao
一开始对我来说不起作用,因为我的resolv.conf仍然在查找我的路由器dns。我确保首先使用了stub(127.0.0.53)在ubuntu 19.10上,然后它就起作用了。我仍然无法弄清楚如何让stub解析器自己进行本地和远程解析,但这是一个好的临时解决办法。 - chaz
抱歉,但是对我来说没有起作用。 - Amit Patil
这是否意味着预计也能解决在Ubuntu 20.04上的Pritunl问题? - Zorglub29
1谢谢!这个对于Ubuntu 20.04.1 LTS仍然有效。 - igorp1024
最后一行“dhcp-option DOMAIN-ROUTE .”是关键的-只有在我添加了这个之后,我的问题才得到解决。 - JonnyRaa
最好的答案。在互联网上。 谢谢 - 我花了一些时间才找到你的答案,其中resolveconf应该已经安装了。 - axel22

我在这篇博客文章上找到了一个解决方案。虽然提到了两种解决方案,但我更喜欢使用第二种,因为它意味着我的DNS由OpenVPN服务器设置(第一种解决方案意味着无论是否连接到OpenVPN服务器,我都使用相同的DNS服务器)。
简而言之:
  • sudo mkdir -p /etc/openvpn/scripts
  • sudo wget https://raw.githubusercontent.com/jonathanio/update-systemd-resolved/master/update-systemd-resolved -P /etc/openvpn/scripts/
  • sudo chmod +x /etc/openvpn/scripts/update-systemd-resolved
然后通过修改您的OpenVPN客户端文件(例如client.ovpn)中的上/下脚本来进行编辑。
script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
up /etc/openvpn/scripts/update-systemd-resolved
down /etc/openvpn/scripts/update-systemd-resolved

(我已经将原始的上/下设置注释掉了。)

如果使用gnome openvpn工具,config.ovpn文件应该存储在哪里? - orestis
2config.ovpn找不到 - 它是用于连接的客户端配置文件。您可以自行生成它,或者由您的OpenVPN提供商发放给您(它的名称可能不是config.ovpn,而可以是任何名称,比如client.ovpn)。 - Andy Turfer
这个完美地运作。 - Ahsanul Haque
2我获得“警告:运行命令失败(--up/--down):外部程序 fork 失败”。 - blockhead
很不幸,对于使用TCP的VPN来说这并没有起作用,VPN之外的网站无法解析,因此我开始使用https://client.pritunl.com/#install,发现非常有用。 - Saisurya Kattamuri
如果在*.ovpn*文件的末尾没有添加down-pre,你将会收到一些令人讨厌的警告信息,如停止update-systemd-resolved: Invalid device name: 'tun0'. Usage: update-systemd-resolved up|down device_name. WARNING: Failed running command (--up/--down): external program exited with error status: 1 Exiting due to fatal error - lucidyan
这对我也没用。我遇到了完全相同的问题。 - Mnemosyne
我的client.ovpn文件没有上行和下行的内容,我可以直接添加吗? - Falc
@Falc 是的,你可以。 - Andy Turfer
对我来说,只需添加script-security 2和(up/down)/etc/openvpn/update-resolv-conf这两行代码就解决了问题。 - Shayan
截至2021年10月,标准软件库中还有一个名为"openvpn-systemd-resolved"的软件包,而不是引用githubusercontent的URL。 - foo

实际上,这个问题有一个更简单的解决方案。问题出在DNS流量和Ubuntu 18对其管理上。默认情况下,IP转发是被禁用的,而OpenVPN需要它来提供正确的网络连接。你只需要运行以下命令即可:
sudo nano /etc/sysctl.conf

一旦你打开了这个文件,找到包含net.ipv4.ip_forward的那一行。如果这一行被注释掉了,就去掉行首的#符号(如果没有被注释掉,那么可能是其他问题)。保存文件,然后重新启动你的OpenVPN服务器实例。
这个修复过程不需要对客户端或OpenVPN代码进行任何修改,只需升级到Ubuntu 18版本即可。经过测试,已确认可以正常工作。
然而,显然这需要你有管理员权限来管理服务器。不幸的是,许多只是通过18.04连接到由他人管理的OpenVPN服务器的用户也存在这个bug...

1对我来说没用。你是怎么确定这是问题的呢,在你的情况下? - hwjp
6警告:您不需要在OpenVPN客户端上启用ip_forward,绝对不要这样做!这是一个安全风险。在OpenVPN服务器上,根据所使用的配置文件,可能需要启用它,这可能是为什么会出现此评论的原因。 - higuita
这就是我的问题了。很奇怪的情况。谢谢。 - Kevin C
这对我来说似乎有效!谢谢。我尝试了很多不同的修复方法... - Karl Forner

在2018年9月13日,我在Ubuntu 18.04上进行了测试。
还有另一个有用的命令可以通过命令行设置所需的内容。您可以使用命令行和图形界面来控制您的VPN连接。
sudo nmcli connection add type vpn vpn-type openvpn con-name la.vpn.contoso.com ifname --

ifname -- 是默认情况下所需的,但不会影响任何事情。

sudo nmcli connection modify la.vpn.contoso.com ipv4.dns 172.16.27.1
sudo nmcli connection modify la.vpn.contoso.com ipv4.dns-search int.contoso.com
sudo nmcli connection modify la.vpn.contoso.com ipv4.never-default yes

never-default 不应将远程网关作为默认路由

还有更加有趣的最后一步:

nmcli connection modify la.vpn.contoso.com vpn.data 'ca = /tmp/la.vpn.contoso.com/you/ca.crt, key = /tmp/you.key, dev = tun, cert = /tmp/you.crt, cert-pass-flags = 1, comp-lzo = adaptive, remote = la.vpn.contoso.com:1194, connection-type = tls'

之后,您可以使用图形用户界面(GUI)来控制VPN,或者使用以下命令:
sudo nmcli --ask connection up la.vpn.contoso.com
sudo nmcli connection down la.vpn.contoso.com

如果您的系统正在使用NetworkManager,那么您可能只需要根据this answer更改连接的DNS优先级。
nmcli -p connection modify VPN_CONNECTION_NAME ipv4.dns-priority -1

在我的情况下,DNS正在更新,但由于现有的DNS服务器具有优先权,因此被忽略了。您可能需要使用root/sudo权限。如果这不起作用,请尝试ipv6.dns-priority

我也受到了影响。在我的情况下,我正在使用带有内部名称服务器的OpenVPN(该名称服务器位于VPN内部)。这在Ubuntu 17.10之前是有效的(在`/etc/nsswitch.conf`中使用`hosts: files dns`)。
通过对OpenVPN客户端配置文件中的`/etc/openvpn/update-resolv-conf`的调用,openvpn脚本正确更新了`/etc/resolv.conf`。
然而,VPN内部主机的名称解析不再起作用(或者至少是零星地...我猜本地DNS缓存选择了名称,但需要相当长的时间才能完成)。
似乎有所帮助,甚至解决了问题(尽管现在还为时过早)的是安装以下软件包:
sudo apt install openvpn-systemd-resolved

最终,似乎没有解决办法。我又遇到了这个问题。我猜可能是其他原因让它起作用了... - Michael Opdenacker
2也许你可以删除你的回答?看起来决定已经在下面找到了。 - lucidyan

对我来说,所有提出的面向CLI(非NetworkManager)的解决方案都没有起作用(甚至在myconfig.ovpn中也没有updown行)。

然而,我发现NetworkManager VPN似乎又可以工作了(一两年前它无法工作,所以我转而使用openvpn CLI)。我没有进行任何调整:只是尝试使用适当的凭据激活它。