TokenPLS:tun 网关地址 +1 的 DNS 地址是预期行为
我们没有复现出来,先把已经排查掉的说清楚,再说需要你补什么。 **先解释 `.2` 这个地址不是 bug。** 隧道给系统下发的 DNS 服务器地址,按设计就是 tun 网关地址 +1:网关是 `198.18.0.1`,下发给系统的就是 `198.18.0.2`。这个做法和 sing-box 的 iOS 库一致。所以 `scutil --dns` 看到 `.2` 是预期的。 **关键在于:`.2` 上并没有真的监听一个 DNS 服务,它也不需要。** 隧道会把**所有**目的端口为 53 的流量拦下来交给内核处理,不管目的地址是什么——`.2`、`.1`、`8.8.8.8` 都一样。所以「`.2` 上没人监听」和「`.2` 不响应」是两回事,正常情况下它应该被拦截并正常应答。 我们检查了两条最可能导致它真的不响应的路径,都不成立: - 「拦截范围没覆盖 `.2`」——拦截是强制全量的(任意地址的 53 端口),这个行为从 2026-07-12 起就在,早于你使用的版本。 - 「内核的 DNS 服务没启动,导致每个被拦截的查询都失败」——配置里的 DNS 开关会被强制打开,这个行为从 2026-07-17 起就在,同样早于你的版本。 也就是说,按代码它不该发生,而我们本地没能复现。所以需要你补一点信息。 **能改变结论的四项,麻烦你提供:** 1. **确切的版本号和构建号**(关于 → 版本,形如 `1.0.x (3x)`)。「最新版」这几天有多个构建,差别很大。 2. **隧道连上之后**,这两条命令的输出: ```(节选)
作者原文@TokenPLS我们没有复现出来,先把已经排查掉的说清楚,再说需要你补什么。
先解释
.2这个地址不是 bug。 隧道给系统下发的 DNS 服务器地址,按设计就是 tun 网关地址 +1:网关是198.18.0.1,下发给系统的就是198.18.0.2。这个做法和 sing-box 的 iOS 库一致。所以scutil --dns看到.2是预期的。关键在于:
.2上并没有真的监听一个 DNS 服务,它也不需要。 隧道会把所有目的端口为 53 的流量拦下来交给内核处理,不管目的地址是什么——.2、.1、8.8.8.8都一样。所以「.2上没人监听」和「.2不响应」是两回事,正常情况下它应该被拦截并正常应答。我们检查了两条最可能导致它真的不响应的路径,都不成立:
- 「拦截范围没覆盖
.2」——拦截是强制全量的(任意地址的 53 端口),这个行为从 2026-07-12 起就在,早于你使用的版本。- 「内核的 DNS 服务没启动,导致每个被拦截的查询都失败」——配置里的 DNS 开关会被强制打开,这个行为从 2026-07-17 起就在,同样早于你的版本。
也就是说,按代码它不该发生,而我们本地没能复现。所以需要你补一点信息。
能改变结论的四项,麻烦你提供:
- 确切的版本号和构建号(关于 → 版本,形如
1.0.x (3x))。「最新版」这几天有多个构建,差别很大。- 隧道连上之后,这两条命令的输出:
dig @198.18.0.2 example.com dig @198.18.0.1 example.com
这一项最关键:它能区分「两个都没人应答」和「.1应答而.2不应答」——后者说明拦截确实漏了,前者说明问题在别处。- 配置里
dns:和tun:这两段(订阅链接、密码去掉即可)。我们特别想看dns.listen、dns.enable、tun.dns-hijack、tun.auto-route这几项——如果你的配置把dns.listen显式设成了198.18.0.1:53,那正好能解释你为什么在.1上看到了 DNS。- 机器上是否还装着其它 VPN 或改 DNS 的工具(Tailscale、Surge、Little Snitch 之类)。这类工具会参与系统解析器的顺序,有可能让隧道下发的 DNS 根本没被使用。
有这四项我们能直接定位。感谢。