我在 Mac OS 10.9.5 机器上设置了 Internet 共享,将我的以太网连接共享给连接到创建的 Wi-Fi 热点的任何设备。我正在寻找一种方法来强制所有流量通过代理服务器,以便我可以使用 Charles 监控流量。
我曾以为,由于 Charles 自动在传出以太网连接上设置了代理设置(如上),所以所有 Wi-Fi 流量都已经通过代理,但我错了。似乎 Internet Sharing 创建了一个新的桥接器(目前名为“bridge100”),即使数据包从同一个网络接口发出,它也不会通过相同的网络服务运行。
我可以在 Charles 中看到我的机器生成的所有流量,但看不到其他机器的流量。有没有办法设置路由,以便我的以太网代理设置也应用于网桥?如果没有,有没有办法将网桥的流量路由到同一个代理?
答案1
我预计,如果可能的话,这不会简单。
当您拥有代理服务器时(无论是在机器本身上运行,还是在网络上的设备上运行),客户端应用程序(例如,任何发送到 inet 的应用程序)都需要将其流量定向到代理服务器(而不仅仅是直接定向到相关的网络接口)。这可以在客户端应用程序设置或操作系统级别进行配置。但是,当您在操作系统级别设置代理时,如屏幕截图所示,这可能是为用户会话设置的,可能不会影响守护进程(不确定)。
热点可能在守护进程级别运行,并且可能不尊重该代理设置。
换个角度考虑这个问题也许更有意义。例如,也许可以运行 ethereal 或其他数据包嗅探器,并查看到达以太网端口的流量(其中包括往返于基于 OSX 的热点的流量)。(数据包嗅探器的级别低于 Charles,但这可能是获得较低级别流量访问权限的代价。)
答案2
您研究过 OpenDNS 吗?您可以将路由器上的 DNS IP 替换为其 IP,然后您将能够查看网络上的流量日志。您可以通过登录 opendns.com 上的帐户来执行此操作。
您还可以拒绝特定域的流量。有一个“个人”免费计划选项。
答案3
您是否想知道 Charles Proxy 如何获取盒子上的所有 HTTP/HTTPS 流量?我可能应该对此进行更多研究,但我怀疑它将自己设置为系统代理。任何尊重操作系统上配置的出站代理的客户端都将使用出站代理,并且对 Charles 可见。但是有些客户端不这样做 - 例如curl
不会被 Charles 捕获(除非您以某种方式告诉 curl 使用代理,例如 --proxy 或 -x 或设置 http_proxy 等)。
因此,使用像 Charles 这样的非透明代理,您必须依赖客户端行为。
幸运的是,很多应用程序确实尊重系统级别的出站代理设置(许多应用程序也允许您指定应用程序配置)。因此,通过设置出站代理系统代理,您可以让很多应用程序(当然是浏览器)通过 Charles。
如果您有使用网络上的 Internet 共享对主机的管理员访问权限,那么您也可以将客户端的系统出站代理设置为指向您的 Charles 代理。
还有一件事 - 当我执行此配置时,Charles Proxy 希望我手动接受连接。Charles 可以接受与本地主机的连接,但当客户端来自另一个机器时,您必须手动接受连接。Charles 只会在每个主机上提示我一次。
对此的另一个想法:有网络机制可用于在客户端计算机上设置出站代理。系统可以从其 DHCP 查询中了解出站代理(当它们向网络询问其动态分配的 IP 地址时)。MACOS 是否允许您在进行 Internet 连接共享时指定出站代理?我不知道,这就是我找到您的帖子的方式。我目前正在寻找一种配置 Internet 连接共享的方法,以便也为客户端提供出站代理。
但是,如果您的互联网共享不允许您指定出站代理,则可能不值得采用自动方法并坚持在每个共享客户端上进行手动配置。
比 DHCP 方法更晦涩难懂的是 WPAD 方法。WPAD,即 Web 代理自动发现,是一种允许浏览器发现出站代理的技术(有点过于简单,因为它实际上可以提供用于查找多个出站代理的条件逻辑)。WPAD 可能仅适用于 Web 浏览器(但我认为任何支持 javascript 的客户端都可以使用它)。关于 WPAD 有很多资料可读,但除非您能够控制系统中的 DNS,否则它可能不适合您。
既然我要离题了,我的一个同事在树莓派上运行了相当于互联网连接共享的功能。树莓派设备还运行了 bind(DNS 服务器)和 dns-masq,这样它就可以拦截一些 DNS 查询并返回自己的 IP 地址。最后,它运行了一个 HTTP(S) 代理。因此,客户端会在不知情的情况下发送代理请求,然后这些请求将代表他们代理到预期的 URL。这就是我的同事避免在客户端上设置出站代理的方法。