Surge 的 DNS 与 DHCP

若 DNS 设置为 system, 在开启 surge 的 DHCP server 时,会有如下错误。提示需增加 DNS.

Please configure at least one DNS server in Surge's DNS settings. You cannot depend on the system's DNS settings if Surge acts as the DHCP server.

No-DNS-prevent-dhcp

处于好奇,开始研究开启 surge 时 dns 的表现。为叙述方便,假设「路由器地址」和「DNS 地址」均为 192.168.1.1

增强模式

在只开启代理模式时,DNS 无变化,为 192.168.1.1. 开启增强模式时,DNS 变为 198.18.0.2, 并有有如下提示:

Some applications may not obey the system proxy settings. Using enhanced mode can make all applications handled by Surge.

Surge will setup a virtual network interface (VIF) and register as the default route. All DNS questions will get answers with a virtual IP in 198.18.0.0/15 block.

所有的 DNS 查询都将被 VIF 接管,VIF 返回一个处于 198.18.0.0/15 网段的 Fake IP, 真正的 DNS 查询由 VIF 发往 DNS 设置。

网关模式

在开启网关模式时,所有被接管设备的 system's DNS 变为 192.18.0.2, 并返回虚假 IP, 图为 iOS 设备的 DNS 解析结果

CleanShot 2023-05-24 at 17.12.39@2x

这也意味着,若通过域名如"device.local"连接本地设备时,因为得到的 IP 位于 198.18.0.0/15 网段,请求并不会直接发往本地设备,而是发往网关,再由网关进行中转。

当被接管设备开启 Surge 增强模式时,情况发生了变化,此时由于本地 VIF 已经被分配了 192.18.0.2, 所以发往 System's DNS(192.18.0.2) 的请求无效。需要另外设置 DNS 地址,且该 DNS 地址必须经过网关。如8.8.8.8. 此时网关会劫持 8.8.8.8 的 DNS 请求,并返回 Fake IP

DNS 劫持

若设置了一个局域网内的 DNS 地址会发生什么呢?由于此时网关无法接管 DNS 请求,得到的流量都是指向一个个 IP 地址而没有域名信息 所以此时根据域名定义的分流规则会失效,且无法看到流量的域名。

当 DNS 设置为 192.168.1.1 时,可以看到设备返回了 Real IP, 而不是 198.18.0.0/15 网段的 Fake IP, 说明 DNS 解析未经手网关。

CleanShot 2023-05-24 at 18.20.11@2x

可以从网关的设备请求列表看到,其 URL 都是一个个 IP 地址,而不包含 Domain

CleanShot 2023-05-24 at 18.25.36@2x

iOS 设备上的表现

不同于 macos, 开启 Surge 时 DNS 地址并未发生变化。且被接管时的表现也未发生变化。可能 iOS 上的运行机制有所不同,iOS 上的 Surge 并未占用 198.18.0.2.

updatedupdated2023-06-052023-06-05
Update https-ca.md