加载中...
<cover></cover>

# 对抗校园网 DNS 污染，我有妙招

2022-10-15 技术向

本文最后更新于 天前，文中部分描述可能已经过时。

最近给寝室接入了学校网络信息中心免费提供的 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 污染，我有妙招
https://blog.hans362.cn/post/how-i-fight-against-campus-dns-pollution/
本文作者
Hans362
最后更新
2022-10-15
许可协议
CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议，注明出处、不得用于商业用途！
喜欢这篇文章吗？考虑支持一下作者吧～
爱发电 支付宝