Browsed by
Tag: dnspod

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 继续支撑下去。