跳到主要内容

设想你在家里,把公司文件服务器的地址输入浏览器。没有 VPN 时什么也打不开,因为这个名称只存在于公司网络内部;连上 VPN 后页面就能打开。这个小小的“奇迹”背后其实有一个决定:哪个 DNS 解析器来回答“files.corp.example 的地址是什么”?如果选错了,页面就打不开,即使 VPN 显示已经连接。

Split DNS(分流 DNS)就是让这个决定做对的安排。本文解释它是什么意思、与更为人熟知的 split tunneling 有何不同、各操作系统怎么实现,以及如何测试和排查。内容默认你知道 DNS 的作用是把名称转换成地址;如果还不熟,请先读 DNS 是如何工作的。

一个名称,两种答案:Split DNS 的思路

全球 DNS 只认识公开名称。而许多组织还有只在自己围墙内才有意义的私有名称,比如内网网站、构建服务器、打印队列、数据库主机。这些名称保存在组织自己的解析器上,有时同一个名称在内部和外部的答案还不一样:同一个网站,对外指向公共 Web 服务器,对员工则指向内部副本。这种做法常被称为 split-horizon DNS,是长期存在的正常网络运维方式。

当远程设备需要同时面对两个世界时,问题就出现了:笔记本既要访问公共网站,也要找到公司的私有名称。只用一个解析器很难两头兼顾:

  • 如果笔记本所有查询都问公司的解析器,那么公共浏览的查询都要经过公司,增加负担,还可能受公司策略过滤。
  • 如果笔记本只问家里或咖啡店的解析器,私有名称根本不存在,会以“找不到服务器”失败。

Split DNS 的办法是保留一份简短的规则:以这些域名结尾的名称,发给那个解析器;其余的发给这个解析器。这个决定针对每次查询,在设备本地、在任何流量发出之前做出。

Split DNS 与 split tunneling 是两件事

这两个词听起来很像,也常常一起配置,但回答的是不同的问题。

问题 Split tunneling Split DNS
被分开的是什么 网络流量 域名查询
判断依据 应用、目的 IP 范围或路由 域名后缀
目标 只让部分流量走 VPN 为每个名称问对解析器
配置错误时的后果 流量意外离开隧道,或到不了目标 名称解析失败,或私有名称被发给公共解析器
常见用户 任何 VPN 应用提供该功能的人 企业或自建 VPN 环境

可以只有 split tunneling 而没有 split DNS:VPN 承载去往办公网络的流量,但所有查询仍使用咖啡店的解析器,于是私有名称失败。也可以在全部流量走隧道的同时使用 split DNS,由隧道内不同的解析器回答不同的域名。什么是 Split Tunneling 深入讲解了流量那一侧,本文只讲名称。

各操作系统怎么实现

思路处处相同,但每个系统把规则列表放在不同的位置。知道这些名称,排查时会很有帮助。

Windows。 名称解析策略表(NRPT)把域名后缀映射到 DNS 服务器。VPN 客户端或公司策略可以添加条目,例如“以 .corp.example 结尾的名称发给这个解析器”。没有规则匹配时,使用网卡常规的 DNS 服务器。

macOS。 系统维护多份解析器配置,针对特定域名的配置可以绑定到 VPN 接口。把文件放在解析器目录下是技术用户常用的另一种机制,用来把一个域名指向一台服务器。

Linux。 使用 systemd-resolved 时,每个网络链路都带有一个 DNS 服务器列表和一个“路由域”(routing domains)列表。这些域名的查询会发给该链路的服务器。写成“~corp.example”表示“把这个域名发到这里,但不用于短名称补全”。

Android 和 iOS。 移动系统开放的手动调节更少。VPN 应用或设备管理描述文件可以请求针对域名的解析器,系统把它们作为 VPN 配置的一部分应用。

如果你只使用消费级 VPN 应用,几乎不会接触这些。只有涉及公司、学校或自建环境时,这些机制才重要。

跟踪两次查询经过分流配置

看一个实际例子。玛雅是在家办公的顾问。她的公司 VPN 只有一条规则:以 .corp.example 结尾的名称,发给隧道内 10.20.0.2 处的解析器;其余的使用家里的路由器。

  1. 她打开浏览器输入 wiki.corp.example。系统检查规则列表,发现后缀匹配,把查询通过隧道发往 10.20.0.2。公司解析器返回内部地址,比如 10.20.5.14,页面加载成功。
  2. 她打开第二个标签页,访问一个公共新闻网站。没有规则匹配,查询发给家里路由器的解析器,由它去问公共 DNS 并返回结果。VPN 没有参与这次查询。
  3. 她输入不带后缀的短名称 wiki。系统根据 VPN 配置补上搜索后缀 .corp.example,尝试 wiki.corp.example。如果缺少后缀列表,短名称就会失败。
  4. 笔记本想通过名称 office-printer.local 找打印机。这个名称使用本地网络的组播发现,根本不会发给任何解析器,所以 VPN 规则对它不起作用。

