通过TLS上的DNS保护Ubuntu 18.04上的DNS隐私

本教程将向您展示如何使用以下方法在Ubuntu 18.04桌面上保护DNS隐私: TLS上的DNS。 我们将使用一个名为 粗短 实现这一目标。 但是首先,让我告诉您为什么DNS不安全。

DNS漏洞

DNS是不安全的,因为默认情况下,DNS查询未加密,因此中间实体可以利用它。 DNS缓存毒物是DNS滥用之一,中国长城防火墙(GFW)广泛使用它来审查中国Internet。 GFW会检查发送到中国以外的DNS服务器的每个DNS查询。 由于纯文本DNS协议基于无连接协议UDP,因此GFW可以欺骗客户端IP和服务器IP。 当GFW在其阻止列表中找到域名时,它将更改DNS响应。 例如,如果中国的互联网用户想要访问google.com,则中国的防火墙将向中国的IP地址返回到DNS解析器,而不是Google的真实IP地址。 然后,DNS解析器将伪造的IP地址返回给用户的计算机。

什么是基于TLS的DNS? 如何保护您的隐私?

TLS上的DNS表示DNS查询是通过使用TLS加密的安全连接发送的,TLS是与加密HTTP流量相同的技术,因此没有第三方可以看到您的DNS查询。 与HTTPS和加密的SNI(服务器名称指示)一起,可以完全保护您的浏览历史记录,以防止ISP进行间谍活动。

Stubby是由getdns团队开发的开源DNS存根解析器。 它使用getdns库。 存根解析器是最终用户计算机上的小型DNS客户端,它从Firefox等应用程序接收DNS请求,并将请求转发到递归解析器(如1.1.1.1或8.8.8.8)。 Stubby的特殊之处在于它支持基于TLS的DNS。 默认情况下,它将仅发送加密的DNS请求。 还有另一个名为的存根解析器 cloudflared 支持基于HTTPS的DNS,但stubby已经存在于Ubuntu 18.04存储库中,并且非常易于使用。

如何在Ubuntu 18.04桌面上安装和使用Stubby

Stubby位于Ubuntu 18.04存储库中。 打开一个终端窗口,然后运行以下命令进行安装。

sudo apt install stubby

这将安装stubby和 getdns 图书馆。 安装后,Stubby将在后台运行。 您可以通过以下方式查看其状态:

systemctl status stubby

通过运行以下命令可以看到,Stubby侦听本地主机(127.0.0.1)的TCP和UDP端口53:

sudo netstat -lnptu | grep stubby

在tls上的stubby dns

提供的默认存根解析器 systemd-resolved 侦听127.0.0.53的TCP和UDP端口53。

sudo netstat -lnptu | grep systemd-resolv

systemd解析的存根解析器

注意:如果dnsmasq正在侦听127.0.0.1的TCP端口53,则Stubby将仅侦听127.0.0.1的UDP端口53。

主要配置文件是 /etc/stubby/stubby.yml。 通常,除非您要使用其他或自己的递归解析器,否则无需对其进行更改。 让我解释一些默认配置。 您可以使用以下方式打开文件:

sudo nano /etc/stubby/stubby.yml

下面的代码行使stubby作为stub解析器而不是完整的递归解析器运行,因此将其命名为stubby。

resolution_type: GETDNS_RESOLUTION_STUB

以下配置使存根发送使用TLS加密的DNS查询。 它不会以纯文本形式发送查询。

dns_transport_list:
- GETDNS_TRANSPORT_TLS

此以下行要求远程递归解析器上有有效的TLS证书。

tls_authentication: GETDNS_AUTHENTICATION_REQUIRED

以下几行设置了stubby守护程序的侦听地址。 默认情况下,IPv4和IPv6均已启用。

listen_addresses:
- 127.0.0.1
- 0::1

下面的代码行以循环的方式使存根查询递归解析器成为可能。 如果设置为 0,Stubby将顺序使用每个上游服务器,直到它不可用为止,然后继续使用下一个。

round_robin_upstreams: 1

默认情况下,在stubby配置文件中启用了3个递归解析器。 它们由存根开发人员运行,并支持基于TLS的DNS。 您可以在DNS Privacy网站上查看推荐服务器的完整列表。

dnsovertls.sinodun.com     145.100.185.15
dnsovertls1.sinodun.com    145.100.185.16
getdnsapi.net              185.49.141.37

在其他DNS服务器 Additional Servers 默认情况下被禁用的部分。

dns.quad9.net
unicast.censurfridns.dk
dnsovertls3.sinodun.com (supporting TLS1.2 and TLS 1.3)
dnsovertls2.sinodun.com
dns.cmrg.net
dns.larsdebruin.net
......

也有DNS服务器在端口443上侦听。如果网络中阻止了端口853,则可以取消注释它们以使用这些服务器。

dnsovertls.sinodun.com
dnsovertls1.sinodun.com
dns.cmrg.net
dns.neutopia.org

现在,您可以按以下键退出nano文本编辑器 Ctrl+X

切换到Stubby

编辑 /etc/resolve.conf 建议不要再使用文件更改名称服务器。 请按照以下说明进行操作 systemd-resolved 将DNS查询发送到Stubby。

GNOME桌面

单击桌面右上角的网络管理器图标。 然后选择有线设置。 (如果您使用的是Wi-fi,请选择Wi-fi设置。)

加密dns

点击齿轮按钮。

在tls上的cloudflare dns

选择 IPv4 标签,然后在DNS设置中切换 Automatic 设置为OFF,这将阻止您的Ubuntu系统从路由器获取DNS服务器地址。 输入 127.0.0.1 在DNS字段中。 请点击 Apply 按钮以保存您的更改。

