DNS简介

DNS即Domain Name Server,即域名解析服务器,默认53端口、UDP连接、明文传输,可能会受到污染、劫持和监听。

DNS

DNS解析过程

浏览器提取url中域名部分,首先查询浏览器缓存,若未命中,查询系统hosts文件,若未命中,则向出口网卡指定的DNS服务器发送请求。若未指定,则默认为为DHCP握手响应的DNS服务器,即一般是本地ISP的DNS服务器发起递归查询。本地ISP收到DNS请求后,查询缓存,若未命中,则向根(root)、顶级(TLD)及地方权威域名服务器发起迭代查询,如图1。浏览器收到响应后,根据TTL值将域名缓存到本地。
图1:DNS流程
More info: Search in Google

劫持和污染

1
nslookup google.com

1.本地ISP出于审查和减少网间结算的目的,对DNS请求进行记录和劫持;
2.在国际入网口,GFW会按照黑名单封锁二级和三级域名,将大量域名污染到黑洞IP;
3.学校、企业等部署内网审计设备,通过上游部署旁路由,对53端口流量进行劫持和记录。
4.部分国产os会将用户指定的dns更改为受审查的dns。

More info: 维基百科:DNS污染

直接输入IP可以吗?

如果DNS遇到污染,我们直接输入IP能否正常连接?我们知道,对于HTTPS网站,TCP握手后需要先建立安全的套接字协议连接,即TLS连接。如果直接在浏览器中输入IP,浏览器会根据HTTPS协议选择默认端口443。客户端发出sni字段留空的Client Hello请求。如果这个IP托管有多个服务器(证书),由于SNI无效,服务器只能向客户端投递“缺省证书”+公钥+哈希值签名,在客户端进行证书链验证时,会出现证书配置错误,无法进行安全连接。

我的解决方案:OpenWrt+OpenClash+AdguardHome

我一向不主张分流策略。分流DNS是不安全的行为。我们以Openwrt下Clash客户端为例。

OpenClash建立虚拟网卡ech0、注册ip rule,并监听0.0.0.0:53和::1:53。遇DNS请求时,OpenClash会根据域名解析策略(ip on demand/ip if not match/asls)处理这个域名。我们以默认的ip if not match策略为例,首先clash会匹配基于域名的规则,如匹配到Direct规则,则通过nameserver直接解析。如果nameserver本身包含域名,则由default nameserver充当其bootloader DNS服务器。如匹配到Proxy规则,则使用Clash DNS解析。
clash DNS也有2种处理模式,我们以常见的fake ip模式为例。当没有匹配到域名规则时,OpenClash首先会去匹配fakeip缓存,其次去匹配fakeip过滤器,如果在其中,则使用nameserver直连解析。否则将会建立一项fake ip映射表,真实ip由nameserver+proxy和fallback+proxy并行查询解析,取其最快响应ip。
这会造成,如果一个网站在html中通过js嵌入一些如”*.qq.com”的简单请求时,会导致用户的代理匹配基于域名的direct规则,使用直连DNS解析为国内CDN,并通过直连连接,造成了DNS泄漏和IP泄漏。在无跨域错误的情况下,网站可获得危险(实名)的国内IP,对用户造成安全隐患。
通过Openwrt作旁路由,上游网关指向主路由。DHCP服务器桥接真实网卡,将网关指向旁路由的静态IP。Adguard Home监听0.0.0.0:53,开启重定向,上游DNS为CLash监听DNS端口,Clash关闭53端口劫持。


DNS简介
http://example.com/2025/08/16/hello-world/
作者
Androw Smith
发布于
2025年8月16日
许可协议