第 3 步的细节解释了一个常见抱怨:完整名称能用,短名称却不行。VPN 给了设备解析器,却没有给搜索域。

Split DNS 在现实中出现在哪里

  • 远程员工。 最常见的情形。员工用名称访问内部网站和工具,个人上网则使用家里的解析器。
  • 学生和研究人员。 大学可能只在自己的网络内用名称开放图书馆和实验室服务。带 Split DNS 的 VPN 让学生能访问它们,而其余连接仍留在本地。
  • 家庭实验环境。 运行 NAS、媒体服务器和智能家居中枢的人,常给它们起私有名称。带 Split DNS 的自建 VPN 可以在主人外出时解析这些名称,而不必把所有网页查询都送回家。
  • 小型办公室。 店里有本地文件服务器,同时使用云端记账工具,希望员工在家的笔记本也能解析服务器名称。
  • 多地点组织。 每个办公室都有自己的私有名称,它们之间的 VPN 链路用按域名的规则,把每次查询发给正确的办公室。

如果公司给了你 VPN 账号,可以问问私有名称是否应当可用。如果是,那么 Split DNS 规则列表就是配置的一部分。也可以参考 企业 VPN 与个人 VPN,了解这些环境与消费级使用的区别。

如何检查当前配置

不需要猜测,每个系统都能打印出解析器表。

  1. macOS: 打开终端运行 scutil --dns。找出列有域名和 nameserver 的解析器条目,带有“domain : corp.example”的就是分流规则。
  2. 使用 systemd-resolved 的 Linux: 运行 resolvectl status。每个链路会显示它的 DNS 服务器和 DNS Domain 列表,以 ~ 开头的域名仅用于路由。
  3. Windows: 在 PowerShell 中运行 Get-DnsClientNrptPolicy 查看规则,用 ipconfig /all 查看各网卡的 DNS 服务器和 DNS 后缀搜索列表。
  4. 针对某个解析器测试名称: nslookup wiki.corp.example 10.20.0.2 会直接询问那台解析器。如果它能回答而正常路径不能,说明规则列表有误或缺失。
  5. 测试泄漏方面: 在同一台设备上,断开 VPN 后查询一个内部名称,观察查询发给了谁。私有名称被发给公共解析器,就暴露了它的存在,而有些组织把这类信息视为敏感。

向 IT 团队求助时,请附上这些命令的输出。它能让对方一分钟就看明白,否则要来回沟通一个小时。

哪些地方会出问题

  • 规则列表不完整。 网络里新增了内部域名,却没有加进 VPN 配置,于是新域名失败而旧域名正常。
  • 域名重叠。 公共名称和私有名称共用同一后缀,例如都在 corp.example 之下,公共名称的查询被发给了无法回答的解析器。
  • 解析器只有隧道内才能访问。 私有解析器的地址通常是 RFC 1918 的私有地址段,VPN 掉线后无法访问,查询超时,应用看起来像卡住。
  • 改写查询的网络。 部分酒店或带认证页的网络会拦截 DNS,破坏分流规则。如果名称在移动数据下能解析,在酒店 Wi-Fi 下不能,就要怀疑网络本身。
  • 相互冲突的 DNS 设置。 安卓的“私人 DNS”或浏览器内置的加密 DNS 可能绕过系统规则,向公共解析器询问私有名称,结果是内部网站“找不到服务器”。
  • 缓存过期。 系统或浏览器记住了失败的查询。修正规则后,请清除 DNS 缓存或重启应用。
  • 缺少搜索域。 完整名称能解析、短名称不能,如前面的例子所示。

隐私与安全角度

Split DNS 是访问私有资源的便利手段,本身并不是隐私功能。有两点值得注意。

第一,你询问的解析器会看到你查询的名称。分流正确时,公司的解析器只看到公司的名称,家里或公共的解析器看到其余名称。这有时比把一切都发给公司更有利于隐私,有时又不如把一切交给值得信赖的隧道。没有放之四海而皆准的规则。

