DNS的执行原理

首先,让我们来回顾一下DNS的执行原理。
DNS的执行原理即是IP和域名的相互解释(映射),从而使得互联网的大规模民用成为可能。举个栗子,我们通查上百度的时候大多数人并不会直接发送访问IP地址的请求,而是记住了百度的域名www.baidu.com,回车键发送了访问请求。但网关是不认字的,这也就是说,发送数据的过程中有一个进程为我们将域名转换为了IP地址。
是的,这就是DNS(Domain Name System)服务器在帮我们这个忙————

DNS服务器分布于全球,美国的DNS服务器有ISPs此类的机关维护,中国服务器亦有运营商维护。当我们向外网发送了封装了域名的数据包之后,DNS系统便会帮我们查询其对应IP:
它首先检查浏览器DNS缓存和操作系统缓存列表(可通过cmd的ipconfig和displaydns命名查询)中是否存在对应网站的IP,若发现有则直接响应,若没有,浏览器即构建一条DNS查询的应用层数据包,通过默认端口53和DNS默认的传输方式UDP传输到下一层,网络层封装源IP和本机电脑配置的DNS服务器(目标IP),物理接口层封装MAC地址从网口发送数据。
数据来到路由器,路由器获取到数据包目标IP即是自己(网关兼任DNS服务),马上查询缓存列表是否有百度的IP地址。若没有,路由器即构建一个应用层数据包,查询baidu.com的IP地址,目标IP即为路由器配置的上游DNS服务器.上游DNS接续查询自己的缓存列表,若没有则一步步上溯(迭代查询),直到在某个服务器中查询到为止。
DNS服务器对转发有一定的规则,最简单的,假如服务器没有配置DNS转发,就不会转发DNS请求。其次,DNS对选择转发服务器有负载均衡的需求,所以这一复杂的部分还亟待读者自行探求.

DNS泄露的原因

简而言之,DNS泄露就是当我们使用代理服务器访问互联网时,电脑给目标IP地址发送了明文DNS请求。所以我们需要检查一遍DNS服务器的缓存列表:
找到一个DNS服务器,打开其开发者面板,查看网络工具,发现网站在不停地发送请求。
这样做有什么目的?就是为了确保我们的DNS服务器和上游服务器缓存中都没有这一条记录。此时,浏览器中没有找到缓存,会构建查询域名IP的DNS请求,此时既然上游没有DNS缓存,那么自然是运营商的DNS来接收该请求。
运营商的DNS会交给多个不同的上游DNS服务器解析,最终交给权威DNS服务器。权威DNS的服务器设置了泛解析,查询任何子域名都可以查询到对应IP。
此时————权威服务器将结果返回给我们时,将你要找的IP和查询DNS的服务器记录了下来。每个人发起的请求中域名都不一样,一查就知道是你在用……
除此之外,权威DNS服务器还能获取到你的IP归属地,获取你所使用的下游DNS的IP地址。假设你使用了任播DNS,但上游DNS仍取决于该任播DNS的IP属地,假如是美国的,就会泄露该美国上游DNS服务器的IP,中国的则会泄露该中国运营商的DNS的IP。

接入代理后DNS泄露的隐患

接入代理后,电脑浏览器不再构建DNS查询请求,直接把我们访问某网站的请求交给代理客户端。此时代理客户端有两种处理你访问网站的请求的方式。
第一种是安全的。不发起DNS请求判断直连还是代理访问,也就是白名单。
第二种是不安全的。代理服务端发起DNS请求,再获取IP,再判断是否直连或代理。显然,第一种要比第二种更加智能也更加安全。并且可以注意到,DNS泄露的根本原因就在于是否发起了DNS请求,若如此做,泄露的概率极大:你拿到了某网站的IP,马上给其他服务器发送加密数据,这样,你加不加密都知道你加密的是啥了~
请注意外国任播DNS服务是不能防止DNS泄露的,因为这条DNS请求完全明文,并未加密(可用DoT或DoH进行加密,或远程DNS,这些配置有些服务器供应商是提供的),这种明文是极好获取的,会发生什么不用说了吧~

DNS污染原理

DNS污染全称网域服务器缓存污染(DNS cache pollution)或域名服务器缓存投毒(DNS cache poisoning),即是(黑客)通过制造一些域名服务器数据包等手段把域名指向不正确的IP地址,这样当用户访问该域名时会转到不正确的IP地址,从而窃取用户信息、资料或破坏正常服务。

黑客常利用UDP是无连接不可靠的协议这一点,对UDP53端口的DNS查询进行入侵检测(关键字匹配),一旦匹配上,黑客服务器立即伪装成目标域名的解析服务器,篡改返回结果。这一过程其实很好操纵,因为DNS请求本身非常好修改。有时有一些网站上不去,就是可以通过关键字匹配你的请求将返回IP改成127.0.0.1,达到干扰目的。

应对DNS污染

1.使用SSH加密代理,远程DNS解析,VPN。
2.修改Hosts文件,操作系统中Hosts文件权限高于DNS服务器,于是访问前优先检测Hosts文件,再查询DNS。在Hosts文件中添加DNS污染地址可以解决。
3.浏览器(软件)直接忽略返回结果是虚假IP地址的数据包(需要一些软件商提供服务)。
4.DNSCrypt或其他软件提供可靠TCP连接。