Browsed by
Tag: DoT

dnsmasq + stubby

dnsmasq + stubby

前段时间因为 DNS 污染(或者拦截)的原因,在路由器中改成配置 DoT,问题得到了极大改善,上网速度和质量很明显好很多。但是还依然存在一些让人困惑的瑕疵:(1)有时候 DNS 查询过程会突然缓慢卡顿;(2)路由器上的 DNS 会缓存多少记录。

对于问题(1),我怀疑是路由器配置的 DoT 服务器可能有若干个工作不正常。我在路由器中配置了四个DoT服务器,分别对应阿里和腾讯的主备DoT服务器。路由器没有提供相应的log,因此无从证实这个猜测。对于问题(2),路由器也没有提供配置或者log,同样不得而知。

为彻底弄明白这些情况,我决定还是自己搭一套环境测试一下,采用 dnsmasq + stubby。其中 dnsmasq 负责发起 DoU(DNS over UDP) 查询和缓存,stubby 负责 DoT(DNS over TLS) 请求,网络拓扑是以下方式:

设备 <-- DoU --> dnsmasq <-- DoU --> stubby <-- DoT --> DNS server

采用以下命令安装:

sudo apt install dnsmasq stubby

启动或者查询状态采用以下命令:

sudo systemctl restart dnsmasq
sudo systemctl restart stubby
sudo systemctl status dnsmasq
sudo systemctl status stubby

修改 /etc/stubby/stubby.yml 文件:

listen_addresses:
- 127.0.0.1@53000
- 0::1@53000
upstream_recursive_servers:
# alidns dot
- 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的服务器地址,后面会详述原因。另外,stubby 设置为启动本地 53000 端口接收 DNS查询,这个端口可以随意设置,但要与后面 dnsmasq一致。

接下来在 /etc/dnsmasq.d 目录下创建一个自定义conf文件,例如mydns.conf,内容如下:

# stubby address and port
server=127.0.0.1#53000
no-resolv

# cache configuration
min-cache-ttl=300
max-cache-ttl=3600
cache-size=10000

# 纯主机名不转发外网
domain-needed
# 拦截私有内网地址反向解析,不发外网
bogus-priv
# 内网.lan后缀完全本地解析
local=/lan/

server 对接 stubby,因此要注意对接前面设置的 53000 端口。cache 部分的配置可以很直观地控制 ttl 和具体的cache容量,这样就很清楚地解决了前面提到的问题(2)。

对于问题(1),修改 stubby 的配置,单独指向腾讯DoT服务器和阿里DoT服务器进行测试,也搞清楚原因了。据说腾讯服务器限定了20QPS(每秒不超过20个DNS查询),声称这个值足够家庭用户使用,其实完全不对。打开腾讯的官网(qq.com)并用 wireshark 抓包,一个首页的DNS查询就已经超过20QPS,然后IP就被屏蔽,DNS结果全部是「server failure」。这还仅仅是一个用户、打开一个页面的DNS查询结果,如果是家庭多个用户(经由同一台路由器)同时上网,铁定超过20QPS。腾讯免费的 public DNS (DoT)服务测试结果很好,但是实际上根本就不适合家庭使用、甚至也不适合个人使用。

然而阿里的DNS(DoT)让人很惊喜。据说也有 QPS 限制,但是明显比腾讯要好很多。在路由器上删除腾讯DoT服务器、只保留阿里 DoT 服务器的配置后没发现卡顿现象,网络速度很快、质量很稳定。

测试结果显示:国外知名的公共 DoT 服务器全部不可用,所有DNS查询结果都是「server failure」。不知道是DoT服务器限制了中国IP地址的访问,还是某神秘力量屏蔽了对这些DoT服务器的访问,好难猜。

肉身跑到隔壁的香港测试了 Google 和 Cloudflare 的 DoT 服务器。无论是 IPv4 还是 IPv6,速度都极快、质量极稳定,好羡慕。

对了,阿里的镜像服务也比腾讯好很多,速度又快又稳,我们在国内的所有 Debian 节点都是采用阿里的镜像服务。我觉得我们应该对淘宝好一点(虽然淘宝的app和服务都很烂),支持这些好的 public services 继续支撑下去。

公共 DoT 服务器

公共 DoT 服务器

初代 DNS 协议采用明文定义、基于 UDP 传递,在复杂的网络环境下,DNS 被污染、被篡改的情况尤其让人头痛。为改善这种情况,采用加密传输 DNS 内容不失为一个稳妥的方式。

目前有两种方式加密传输 DNS:(1)HTTPS,以及 (2)TLS。

HTTPS 方式通过加密的 HTTP 连接传递 DNS 报文, 而 TLS 显然就是通过加密的 TLS 连接传递报文。两种方式对 DNS 本身没有影响,只是采用了加密的传输而已。从效率的角度看,DNS over TLS (DoT)比 DNS over HTTPS (DoH)更好,毕竟 DoH 多了一层 HTTP 协议封装。

目前 Windows 系统默认都不支持 DoT,需要采用第三方的软件(某种程度上又变相引入了不安全因素)。比较好的解决方式是选择支持 DoT 的路由器,国内华为、荣耀等家用路由器不支持 DoT,而华硕、TPLink 等家用路由器支持 DoT。

公共 DNS 服务器一般都支持 DoT 服务,国内采用腾讯和阿里两家的公共 DNS 服务即可,默认的 DoT 服务器如下:

dot.pub      -- 腾讯 DNS 服务
223.5.5.5 -- 阿里 DNS 服务

香港地区(或者海外地区)建议采用 google 和 Cloudflare 的公共 DNS 服务即可,默认 DoT 服务器如下:

1.1.1.1 -- Cloudflare 的 DNS 服务
8.8.8.8 -- Google 的 DNS 服务