Ubuntu 16.04开箱即用的VPN连接DNS路由失败

我想报告一些奇怪的行为,以及我的解决方案。 我非常不满意,因为它依赖于自定义脚本和非标准包。 我希望社区帮助找出更好的解决方案。


问题

我严重依赖OpenVPN来处理所有服务器。 从14.04.5升级到Ubuntu 16.04.1后,我无法访问任何网站和大多数服务。

我的OpenVPN服务器继续为Mac OS X,Windows和Ubuntu 12.04 / 14.04客户端提供良好的隧道流量。

系统细节

我开箱即用的resolv.conf文件看起来像:

nameserver 68.105.28.16 nameserver 68.105.29.16 

我的路由表明我通过路由器192.168.0.1进行路由,并被分配了动态IP地址192.168.0.3。 命令显示:

 ip r ip a 

我的流量将正常运行(互联网,XMCP,IRC等…),直到我通过终端使用命令连接到我的OpenVPN服务器

 sudo openvpn ~/client.ovpn 

连接后,它将立即停止所有流量。

为此连接创建了一个新适配器(tun0)。 命令显示:

 ip a 

与Wireshark的连接显示了针对我的原始DNS服务器的数十个DNS调用,即使配置设置为通过我的OpenVPN服务器隧道传输所有流量。

我的解决方案

经过整整一周阅读许多错误报告,博客文章和教程后,我仍然没有成功。 但是,这是一个DNS问题,DNS由resolv管理。

最后,我偶然发现了这个GitHub库,我的问题得到了解决。

masterkorp / OpenVPN的更新,RESOLV-conf的

为了实现这些脚本,我将repo克隆到我的主目录中:

 git clone https://github.com/masterkorp/openvpn-update-resolv-conf.git 

我将这些脚本复制到/ etc / openvpn:

sudo chmod +x *.sh && sudo mv *.sh /etc/openvpn

接下来,我安装了openresolv,nscd和unbound:

 sudo apt-get install openresolv nscd unbound 

然后,我编辑了我的OpenVPN客户端配置文件(* .ovpn或* .conf),并在配置指令的末尾添加了以下行,但在“ca”标记之前(您的内联证书,如果有的话):

 script-security 2 up "/etc/openvpn/update-resolv-conf.sh /etc/openvpn/update-systemd-network.sh" down "/etc/openvpn/update-resolv-conf.sh /etc/openvpn/update-systemd-network.sh" 

这使我能够成功连接到VPN并隧道传输流量。

我的resolv.conf文件现在看起来像:

 # Generated by resolvconf nameserver 127.0.0.1 nameserver 127.0.1.1 

讨论和需要更好的解决方案

在我看来,Ubuntu的DNS记录没有正确更新。 上述代码和新条目的目的是重写内部DNS服务器记录的故障更新过程。 我已经阅读了一些关于Launchpad的bug报告,这些报告表明16.04依赖于一些旧的网络管理更新代码,这些代码是在14.04编写并运行的,并且从未正确迁移到新的16.04框架。

必须有更好的方法来处理这个过程。 我不喜欢我需要使用自定义脚本来修补有问题的操作系统行为的想法。

有人对此有任何见解吗?

在/etc/resolv.conf中设置您的DNS服务器,然后在终端中以root身份尝试:

chattr + i /etc/resolv.conf

然后重启