使用ApiCatcher在 iOS 上像修改 hosts 一样自定义域名解析 我曾在上家公司工作中被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 握手时的 SNIServer Name Indication信息依然保持原样。因此对于严格的 HTTPS 握手客户端的证书校验依旧可以正常通过对 App 客户端来说完全是无感且透明的。怎么配置呢打开 ApiCatcher App点击首页顶部的「」按钮在弹出菜单中点击DNS映射进入「DNS 映射」配置页面。点击右上角的「」按钮新建规则域名输入需要映射的域名支持使用通配符例如*.apicatcher.net会匹配所有二级子域名。IP 地址输入你想要指向的目标服务器或本地电脑的 IP 地址。开启抓包即刻生效返回首页点击开始抓包按钮启动代理服务。此时手机上所有匹配规则的请求都将自动导向你配置的目标 IP。 如果只是想使用DNS映射功能不想抓包可以配置HOST黑白名单规则。DNS 映射规则的修改是即时生效的只要开启了抓包。