TLS上的DNS

#DNS是不安全的因为默认情况下,DNS查询未加密因此中间实体可以利用它,TLS上的DNS表示DNS查询是通过使用TLS加密的安全连接发送的TLS是与加密HTTP流量相同的技术因此没有第三方可以看到您的DNS查询.与HTTPS和加密的SNI一起使用,可以完全保护您的浏览历史记录.
#Ubuntu 桌面上安装和使用Stubby(我的版本是18.04)

sudo apt install stubby

查看永运行stubby默认运行在53端口

root@l:~#  netstat -lnptu | grep stubby
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1685/stubby         
tcp6       0      0 ::1:53                  :::*                    LISTEN      1685/stubby         
udp        0      0 127.0.0.1:53            0.0.0.0:*                           1685/stubby         
udp6       0      0 ::1:53                  :::*                                1685/stubby         
root@l:~# 

主要配置文件是/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.

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

Additional Servers部分中还有其他默认情况下禁用的DNS服务器

dns.quad9.net 
unicast.censurfridns.dk 
dnsovertls3.sinodun.com(支持TLS1.2和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

设定

vim /etc/resolvconf/resolv.conf.d/head
里面以前设置的注释掉或者删除
nameserver 127.0.0.1
wq保存退出
sudo resolvconf -u
更改生效

如果想看到运行效果安装一款捕获软件

sudo apt install wireshark

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

sudo adduser your-username wireshark #your-username 替换成你的用户名称

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

ifconfig

#参照上面图形和解说开始点击捕获,打开终端运行

dig A linuxbabe.com

现在,您可以在WireShark中查看捕获的DNS通信,正如你所看到的,我的DNS查询被送到185.49.141.37,145.100.185.15并且145.100.185.16这是在粗短的配置文件中定义的3个默认的DNS解析器,连接是通过TCP进行的并使用TLS加密.

如果发送的DNS查询未加密,则计算机将与端口53上的DNS服务器联系,您可以使用port 53捕获筛选器再次捕获数据包,但在WireShark中将看不到任何数据包.这意味着存根正在对DNS查询进行加密.
#默认的dns服务器延迟太高了,而且对于解析baidu真正的不友好,ping值200多,需要自己定义添加适合的dns服务器

sudo vim /etc/stubby/stubby.yml

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

# Additional servers

# IPv4 addresses
## dns.alidns.com 
  - address_data: 223.5.5.5
   tls_auth_name: "dns.alidns.com"
  - address_data: 223.6.6.6
   tls_auth_name: "dns.alidns.com"
## Dns.Google
#  - address_data: 8.8.8.8
#    tls_auth_name: "dns.google"
#  - address_data: 8.8.4.4
#    tls_auth_name: "dns.google"
##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"

#我是直接启用了223.5.5.5 223.6.6.6 阿里然后把默认的和ipv6都注释了这样直接友好的使用

保存文件并重新启动stubby以使更改生效

sudo systemctl restart stubby

#就到这里吧本人懒惰解说不够详细如有问题可以询问或者google