我目前有一个程序,它从服务器(假设是 google.com)请求数据,并从同一服务器获取回复。此应用程序适用于 Android、iOS 和 Windows 等多种设备。部署到此服务器很困难,因为后端非常庞大,所以我想做的是拦截该流量并将其重定向到本地服务器,以便在整个网络上进行开发,以查看它在其支持的所有设备上的运行情况。
应用程序访问服务器及其所有子域 (因此*.google.com
)。我想要做的是将应用程序中的所有流量路由到完全不同的服务器,即 localhost,然后在我在 localhost 上完成编辑后将后端部署到主服务器。
所有流量将类似于此图
对于所有请求:
*.google.com ---------> localhost:8080
应用程序期望它正在请求内容,
*.google.com
但实际上它正在从端口上的本地主机请求内容8080
对于响应:
*.google.com <-------- localhost:8080
应用程序期望从 获得响应,
*.google.com
但从 localhost 的 port 获得响应8080
。请求的格式与从 获得完全相同,*.google.com
因此除了内容不同之外,应用程序不会注意到差异。
我已经设置了我的本地服务器来自动接受和识别应用程序要求的任何请求,因此回复应该不是问题。
唯一出现的问题是重新路由整个网络的所有流量。不过我认为这并非不可能,因为我见过像 pihole 这样的网络范围的实用程序做类似的事情,它们使用过滤器来阻止处理广告的特定域。我不介意在多个设备上更改我的 DNS,因为我所希望的只是能够重新路由任何流量,如上所述。
是否有可用的工具可供我使用,还是我必须自己创建?有哪些资源可用?
答案1
您可以通过不同的方式实现此目的:
对属于目标服务的所有 IP 地址执行目标 NAT。这允许您重写数据包的端口和目标 IP。
使用带有静态条目的 DNS 服务器。这将只允许您修改目标地址,而不能修改端口。
这两种方法都符合实现全网重定向的要求。但是,这两种方法都会破坏 HTTPS。要正确拦截 HTTPS,您需要:
- 创建 HTTPS 代理
- 在每个客户端应用程序中注册该代理的证书(或认证机构)(例如在 Firefox 中)
- 在每个客户端应用程序中注册用于特定流量形状的代理。
正如您所看到的,您可能必须放弃对 HTTPS 的要求或采用网络范围的解决方案。
此外,需要知道的是,虽然基于 DNS 的方法(例如 pihole)应该为整个网络工作,您很容易受到“愚蠢客户端问题”的影响。客户端实际上并没有被迫使用其操作系统的 DNS。例如,某些浏览器默认启用了 DoH;这绕过了操作系统上配置的 DNS。