什么是 DNS 污染
DNS 是什么
全称 Domain Name System, 域名系统,主要保存了 域名 和 IP 的对应关系,当我们请求一个网站的时候,需要先去 DNS服务器 根据域名查询到对应的服务器 IP。
因为只有通过 IP,才可以确定要访问的服务器。
当我们在浏览器中输入一个域名,比如 baidu.com 的时候,我们电脑需要去 DNS 服务器上查询对应哪个 IP。
DNS 服务器也是需要通过IP来确定的,所以我们电脑在配置网络的时候,需要配置 DNS,很多时候是路由器自动分配的,一般都是路由器的 IP 作为 DNS 服务器。
比如很多时候我们可以看到我们的 DNS 是 192.168.0.1 这样的 IP。
那路由器是如何知道全球所有域名对应的 IP 呢?
答案是,他不需要保存所有的,只有当你去查询的时候,他代替你去他上面配置的 DNS服务器去查询,然后缓存起来,下次查询就可以直接告诉你对应的 IP。
全球分布有很多的 DNS 服务器,单个服务器不可能让所有人都去查询他,这样单个服务器压力就太大了,又或者单个服务器出问题影响全球的网络,所以在全球有多个服务器会从这些根服务器中去同步数据,不同的地区就查对应地区的 DNS 服务器即可,减少压力的同时还增加了速度。
域名解析成 IP 的流程
当我们第一次在浏览器中输入域名 tizi8.com 你的电脑首先会从本地缓存的 DNS 中查询是否存在 tizi8.com 对应的 IP 信息,由于是第一次访问,所以不存在,然后就会对系统中配置的 DNS 服务器发起域名查询请求,一般就是本地路由器 IP(比如:192.168.0.1),本地路由器也不知道,然后像更上一级发起请求(比如可能是某个小区出口网关),如果还是没有,可能就像更上级发起请求(比如镇,市,省,国这样的级别一层一层往上发请求,当然这里只是简化了一下,真实情况并不会以省市县来划分),直到最后查询到域名对应的 IP,这样就完成了一次域名到 IP 的解析。
DNS如何污染域名
我们已经明白了域名解析的流程,所以只要运营商在任何一级的 DNS 服务器上返回假的 IP,就会导致我们无法知道服务器的真实 IP,导致无法打开网站。
最常见的就是 github.com 他在某些地方某些时候可能打不开,这就是典型的被 DNS 污染的情况。
如何防止被 DNS 污染
知道上面的原理之后,理论上只要使用权威的 DNS 服务器就行,比如:4.4.4.4和8.8.8.8以及1.1.1.1 不过依然没用,因为 DNS 的查询是明文的,GFW(长城防火墙)如果检测到你要查询的是他要封锁的域名,直接给你拦截下来,导致无法解析成功。
为了解决 DNS 查询是明文的问题,出现了DoH(DNS over HTTPS)就是 DNS查询通过加密的 HTTPS 通道传输,这样就不会被中间人检测和拦截了。
不过DoH一样可以被检测,比如你设置了谷歌的DoS API:https://dns.google/dns-query,GFW 可以通过 SNI 信息检测到你请求的是谷歌的DNS,直接给你断开。
扩展知识:
HTTPS SNI(Server Name Indication,服务器名称指示)是TLS(Transport Layer Security)协议的一个扩展功能,用于在建立加密连接时,客户端向服务器指示它想访问的具体域名。这在共享IP地址的服务器上尤为重要,因为多个域名可能托管在同一个IP地址上。
所以 DNS 污染是 GFW 最低级的封锁了。