遇到内网域名解析失败的情况时,很可能是火狐的 DoH(DNS over HTTPS)机制在背后作祟。它会绕过系统 hosts 文件和本地 DNS 服务器,把所有查询请求都强制转发到公共 DoH 服务器,导致内网域名根本找不到正确 IP。解决方案其实不复杂:手动配置一下 network.trr.excluded-domains 这个参数,让它识别哪些域名可以走本地 DNS。

火狐浏览器默认启用 DoH 后,所有 DNS 查询都改走 HTTPS 加密通道,包括那些本来应该直接连到内网的域名,比如 gitlab.internal、printer.lan,甚至 192.168.1.100 这类 IP 地址。结果就是解析失败、页面打不开。这个机制不会自动识别“内网域名”,也不会智能回退到本地 DNS,必须由你手动划定例外名单。
为什么内网域名会解析失败
DoH 这个机制,本质上就是应用层的 DNS 解析,它完全不理会系统 hosts 文件和本地 DNS 设置。只要 network.trr.mode 设为 2(强制使用 DoH),火狐就不会去查 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows),也不会向路由器或企业 DNS 服务器发送 UDP 53 请求。所有查询请求,全都一股脑儿发给你在 network.trr.uri 中配置的公共 DoH 服务器。而阿里、腾讯、Cloudflare 这些公共 DoH 服务,根本不可能解析你内网中的私有域名。
具体表现通常如下:
- 在浏览器里输入
https://intranet.company,结果弹出“无法找到服务器”,但用 curl 或者其他浏览器测试,却能正常访问。 - 打开
about:networking#dns查看,内网域名的查询记录中,Protocol 列显示的是 HTTPS,状态却是 failed 或 timeout。 - 关键点在于:DoH 本身没有“智能分流”能力,防火墙规则或 hosts 文件对它都不起作用。
配置 network.trr.excluded-domains 强制直连
想让内网域名不走 DoH,这是目前唯一靠谱的解决办法。核心思路就是告诉火狐:这些域名请直接跳过 TRR(Trusted Recursive Resolver),改用系统默认 DNS(即路由器或企业 DNS)来解析。不过,这个配置在图形界面里找不到,只能去 about:config 手动设置。
- 在地址栏输入
about:config,确认风险提示后进入,搜索network.trr.excluded-domains。 - 如果该配置项不存在,手动创建:右键选择“新建”→“字符串”,名称填写
network.trr.excluded-domains,然后填入要放行的域名列表。 - 值的格式要求很严格:必须是逗号分隔的纯域名,不能带
https://,不能带路径,末尾不能加点。例如:intranet.company,gitlab.internal,printer.lan。 - 它支持子域名匹配,比如你填入
internal,那么dev.internal和prod.internal都会被包含。但不支持通配符*或正则表达式。 - 配置完后无需重启浏览器,新建标签页即可生效。已经打开的那些页面,需要刷新或重新打开。
验证是否生效
光填完设置还不够,得确认流量到底走了哪条路。
- 打开
about:networking#dns,在“Recent Queries”表格中找到刚访问的内网域名,检查“Protocol”列:如果显示UDP或TCP,说明已成功绕过 DoH。 - 对比 TRR Status 那一行:如果状态是
active,但某次查询的 Protocol 变成了 UDP,就说明excluded-domains已生效。 - 如果还不放心,在终端里执行
nslookup intranet.company 127.0.0.1(假设系统 DNS 为本地 DNS),看能否解析出内网域名。 - 特别注意:填错格式是大忌。比如不小心加上了
https://或.company.这样的尾巴,该配置会被直接忽略,行为不会有任何改变。
补充:hosts 文件和 network.trr.mode = 5 的误区
很多用户遇到此问题,第一反应是修改 hosts 文件,或者调整 network.trr.mode 参数。但在当前 Firefox(114+)版本中,这些老办法基本失效。
/etc/hosts对 DoH 查询完全不可见——火狐根本不会读取它,除非你将network.trr.mode改回 0,彻底禁用 TRR。network.trr.mode = 5这个选项号称“仅对非 HTTPS 页面降级”,但这是旧版本遗留的设定,2026 年的主流版本早已弃用,设置上去也等于白搭。- 企业想通过策略文件
policies.json批量部署也不行——它不支持excluded-domains这个配置项。因此,企业环境中仍需用户去about:config手动补充。 - 最容易踩坑的一点:
network.trr.excluded-domains的数据类型必须是字符串,而不是布尔值或整数。一旦类型填错,整个配置就会静默丢弃,毫无效果。
