我想报告一些奇怪的行为以及我的解决方案。我非常不满意,因为它依赖于自定义脚本和非标准包。我希望社区能帮助我找到更好的解决方案。
问题
我的所有服务器都严重依赖 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 的路由器进行路由,并被分配了 192.168.0.3 的动态 IP 地址。命令显示:
ip r
ip a
我的流量可以正常运行(互联网、XMCP、IRC 等...),直到我使用以下命令通过终端连接到我的 OpenVPN 服务器
sudo openvpn ~/client.ovpn
一旦连接,它将立即停止所有流量。
为该连接创建了一个新的适配器 (tun0)。命令显示:
ip a
尽管配置设置为通过我的 OpenVPN 服务器传输所有流量,但通过 Wireshark 连接后发现有数十个 DNS 调用针对我的原始 DNS 服务器。
我的解决方案
经过整整一周阅读数十份错误报告、博客文章和教程后,我仍然没有成功。但是,这是一个 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 上的一些错误报告,这些报告表明 16.04 依赖于一些在 14.04 中编写和运行的旧网络管理更新代码,并且从未正确迁移到新的 16.04 框架。
一定有更好的方法来处理这个过程。我不喜欢需要使用自定义脚本来修补有问题的操作系统行为的想法。
有人对此有任何见解吗?
答案1
在 /etc/resolv.conf 中设置你的 DNS 服务器,然后以 root 身份在终端中尝试以下操作:
chattr +i /etc/resolv.conf
然后重新启动