使用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 建立连接阶段进行了拦截与重定向:

  1. 流量接管:当我们在 ApiCatcher 中开启抓包时,手机上的APP发起的HTTP/HTTPS请求都会经过 ApiCatcher 启动的本地代理服务器。
  2. 代理层拦截 Host :当 App 尝试与目标域名(如 echo.apicatcher.net)建立连接时,代理服务器在准备发起真实 TCP 连接的阶段,会优先检查本地的 DNS 映射规则表。
  3. 替换物理 IP 连接 :如果匹配到了我们设置的映射规则,代理服务器会绕过公网 DNS 查询,直接向我们指定的 IP 地址发起 TCP 连接
  4. 对 TLS 握手透明无感 :由于我们只是在底层的 TCP 建立物理连接阶段替换了 IP 地址,HTTP数据包中的 Host 头部和 TLS 握手时的 SNI(Server Name Indication)信息依然保持原样。因此,对于严格的 HTTPS 握手,客户端的证书校验依旧可以正常通过,对 App 客户端来说完全是无感且透明的。

怎么配置呢?

  1. 打开 ApiCatcher App,点击首页顶部的 「+」 按钮,在弹出菜单中点击 DNS映射 ,进入 「DNS 映射」 配置页面。

  2. 点击右上角的 「+」 按钮新建规则:

    • 域名 :输入需要映射的域名,支持使用通配符(例如 *.apicatcher.net 会匹配所有二级子域名)。
    • IP 地址:输入你想要指向的目标服务器或本地电脑的 IP 地址。
  3. 开启抓包即刻生效 返回首页,点击开始抓包按钮启动代理服务。此时,手机上所有匹配规则的请求都将自动导向你配置的目标 IP。 如果只是想使用DNS映射功能,不想抓包,可以配置HOST黑白名单规则。

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

相关推荐
柳杉1 小时前
可视化大屏设计器脚手架:从设计到交付的一站式方案
前端·three.js·数据可视化
葫芦和十三2 小时前
图解 MongoDB 22|读写关注:持久性与一致性的档位选择
后端·mongodb·agent
葫芦和十三9 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp9 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑10 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯11 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan13 小时前
多Agent之间的区别
后端
kyriewen15 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
杨充15 小时前
1.面向对象设计思想
后端