如何修复 OpenVPN DNS 泄漏

Pla*_*ong 10 dns openvpn resolv.conf

我刚刚订阅了 VPN 提供商。

我有 Xubuntu 17.10,openvpn 2.4.3。启动 openvpn 命令后,我检查了 IP(很好)并执行了一个简单的DNS 泄漏测试:不好,它显示了我的 Internet 服务提供商!

如何修复此 DNS 泄漏?

我有一个初步审讯:

  • 它在我这边“可以修复”吗?还是远程服务器配置错误?

在我这边,我尝试在 .ovpn 配置文件中为 openvpn 更改一些值:

  1. 最初已经有这些行,预计可以工作,但没有:

    script-security 2
    up /etc/openvpn/update-resolv-conf
    down /etc/openvpn/update-resolv-conf
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我根据这个reddit answer(明确指定 DNS 地址)更改了它们:

    dhcp-option DNS 208.67.222.222
    dhcp-option DNS 208.67.220.220
    dhcp-option DNS 8.26.56.26
    up "/etc/openvpn/update-resolv-conf foreign_option_1='dhcp-option DNS 208.67.222.222' foreign_option_2='dhcp-option DNS 208.67.220.220' foreign_option_3='dhcp-option DNS 8.26.56.26'"
    down "/etc/openvpn/update-resolv-conf foreign_option_1='dhcp-option DNS 208.67.222.222' foreign_option_2='dhcp-option DNS 208.67.220.220' foreign_option_3='dhcp-option DNS 8.26.56.26'"
    
    Run Code Online (Sandbox Code Playgroud)

    这样做似乎可以完成工作,因为/etc/resolvconfup/down 脚本更新了内容:

    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    # 127.0.0.53 is the systemd-resolved stub resolver.
    # run "systemd-resolve --status" to see details about the actual nameservers.
    
    nameserver 208.67.222.222
    nameserver 208.67.220.220
    nameserver 8.26.56.26
    search lan
    
    Run Code Online (Sandbox Code Playgroud)

    但是 DNSleaktest 仍然显示我的 ISP。

  3. 然后我了解到ubuntu 包的存在,openvpn-systemd-resolved它提供了一个类似于update-resolve-conf但使其与 systemd 一起工作的脚本(在这里我不知道哪些进程使用这个:network-manager?openvpn?)。我安装了该软件包并替换了 .ovpn 文件中的脚本名称:

    up "/etc/openvpn/update-systemd-resolved ..."
    down "..."
    down-pre
    
    Run Code Online (Sandbox Code Playgroud)

    仍然没有运气。[在写这篇文章时,我只是想出了解决方案,请参阅下面的答案]

  4. 然后我玩了很多/etc/resolv.conf文件。通常它不应该改变,所以我把我的 DNS 服务器地址放入/etc/resolvconf/resolv.conf.d/base,但发出resolvconf -u似乎不起作用。

  5. 与VPN公司的支持人员聊天,没有解决方案。

  6. 我想这样的各种解决方案一个,以及随后接受的答案:

    • 安装dnsmasq并投入server=.../etc/dnsmasq.conf;
    • /etc/dhcp/dhclient.conf详细信息)中放置一个“取代”行;
    • chattr基于黑客
  7. 我忘记了我尝试过的其他事情,然后我想,stackexchange 会让我摆脱痛苦,它奇迹般地做到了,仅仅凭借提出问题的能力。

[编辑1:未解决!其实我的第一个答案不是它起作用的原因]

经过更多检查后我注意到了。我可以删除这些systemd-update-resolved行,它仍然有效,但仅限于某些条件:

openvpn 服务运行时,我发现 DNS 泄漏。如果我停止它,然后只为我的客户端重新启动服务:

sudo service openvpn stop
sudo service openvpn@client start
Run Code Online (Sandbox Code Playgroud)

那么它的工作原理。

抱歉,我想我还没有彻底检查 openvpn 手册,但这是为什么呢?这不是安全漏洞吗?特别是因为从apt安装后会自动激活openvpn服务。如何使更改永久化?(我试过了sudo systemctl disable openvpn,但在下次启动时我仍然遇到同样的问题)。

