对抗校园网 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,不妨试试本文的方法。

最后说一句,我能够理解学校这么做的考虑,但我认为堵不如疏,强制性的网络限制并不是一个好方法。

对抗校园网 DNS 污染,我有妙招
本文作者
Hans362
最后更新
2022-10-15
许可协议
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
喜欢这篇文章吗?考虑支持一下作者吧~
爱发电 支付宝

评论

您所在的地区可能无法访问 Disqus 评论系统,请切换网络环境再尝试。