对抗校园网 DNS 污染,我有妙招
本文最后更新于 天前,文中部分描述可能已经过时。
最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
更换 DNS?没那么简单
也许你会认为,既然只是学校网络信息中心提供的 DNS 服务器在特定时段不返回解析结果,那么只要改为使用公共 DNS 就能解决问题。没错,我一开始也是这样认为的,校内论坛上提供的解决方法亦是如此。
但是,在路由器上更换 DNS 后,却没有任何效果。我尝试在特定时段使用 nslookup
命令向校园网 DNS 服务器和一些公共 DNS 服务器查询 bilibili.com
的解析结果,结果很 amazing 啊!
Sat Oct 14 02:03:09 GMT 2022
== SJTU Primary ==
Server: 202.120.2.101
Address 1: 202.120.2.101 202.120.2.101.dns.sjtu.edu.cn
== SJTU Secondary ==
Server: 202.112.26.40
Address 1: 202.112.26.40 202.112.26.40.dns.sjtu.edu.cn
== 114 ==
Server: 114.114.114.114
Address 1: 114.114.114.114 public1.114dns.com
== DNSPod ==
Server: 119.29.29.29
Address 1: 119.29.29.29 pdns.dnspod.cn
无一例外地全部被阻断!我尚不清楚校园网是如何做到这一点的,或许是强制重定向所有 DNS-over-UDP 查询请求到校园网 DNS 服务器,导致请求根本没有到达 114 或 DNSPod 服务器,又或许是由于 DNS-over-UDP 查询是明文的,校园网出口能够识别出查询的域名,从而直接返回空结果。总之,这种情况下,简单地更换 DNS 服务器是无效的。
而且,即使这种方法有效,公共 DNS 会导致一些校内域名无法被正常解析,或无法返回最快的结果,同样会影响使用体验。
另辟蹊径
既然更换 DNS 无效,那么就只能另辟蹊径了。我想到的第一个方法是使用代理服务器,利用 dns2socks 等工具将 DNS 查询请求转发到代理服务器,再由代理服务器向公共 DNS 服务器查询结果,最后将结果返回给客户端。但这种方法需要一台境内服务器以确保速度,同时协议转换的过程对路由器的性能也有一定的要求。
因此,我决定使用另一种方法,那就是 DNS-over-HTTPS(DoH) 和 DNS-over-TLS(DoT)。二者都是 DNS-over-UDP 的替代方案,通过 HTTPS 或 TLS 协议向公共 DNS 服务器查询结果,从而避免了 DNS-over-UDP 查询请求被校园网通过某些方式污染的问题。
同时,为了避免上一节末尾提到的问题,我希望能够优先使用校园网 DNS 服务器进行查询,只有在校园网 DNS 服务器无法正常返回结果时才使用 DoH 或 DoT 向公共 DNS 服务器进行查询。SmartDNS 无疑是实现这一需求的绝佳工具。
SmartDNS,出击!
SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。 SmartDNS 同时支持指定特定域名 IP 地址,并高性匹配,可达到过滤广告的效果。
与 DNSmasq 的 all-servers 不同,SmartDNS 返回的是访问速度最快的解析结果。
支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。
(摘录自 SmartDNS 项目主页)
关于 SmartDNS 是如何实现择优解析,以及如何避免因测速导致 DNS 解析过慢的,可以参考 Sukka 的这篇文章。
根据 SmartDNS 的官方文档以及路由器的处理器构架,我下载了编译好的 armv7 二进制,并编写了配置文件。
bind :5362
speed-check-mode ping,tcp:80,tcp:443
server 202.120.2.101:53
server 202.112.26.40:53
server-https https://1.12.12.12/dns-query
server-https https://120.53.53.53/dns-query
server-https https://1.1.1.1/dns-query
server-tls dot.pub:853
server-tls 8.8.4.4:853
将 SmartDNS 运行后,我将路由器自带的 dnsmasq 的上游服务器设置为 127.0.0.1:5362
,然后…
Sat Oct 15 02:03:09 GMT 2022
Server: 127.0.0.1
Address 1: 127.0.0.1 localhost.localdomain
Name: bilibili.com
Address 1: 119.3.70.188 ecs-119-3-70-188.compute.hwclouds-dns.com
与此同时,SmartDNS 的日志也记录下了这次查询的过程。
[2022-10-15 02:03:09,372][ INFO][ dns_server.c:4236] query server bilibili.com from 192.168.50.1, qtype = 28
[2022-10-15 02:03:09,374][ INFO][ dns_client.c:3135] send request bilibili.com, qtype 28, id 3
[2022-10-15 02:03:09,376][ INFO][ dns_server.c:4236] query server bilibili.com from 192.168.50.1, qtype = 1
[2022-10-15 02:03:09,376][ INFO][ dns_client.c:3135] send request bilibili.com, qtype 1, id 4
[2022-10-15 02:03:09,376][ INFO][ dns_client.c:3135] send request bilibili.com, qtype 28, id 5
[2022-10-15 02:03:09,521][ INFO][ dns_server.c:1608] result: bilibili.com, qtype: 1, rtt: 4.1 ms, 119.3.70.188
[2022-10-15 02:03:09,981][ INFO][ dns_server.c:583 ] result: bilibili.com, id: 64281, index: 1, rtt: 4.1 ms, 119.3.70.188
[2022-10-15 02:03:09,981][ INFO][ dns_server.c:583 ] result: bilibili.com, id: 64281, index: 2, rtt: 5.3 ms, 47.103.24.173
对抗成功!
总结
本文利用 SmartDNS 解决了校园网 DNS 污染问题,成功构建了愉快的网络环境。如果你的校园网也存在故意污染 DNS 的情况,并且不想或不能直接更换公共 DNS,不妨试试本文的方法。
最后说一句,我能够理解学校这么做的考虑,但我认为堵不如疏,强制性的网络限制并不是一个好方法。
评论