校园网DNS问题复盘:Openwrt遇上内网解析

最近在配置我的软路由(J1900-WRT 搭配 OpenClash)时,遇到了一个颇为棘手的DNS解析问题,特别是涉及到重庆大学内网部分域名解析的场景。折腾许久后终于解决,特此复盘记录,希望能给遇到类似困扰的同学一些启示。

发现问题:无法解析内网域名

我的目标很简单:通过软路由,能够正常访问校园网的各种资源,包括一些仅限内网IP访问的平台,例如 aistudio.cqu.edu.cn

起初,我尝试在 OpenClash 中手动将第二DNS服务器设置为学校的DNS服务器地址 202.202.2.50。本以为这样就能让所有 .cqu.edu.cn 的域名都通过学校DNS正确解析,但事与愿违:my.cqu.edu.cnaistudio.cqu.edu.cn 都无法解析出地址。

奇怪的是,如果我取消OpenClash中的特殊DNS配置,使用默认的公共DNS:

  • my.cqu.edu.cn 可以解析出一个公网IP地址。
  • aistudio.cqu.edu.cn 却指向一个内网地址(例如 10.242.224.39),这显然从校外无法直接访问。

为了验证学校DNS服务器本身是否工作正常,我直接在软路由的Shell下执行 nslookup 命令指定DNS服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@J1900-WRT:~# nslookup aistudio.cqu.edu.cn 202.202.2.50
Server: 202.202.2.50
Address: 202.202.2.50:53

Non-authoritative answer:
Name: aistudio.cqu.edu.cn
Address: 10.242.224.39

root@J1900-WRT:~# nslookup my.cqu.edu.cn 202.202.2.50
Server: 202.202.2.50
Address: 202.202.2.50:53

Non-authoritative answer:
Name: my.cqu.edu.cn
Address: 172.20.214.57

结果表明,学校的DNS服务器 (202.202.2.50) 本身是能够正确返回 aistudio.cqu.edu.cn 的内网IP和 my.cqu.edu.cn 的公网IP的。那么问题出在哪里呢?为什么下级设备(我的电脑)通过软路由就无法获取这些解析结果呢?

一路排查

我先后尝试了以下措施:

  1. OpenClash nameserverpolicy 配置
    我尝试在Clash的规则中配置 nameserver-policy,想把所有 +.cqu.edu.cn 的域名解析请求都强制交给 202.202.2.50 处理。但在本地电脑上测试发现,所有 +.cqu.edu.cn 的域名仍然无法返回结果。

  2. OpenClash “第二DNS” 选项
    为了排除Clash核心或规则配置的干扰,我使用了OpenClash插件中的“第二DNS服务器”选项。这个选项允许DNS查询不经过Clash核心自带的DNS模块,而是使用一个独立的DNS服务(在OpenWrt上通常是Dnsmasq,它再将请求转发给这里配置的第二DNS)。我将第二DNS配置为 202.202.2.50
    配置完成后,在软路由上用 127.0.0.1 (即Dnsmasq) 作为DNS服务器查询,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@J1900-WRT:~# nslookup aistudio.cqu.edu.cn
Server: 127.0.0.1
Address: 127.0.0.1:53

Non-authoritative answer:
# 此处为空,没有返回Address

root@J1900-WRT:~# nslookup my.cqu.edu.cn
Server: 127.0.0.1
Address: 127.0.0.1:53

Non-authoritative answer:
# 此处为空,没有返回Address

注意到这次 nslookup 的输出中,虽然没有IP地址,但包含了 Non-authoritative answer: 字段。这与之前直接超时或无响应不同,可能DNS服务器实际上可能返回了某些信息,但被某种机制过滤或丢弃了。

DNS 重绑定保护 (Rebind Protection)

带着这个猜想,我搜索了OpenClash相关的Issue,发现有人在讨论自定义局域网IP(即自己做内网、外网双栈DNS)时,Clash无法正确返回局域网IP的问题。在其中一个回答中,我找到了关键线索:“关掉OpenWrt,网络 -> DHCP/DNS -> 高级设置 中的‘重绑定保护’字段”。

我立刻检查了我的OpenWrt配置(通常在LuCI界面的“网络”->“DHCP/DNS”->“高级设置”下),找到了名为“**重绑定保护 (Rebind protection)”的选项,并取消勾选了“丢弃 RFC1918 上游响应 (Discard upstream RFC1918 responses)**”。

保存并应用设置后,奇迹发生了!所有之前无法解析的校内域名,现在都能在我的电脑上被正确解析到对应的内网或公网IP了!aistudio.cqu.edu.cn 也能顺利访问。

原理剖析

我的DNS解析路径是:**下级设备 -> OpenClash (或直接到Dnsmasq) -> OpenWrt上的Dnsmasq -> 上游DNS (如 202.202.2.50)**。

问题就出在Dnsmasq的“重绑定保护”机制上:

  • DNS重绑定保护:这是一种安全特性,用于防止DNS重绑定攻击。如果一个公共域名在DNS查询后返回的是一个私有IP地址(例如 10.x.x.x172.16.x.x-172.31.x.x192.168.x.x 这些RFC1918定义的私有地址段),Dnsmasq会认为这可能是一次攻击(恶意网站试图将你重定向到内网设备),因此会丢弃这个解析结果。
  • 校园网的特殊性:像 aistudio.cqu.edu.cn 这样的域名,学校的DNS服务器 (202.202.2.50) 设计为:当从校园网环境(或使用校园网DNS)查询时,返回其内网IP地址 (10.242.224.39)。这是一个合法的、预期的行为,方便校内用户访问。
  • 冲突点:当Dnsmasq(开启了重绑定保护)收到上游DNS (202.202.2.50) 对 aistudio.cqu.edu.cn(一个公共可查询域名)返回的内网IP 10.242.224.39 时,它触发了重绑定保护机制,认为这是一个不安全的响应,并将其丢弃。这就是为什么我的下级设备收不到解析结果,表现为nslookup返回空或超时。

关闭“丢弃 RFC1918 上游响应”后,Dnsmasq不再因为上游DNS返回的是私有IP地址而丢弃解析结果,从而使得校园网内网域名的解析恢复正常。

总结

对于需要在家庭网络中通过软路由访问具有“分离DNS”(Split DNS)特性(即内外网解析结果不同)的校园网或企业内网资源时,如果遇到内网域名无法解析的问题,务必检查路由器上Dnsmasq(或其他DNS转发服务)的“DNS重绑定保护”设置。

虽然关闭此功能会略微降低针对特定DNS攻击的防护能力,但在家庭这种相对受信任的网络环境下,为了正常访问必要的内网资源,这通常是一个可以接受的权衡。

由于软路由openclash的特殊性,我不得不在室友不在时尝试修改,因此整个排查过程很痛苦,以至于我几乎放弃,幸好在这次我在github issue issue回答链接中发现了相关回答。鉴于其他高校同学也可能遇到和我一样的问题,在google gemini的帮助下,我把我的经历总结成了一篇blog,方便后来者快速解决问题。


校园网DNS问题复盘:Openwrt遇上内网解析
https://blog.zesuy.top/2025/05/11/School-Dns/
作者
zesuy
发布于
2025年5月11日
许可协议