在互联网里销声匿迹-DNS篇

写在开头

不知道有没有人见过访问Steam,GitHub,Minecraft登录页面的时候被重定向到各地反诈中心的场景。大家有没有想过为什么会出现这个情况。或者是在企业/组织内访问某些网页被负责人警告,这些都是你上网行为泄露的表象。除了SNI嗅探,深度包透析还有一个也是本文的重点,DNS泄露。

什么是DNS泄露?

当前互联网上的定义有些鱼龙混杂,不尽相同。有以下几种观点:

  • 在使用穿墙术的时候,出现不属于目标地点的DNS服务器
  • DNS流量被所属组织/监管机构捕获

在分析我的观点前,先放一张我的DNS Leak检测,各位可以前往DNS Leak Test进行测试,选择Extended Test

DNS Leak Test Result

此处将对本文的DNS泄露下定义:

在通过域名访问互联网时,出现除了自己设定DNS以外的DNS服务器或使用明文发送DNS请求

DNS查询是什么原理

此处再次引用来自赛博佛祖的博客 - 什么是DNS,大部分原理在本博客中不再赘述,但是其中我们重点关注以下内容,后文会用到:

DNS 查找的 8 个步骤:

  1. 用户在 Web 浏览器中键入 “example.com”,查询传输到互联网中,并被 DNS 递归解析器接收。

  2. 接着,解析器查询 DNS 根域名服务器(.)。

  3. 然后,根服务器使用存储其域信息的顶级域(TLD)DNS 服务器(例如 .com 或 .net)的地址响应该解析器。在搜索 example.com 时,我们的请求指向 .com TLD。

  4. 然后,解析器向 .com TLD 发出请求。

  5. TLD 服务器随后使用该域的域名服务器 example.com 的 IP 地址进行响应。

  6. 最后,递归解析器将查询发送到域的域名服务器。

  7. example.com 的 IP 地址而后从域名服务器返回解析器。

  8. 然后 DNS 解析器使用最初请求的域的 IP 地址响应 Web 浏览器。

  9. DNS 查找的这 8 个步骤返回 example.com 的 IP 地址后,浏览器便能发出对该网页的请求:

  10. 浏览器向该 IP 地址发出 HTTP 请求。

  11. 位于该 IP 的服务器返回将在浏览器中呈现的网页(第 10 步)。

DNS 查找的8个步骤

为什么DNS泄露?

众所周知,一份普通的DNS数据包内容如下

Query Createch Blog from AliDNS

由此可见,普通的开放在UDP 53端口的DNS服务数据包内容没有任何加密

  1. 任何网络上的网关(二层&三层)都可以审计甚至通过伪造Source IP提前抢答DNS(aka DNS劫持)。如果审计网关所使用的DNS与你所指定的DNS不同,则在先前提到的网页中则会出现不同的DNS服务器(虽然此时你底裤已经被审计工具看光了)。

  2. 在使用魔法猫咪或窜天猴火箭的时候,在访问被代理的网站如Google的时候,工具发起了普通DNS请求,而不是从目标代理服务器发送DNS请求(aka 远端DNS请求),则ISP则会判断你在使用穿墙术进而触发反诈问候。

  3. 分流规则配置不合理,如以下规则(采用Surge语法),此处由于缺少no-resolve标志且IP-CIDR策略高于DOMAIN类策略,在访问所有域名时都会发起DNS请求来尝试判断域名是否匹配规则,进而在不配置加密DNS的情况下产生泄露。

1
2
3
[Rule]
IP-CIDR,3.0.0.0/15,🎥 奈飞视频
DOMAIN-KEYWORD,netflix.com,🎥 奈飞视频,extended-matching

此外再请求一个全新域名的时候,如$randomUUID.ipleak.net的时候,由于直连DNS服务器没有缓存,必将递归查询至权威DNS服务器,期间的递归次数越多,越容易产生泄露。

如何解决DNS泄露

我们再次回看定义,首先我们需要解决明文的DNS请求。本人使用AdGuard Home搭建了一套可同时服务于内网/VPN/公网的DNS服务内网通过53端口直连并作为上行网关拦截所有普通53端口并抢答,可以解决99%的明文DNS,此外在OpenVPN的配置文件里面指定DNS服务器为内网AdGuard Home的IP。

对于外网来说,由于ISP不通从外到内的UDP 53,且公网存在先前所说的网关审计,因此采用DoH/DoT/DoQUIC实现。通过在Surge、浏览器、AdGuard on macOS中设置同一加密DNS并在Surge内打开增强模式,接管所有电脑流量。

此处需要注意,由于AdGuard on macOS默认未开启HTTP3协议的支持,需要前往高级设置中启用dns.proxy.http3.enabled

从下图可以看到,唯一的明文DNS只有向AliDNS请求我的DNS域名的IP这一条记录,其他所有DNS均走加密DNS。

DNS Log in Surge

接着处理第二条,解决防止流量走除了自己设定DNS以外的DNS服务器。在Lulu或其他网络拦截器中拦截所有漏网之鱼,也就是目标地址不为Surge Fake-ip或你所使用的可以接管全局流量的工具的目标地址为UDP 53的请求。虽然目前没有发现有漏网之鱼,但是防患于未然总是好的。

此外,特别提醒。在AdGuard Home里面也需要确保所有DNS请求均为加密,否则将前功尽弃。并且国内DNS时长出现污染或因为管局要求进行劫持,以下是本人使用的DNS服务器。如果有想要使用Cloudflare的用户注意,国内部分ISP会屏蔽1.1.1.1的非Https流量导致不通但1.0.0.1可用。小道消息称部分ISP将其作为主路由/后台管理地址,本人持怀疑态度。

1
2
3
tls://1.0.0.1
h3://1.0.0.1/dns-query
tls://dns.google.com

有关搭建AdGuard Home的教程网上一抓一大把,以后会出一篇文章教学如何进行DNS分流,以降低延迟。

总结

来自一篇著名论文的开头提到一句话,本人在此稍作修改:

全加密与匿名化是当今互联网中的一块基石。

著名企业家Mr. What's your problem?先生说:

人们更愿意用隐私换取便利。

我认为隐私是人的基本权利,若无法在默认情况下得到实现,则我们需要想办法去自行争取。

下一篇文章应该是SNI匿名化与流量随机化,我们过会见。