[编辑2:路由表]

一旦我停止openvpn并开始openvpn@client,我就没有 DNS 泄漏,输出route -n是:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         91.240.65.1     128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1
91.240.64.17    192.168.1.254   255.255.255.255 UGH   0      0        0 eno1
91.240.65.0     0.0.0.0         255.255.255.224 U     0      0        0 tun0
128.0.0.0       91.240.65.1     128.0.0.0       UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
Run Code Online (Sandbox Code Playgroud)

之后sudo service openvpn restart

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         91.240.66.1     128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1
91.240.64.16    192.168.1.254   255.255.255.255 UGH   0      0        0 eno1
91.240.66.0     0.0.0.0         255.255.255.224 U     0      0        0 tun0
128.0.0.0       91.240.66.1     128.0.0.0       UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
Run Code Online (Sandbox Code Playgroud)

不再工作了,我在这两种情况下都会出现 DNS 泄漏。我尝试安装该软件包openresolv(它取代了 resolvconf),它似乎有效。这是新的路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         91.240.66.161   128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1
91.240.64.15    192.168.1.254   255.255.255.255 UGH   0      0        0 eno1
91.240.66.160   0.0.0.0         255.255.255.224 U     0      0        0 tun0
128.0.0.0       91.240.66.161   128.0.0.0       UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
Run Code Online (Sandbox Code Playgroud)

Pla*_*ong 7

Sooo 的答案是仔细遵循 ArchLinux wiki 中的始终在线说明:

https://wiki.archlinux.org/index.php/OpenVPN#Update_systemd-resolved_script

附加相应的行。

所以,分两步:

sudo apt install openvpn-systemd-resolved
Run Code Online (Sandbox Code Playgroud)

追加以下行到你的.ovpn文件:

script-security 2
dhcp-option DNS 208.67.222.222
dhcp-option DNS 208.67.220.220
dhcp-option DNS 8.26.56.26
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
Run Code Online (Sandbox Code Playgroud)

如果这不清楚,您的文件现在应该包含行“向上”和行“向下”:

# old lines
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
# new lines
script-security 2
dhcp-option DNS 208.67.222.222
dhcp-option DNS 208.67.220.220
dhcp-option DNS 8.26.56.26
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
Run Code Online (Sandbox Code Playgroud)

[编辑 1:实际上不,这不是它起作用的原因]

请参阅我的问题中的编辑 1

[编辑2:我想这次我做对了]

这里systemd-resolved.service引用这个奇怪行为的问题。

似乎放入客户端配置文件的选项如下:

dhcp-option DOMAIN-ROUTE .
Run Code Online (Sandbox Code Playgroud)

这显然通过选定的连接路由所有DNS ...


小智 5

我在 Ubuntu 17.10 和现在的 18.04 LTS 上遇到了 DNS 泄漏问题。一定是我不久前从 16.10 更新时开始的,直到现在我才想到检查,偶然。上述内容(以及我发现和尝试的其他内容)都没有帮助,直到我遇到下面的这个 URL,并从头到尾阅读了错误报告。关于添加 dns 优先级行的评论对我有用。

https://bugs.launchpad.net/network-manager/+bug/1624317 查看评论#103。

查找已安装的 NetworkManager VPN 连接(“ $”只是我的系统提示符,表明您位于终端窗口中的命令行):

$ ls -la /etc/NetworkManager/system-connections/*
Run Code Online (Sandbox Code Playgroud)

然后选择您想要修复的并在其上运行此命令(或者您可以手动编辑配置文件,因为此命令只是在 ipv4 部分下添加一个 dns-priority 条目):

$ sudo nmcli 连接修改 < VPN 连接名称> ipv4.dns-priority -42

并重新启动:

$ sudo service network-manager restart
Run Code Online (Sandbox Code Playgroud)

请注意,至少对我来说,将其放入来自我的 VPN (ProtonVPN) 的 OpenVPN .ovpn 配置文件中不起作用。由于某种原因,当使用 GUI 对话框安装时,它没有进入 NetworkManager 配置。只有安装后更新配置,然后重新启动NetworkManager,它才起作用。您需要为要使用的每个已安装的 VPN 配置执行此操作。