通过tls端口853的dns

然后重新启动NetworkManager以使更改生效。

sudo systemctl restart NetworkManager

重新连接后,可以看到您的Ubuntu系统现在使用127.0.0.1作为DNS服务器。 Details 标签。

通过tls的存根解析器dns

Unity桌面

推荐阅读:如何在Ubuntu 18.04上安装Unity桌面环境。

单击桌面右上角的网络管理器图标,然后单击 edit connections

网络管理员更改DNS

选择您的连接名称,然后点击齿轮图标。

stubby systemd解析

选择“ IPv4设置”选项卡,从以下位置更改方法 Automatic(DHCP)Automatic(DHCP) addresses only,这将阻止您的Ubuntu系统从路由器获取DNS服务器地址。 然后指定一个DNS服务器(127.0.0.1)。 Stubby监听127.0.0.1。

在tls上的ubuntu dns

保存您的更改。 然后重新启动NetworkManager以使更改生效。

sudo systemctl restart NetworkManager

重新连接后,再次单击网络管理器图标,然后选择 connection information。 您可以看到您的Ubuntu系统现在使用127.0.0.1作为DNS服务器。

ubuntu 18.04在tls上的dns

与桌面无关的方式来更改DNS服务器

只要您的桌面环境使用NetworkManager,就可以使用以下方法更改DNS服务器。

打开一个终端窗口,然后转到“网络管理器”连接配置文件目录。

cd /etc/NetworkManager/system-connections/

然后列出系统上可用的连接名称。

ls

网络管理器从命令行更改dns服务器

如您所见,我的系统上有多个连接,其中之一是有线连接。 一些是无线连接,一种是VPN连接。 因为我的台式计算机是通过以太网电缆连接到路由器的,所以我需要使用以下命令编辑有线连接配置文件 nano 命令行文本编辑器。

sudo nano 'Wired connection 1'

如果您的计算机是通过Wi-fi连接的,则需要编辑无线连接配置文件。 在此文件中,找到 [ipv4] 配置。 默认情况下,它应如下所示:

[ipv4]
dns-search=
method=auto

要使您的系统使用Stubby,请将配置更改为以下内容。

[ipv4]
dns=127.0.0.1;
dns-search=
ignore-auto-dns=true
method=auto

要在Nano文本编辑器中保存文件,请按 Ctrl+O,然后按Enter确认。 按 Ctrl+X 退出。 然后重新启动网络管理器以使更改生效。

sudo systemctl restart NetworkManager

现在,您可以通过运行以下命令来检查当前的DNS服务器:

systemd-resolve --status

样本输出:

Link 2 (enp5s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 127.0.0.1

如果127.0.0.1被列为DNS服务器,则您的系统正在使用Stubby。

如何检查您的DNS通信是否已加密

我们可以使用WireShark监视DNS流量。 从Ubuntu 18.04存储库安装WireShark。

sudo apt install wireshark

如果系统询问您“非超级用户是否可以捕获数据包?”,请回答“是”。 安装完成后,运行以下命令将您的用户帐户添加到wireshark组,以便您可以捕获数据包。

sudo adduser your-username wireshark

注销并重新登录,以使更改生效。 然后从应用程序菜单中打开WireShark,在WireShark中选择您的网络接口。 例如,我的以太网接口名称是enp5s0。 然后输入 port 853 作为捕获过滤器。 这将使WireShark仅捕获端口853上的流量,该端口是DNS通过TLS使用的端口。

ubuntu 18.04粗短

单击左上角的按钮开始捕获。 之后,在终端窗口中,使用以下命令查询域名 dig 效用。 例如,我可以查询我的域名的A记录。

dig A linuxbabe.com

现在,您可以在WireShark中查看捕获的DNS通信。 如您所见,我的DNS查询已发送到 185.49.141.37145.100.185.15145.100.185.16,这是stubby配置文件中定义的3个默认DNS解析器。 连接是通过TCP进行的,并使用TLS加密,这正是我想要的。

安全DNS

如果发送的DNS查询没有加密,则计算机将通过端口53与DNS服务器联系。 port 53 作为捕获过滤器,但在WireShark中将看不到任何数据包,这意味着stubby正在加密DNS查询。

如何将CloudFlare DNS添加到Stubby

我发现计算机与3个默认DNS服务器之间存在高延迟(超过200毫秒),而CloudFlare DNS服务器(1.1.1.1、1.0.0.1)却给我带来了非常低的延迟(不到20毫秒)。 CloudFlare还支持基于TLS的DNS。 要添加CloudFlare DNS服务器,请编辑存根配置文件。

sudo nano /etc/stubby/stubby.yml

向下滚动到 upstream_recursive_servers: 部分,并在其他DNS服务器上方添加以下文本。

#CloudFlare servers
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 1.0.0.1
    tls_auth_name: "cloudflare-dns.com"

然后找到以下行:

round_robin_upstreams: 1

更改 10。 这将使stubby始终使用CloudFlare DNS服务器。 如果CloudFlare不可用,则存根将使用其他DNS服务器。 保存文件并重新启动stubby,以使更改生效。

sudo systemctl restart stubby

DNS over HTTPS支持

Stubby将在版本0.3中支持基于HTTPS的DNS。 Ubuntu 20.10随附0.2.6版本。 要检查Stubby版本,请运行

stubby -V

包起来

我希望本教程可以帮助您通过TLS上的DNS保护Ubuntu 18.04上的DNS隐私。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 照顾自己。

Sidebar