我曾在上家公司工作中被DNS域名解析问题折磨过。 当时公司项目生产环境和测试环境使用的都是同一个域名,当我们需要将APP的流量 指向测试环境时,需要修改App的域名解析。如果在电脑端,我们可以非常简单地通过修改系统 hosts 文件来搞定。 但在 iOS 移动设备上,由于系统的沙盒与安全限制,我们无法直接修改 hosts。
当时我们是通过配置WIFI的DNS服务器为自定义DNS服务器解决问题。 但我们经常遇到这几个问题: 1、DNS解析有缓存,每次更改都需要清理缓存和重启APP。 2、因为缓存的存在,DNS解析有没有生效还需要根据接口响应来判断。 3、每次都要修改WIFI的DNS服务器,比较麻烦。 4、修改后还可能影响我们正常使用手机上的其它APP。
为了解决使用自定义DNS服务器遇到的这些问题,我们在 ApiCatcher 中增加了一个DNS欺骗的功能: 「DNS 映射」, 让我们可以在iOS上实现"自定义 hosts",将指定的域名重定向到自定义的 IP。
DNS 映射原理
在不能修改 iOS 系统 hosts 的情况下,ApiCatcher 是怎么做到让域名的解析结果发生改变的呢?
它的底层原理是在代理层的 TCP 建立连接阶段进行了拦截与重定向:

- 流量接管:当我们在 ApiCatcher 中开启抓包时,手机上的APP发起的HTTP/HTTPS请求都会经过 ApiCatcher 启动的本地代理服务器。
- 代理层拦截 Host :当 App 尝试与目标域名(如
echo.apicatcher.net)建立连接时,代理服务器在准备发起真实 TCP 连接的阶段,会优先检查本地的 DNS 映射规则表。 - 替换物理 IP 连接 :如果匹配到了我们设置的映射规则,代理服务器会绕过公网 DNS 查询,直接向我们指定的 IP 地址发起 TCP 连接。
- 对 TLS 握手透明无感 :由于我们只是在底层的 TCP 建立物理连接阶段替换了 IP 地址,HTTP数据包中的
Host头部和 TLS 握手时的 SNI(Server Name Indication)信息依然保持原样。因此,对于严格的 HTTPS 握手,客户端的证书校验依旧可以正常通过,对 App 客户端来说完全是无感且透明的。
怎么配置呢?
-
打开 ApiCatcher App,点击首页顶部的 「+」 按钮,在弹出菜单中点击 DNS映射 ,进入 「DNS 映射」 配置页面。
-
点击右上角的 「+」 按钮新建规则:
- 域名 :输入需要映射的域名,支持使用通配符(例如
*.apicatcher.net会匹配所有二级子域名)。 - IP 地址:输入你想要指向的目标服务器或本地电脑的 IP 地址。
- 域名 :输入需要映射的域名,支持使用通配符(例如
-
开启抓包即刻生效 返回首页,点击开始抓包按钮启动代理服务。此时,手机上所有匹配规则的请求都将自动导向你配置的目标 IP。 如果只是想使用DNS映射功能,不想抓包,可以配置HOST黑白名单规则。

DNS 映射规则的修改是即时生效的,只要开启了抓包。