第二,规则错误可能泄露名称。如果内部主机名被发给了公共解析器,该解析器就知道这个名称存在,在本地网络上监听的人也可能知道,因为普通 DNS 没有加密。像“payroll-db”或项目代号这样的名称,即使主机无法访问,本身也是有价值的信息。这是 什么是 DNS 泄漏 所述问题的一种形式:查询去了你没打算让它去的地方。

对于一般的远程访问,NIST 的远程办公指南 SP 800-46 强调远程接入和终端的安全配置,其中包括确认 DNS 的行为符合设计,而不是想当然地认为它没问题。

消费级 VPN 需要 Split DNS 吗

多半不需要。消费级 VPN 应用通常设计为把所有流量和所有查询通过隧道发给同一个解析器。没有私有名称需要访问,也就没有什么可拆分的。在这种情况下更该检查的是相反的事:确认没有查询漏到隧道外面。

当你自己运行服务器、加入公司或学校的 VPN,或管理带有本地名称的路由器时,Split DNS 才有意义。如果你使用免费的 VPNclient 应用,配合价格页面上的预付通行证,采用应用的默认行为即可,不需要自己配置域名规则。

总结

Split DNS 让设备按域名挑选解析器:私有名称通过 VPN 发给私有解析器,其他一切发给平时的解析器。它不同于 split tunneling,尽管两者常常同时出现。操作系统通过规则表实现它,例如 Windows 的 NRPT 和 Linux 的路由域。出问题时,先打印解析器配置,直接询问私有解析器,再查找缺失的后缀、重叠的域名以及相互冲突的加密 DNS 设置。

常见问题

用最简单的话说,Split DNS 是什么?

就是设备同时使用多个 DNS 解析器,并按域名来选择。属于私有网络的名称(例如公司内网)通过 VPN 发给内部解析器,其他名称发给平时使用的解析器。

Split DNS 和分应用代理(split tunneling)是一回事吗?

不是。Split tunneling 决定哪些流量走 VPN,通常按应用或 IP 范围区分;Split DNS 决定由哪个解析器回答查询,按域名区分。两者常搭配使用,但各自可以单独存在。

Split DNS 会造成 DNS 泄漏吗?

如果私有名称的查询被发给了错误的解析器,就可能暴露内部服务的名称。正确的配置只会把私有名称发给私有解析器,泄漏通常源于规则写错,而不是 Split DNS 本身。

普通的消费级 VPN 应用会用到 Split DNS 吗?

大多数消费级 VPN 应用会把所有查询通过隧道发给同一个解析器,因此用不上 Split DNS。它主要出现在企业和自建 VPN 中,那里有些名称只存在于内部。

怎么知道我的电脑有没有启用 Split DNS?

用系统自带的工具查看解析器配置,例如 macOS 的 scutil --dns、Linux 的 resolvectl status,或 Windows PowerShell 的 Get-DnsClientNrptPolicy。如果看到绑定到特定域名的解析器,就说明在使用 Split DNS。

关于作者

Bob Kanokphon Thongdee,XPASS VPN 创始人

Bob Kanokphon Thongdee

  • XPASS VPN 创始人
  • eSIMonline.asia 联合创始人
  • 7 年以上网络营销经验
  • Cojourney Visa 与 Cojourney Travel 创始人

短途出行或忙碌的一个月,需要 VPN?

XPASS 提供按天数计算的预付通行证。一次付款,不会自动续费。

查看通行证

继续阅读

VPN 安全

什么是分流隧道(Split Tunneling)?

分流隧道让你选择哪些应用或网站走 VPN,哪些直接访问互联网。它很灵活,但也会改变被保护的范围。

阅读约 9 分钟

VPN 基础

DNS 是如何工作的:从域名到 IP 地址

DNS 是把网站名称转换成设备实际连接的 IP 地址的查询系统。本文逐步讲解一次查询的过程,以及它为什么与隐私有关。

阅读约 9 分钟

VPN 安全

什么是 DNS 泄漏?

DNS 泄漏是指设备在 VPN 隧道之外查询网站地址。本文说明它为什么发生、如何检测,以及该怎么处理。

阅读约 10 分钟

VPN 基础

企业 VPN 与个人 VPN:有什么区别?

个人 VPN 保护一个人的连接;企业 VPN 把员工和办公地点连到公司系统,并控制谁能访问什么。本文说明如何区分二者。

阅读约 9 分钟

选购指南

远程办公该选什么 VPN:需要检查的要点

个人 VPN 与公司 VPN 作用不同。本文说明两者的区别、VPN 对视频会议和云应用的影响,并为远程办公者和自由职业者提供检查清单。

阅读约 9 分钟