在Ubuntu 20.04/18.04上保护你的DNS隐私(DNS over TLS)

  • 技术文档
  • 2022.03.23
  • 浏览:797

本教程将向您展示如何使用DNS over TLS在Ubuntu 20.04/18.04桌面上保护您的DNS隐私。我们将使用名为stubby的工具来实现这一点。但首先,让我告诉你为什么DNS不安全。

DNS漏洞

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

什么是通过TLS的DNS?它如何保护你的隐私?

DNS over TLS意味着DNS查询是通过使用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已经存在于Ubuntu20.04/18.04存储库中,非常容易使用。

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

Stubby位于Ubuntu 20.04/18.04存储库中。打开一个终端窗口并运行以下命令来安装它。

sudo-apt-install-stubby

这将安装stubby和getdns库。安装后,stubby将在后台运行。您可以通过以下方式检查其状态:

systemctl状态存根

ubuntu stubby

Stubby监听localhost(127.0.0.1)的TCP和UDP端口53,运行以下命令可以看到:

sudo netstat-lnptu | grep stubby

stubby dns over tls

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

sudo netstat-lnptu | grep系统解决方案

systemd-resolved stub resolver

注意:如果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作为存根解析器而不是完全递归解析器运行,这就是为什么它被命名为stubby。

解析类型:GETDNS解析存根

以下配置使stubby发送使用TLS加密的DNS查询。它不会以明文形式发送质询。

dns_传输_列表:-获取dns_传输_TLS

下面这一行需要远程递归解析器上的有效TLS证书。

tls_身份验证:需要GETDNS_身份验证

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

监听地址:-127.0.0.1-0::1

下面一行以循环方式生成短截图查询递归解析器。如果设置为0,Stubby将按顺序使用每个上游服务器,直到它变得不可用,然后继续使用下一个。

循环上游:1

默认情况下,stubby配置文件中启用了3个递归解析器。它们由stubby开发者运行,支持TLS上的DNS。你可以在DNS隐私网站上看到推荐服务器的完整列表。

dnsovertls。中国盾。com 145.100.185.15 dnsovertls1。中国盾。com 145.100.185.16 getdnsapi。净额185.49.141.37

“附加服务器”部分中还有其他默认禁用的DNS服务器。

dns。第九节。网络单播。切努弗林斯。dk dnsovertls3。中国盾。com(支持TLS1.2和TLS1.3)dnsovertls2。中国盾。com域名解析。cmrg。net dns。拉斯德布林。网

也有DNS服务器监听端口443。如果网络中的端口853被阻止,您可以取消对它们的注释以使用这些服务器。

dnsovertls。中国盾。com dnsovertls1。中国盾。com域名解析。cmrg。net dns。纽托皮亚。组织

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

切换到Stubby

编辑/etc/resolve。不再建议使用conf文件更改服务器名称。按照下面的说明,使systemd resolved向stubby发送DNS查询。

GNOME桌面

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

encrypt dns

点击齿轮按钮。

cloudflare dns over tls

选择IPv4选项卡,然后在DNS设置中,将自动切换到OFF,这将阻止Ubuntu系统从路由器获取DNS服务器地址。在DNS字段中输入127.0.0.1。单击应用按钮保存更改。

dns over tls port 853

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

sudo systemctl重新启动NetworkManager

一旦你重新连接,你可以看到你的Ubuntu系统现在使用127.0.0.1作为详细信息选项卡中的DNS服务器。

stub resolver dns over tls

统一桌面

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

单击桌面右上角的网络管理器图标,然后单击编辑连接。

network manager change DNS

选择连接名称,然后单击齿轮图标。

stubby systemd-resolved

选择IPv4设置选项卡,将方法从自动(DHCP)更改为仅自动(DHCP)地址,这将阻止Ubuntu系统从路由器获取DNS服务器地址。然后指定DNS服务器(127.0.0.1)。斯塔比在127.0.0.1上收听。

ubuntu dns over tls

保存更改。然后重新启动NetworkManager,使更改生效。

sudo systemctl重新启动NetworkManager

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

ubuntu 18.04 dns over tls

从命令行更改DNS服务器

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

打开终端窗口,进入网络管理器连接配置文件目录。

cd/etc/NetworkManager/系统连接/

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

ls

network manager change dns server from command line

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

sudo nano“有线连接1”

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

[ipv4]dns搜索=方法=自动

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

[ipv4]dns=127.0.0.1;dns搜索=忽略自动dns=真方法=自动

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

sudo systemctl重新启动NetworkManager

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

系统解析——状态

样本输出:

链路2(enp5s0)当前作用域:DNS LLMNR设置:是多播DNS设置:无DNSSEC设置:不支持DNSSEC:无DNS服务器:127.0.0.1

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

忽略DHCP服务器提供的DNS设置

如果使用Ubuntu server edition,可以将systemd配置为忽略DHCP服务器提供的DNS设置,这样系统就不会意外使用错误的DNS服务器。

首先,检查网络接口的状态。

网络控制状态enp5s0

它将显示此接口的网络文件。编辑此网络文件。

sudo nano/run/systemd/network/10-netplan-enp5s0。网络

找到[DHCP]部分并添加以下行。

UseDNS=false

这样地:

[DHCP]RouteMetric=100 UseMTU=true UseDNS=false

保存并关闭文件。然后重新启动systemd Networkd。为变更生效提供服务。

sudo systemctl重启systemd networkd

运行以下命令检查每个网络接口的DNS服务器。如果一切正常,您将无法看到DHCP服务器提供的DNS服务器。

解析CTL状态

网络文件中的更改可以由新的软件包更新覆盖。如果服务器使用netplan管理网络连接,还可以将netplan配置为忽略DHCP DNS设置。

sudo nano/etc/netplan/50 cloud init。亚马尔

将以下两行添加到文件中。

dhcp4覆盖:使用dns:否

这样地:

网络:ethernets:eth0:dhcp4:true dhcp4覆盖:使用dns:no可选:true set name:eth0 nameservers:search:[无效]地址:127.0.0.1版本:2

保存并关闭文件。然后应用更改。

sudo网络计划申请

如何检查DNS流量是否加密

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

sudo apt安装wireshark

如果您被问到“非超级用户是否应该能够捕获数据包?”,回答是的。安装后,运行以下命令将用户帐户添加到wireshark组,以便捕获数据包。

sudo adduser你的用户名wireshark

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

ubuntu 18.04 stubby

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

挖一个利努克斯宝贝。通用域名格式

现在,您可以在WireShark中看到捕获的DNS流量。如您所见,我的DNS查询被发送到185.49.141.37、145.100.185.15和145.100.185.16,这是stubby配置文件中定义的3个默认DNS解析程序。连接是通过TCP和TLS加密的,这就是我想要的。

secure dns

如果DNS查询在未加密的情况下发送,则计算机将通过端口53联系DNS服务器。您可以使用端口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服务器,请编辑stubby配置文件。

sudo nano/etc/stubby/stubby。yml

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

#CloudFlare服务器-地址数据:1.1.1.1 tls_认证名称:“CloudFlare dns.com”-地址数据:1.0.0.1 tls_认证名称:“CloudFlare dns.com”

然后找到以下行:

循环上游:1

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

sudo systemctl重启stubby

DNS over HTTPS支持

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

斯塔比V

收尾

我希望本教程能帮助你在Ubuntu20.04/18.04上使用DNS over TLS保护你的DNS隐私。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心。