我正在使用 Charles Web 调试代理软件来调试 HTTP 请求。它与我的桌面浏览器 Chrome 和 Firefox 配合得很好,它甚至可以看到其他程序发出的 HTTP 请求。
当我运行 Charles 并检查网络配置时,我想我明白了它是如何工作的——它只是为所有 HTTP 和 HTTPS 请求设置一个代理,然后在端口 8888 上监听这些请求:
然而我无法弄清楚的是,我看不到我在终端发起的任何请求,例如wget
、curl
或elinks
浏览器。
我知道我可以通过使用 127.0.0.1:8888 来通过 curl 和 wget 指定代理,但我不明白如果网络接口在配置中设置了代理,为什么我需要手动为它们指定代理。
另外我似乎无法让 BlueCrab(网站复制器)出现在 Charles 中 - 并且我没有看到它的代理设置 - 尽管我相信它正在使用 XWindow 包装器或类似的东西(所以它不是真正的原生 Cocoa / Carbon 应用程序):
如何让我的系统上的所有 HTTP 请求都通过 Charles 运行?
澄清
我的问题是关于系统基本原理的,为什么当网络接口设置为使用代理时 curl 和 wget 不使用代理,而不是询问 、 等的正确curl
语法wget
。
答案1
VPN 会创建一个新的网络设备,您可以在ifconfig
命令中看到它,然后将所有系统网络路由到该设备,您可以看到路由使用route
命令。
但是 HTTP 代理(在本例中为 Charles)不同,它只打开一个端口,要使用它,您必须指定应用程序设置以使用该端口进行 HTTP 操作。正如 Kevin Reid 的回答,curl
等wget
不会读取 OS X 的系统范围设置。
如果你的代理是 SOCKS(Charles支持HTTP 和 SOCKS),你可以使用代理链或者袜子因为应用程序不支持代理设置。
例如:
$ proxychains git clone https://github.com/rofl0r/proxychains-ng
答案2
答案3
原因为什么你不会得到所有 HTTP 请求的代理,因为操作系统级别,不存在“HTTP 请求”;只有 TCP 连接。联系 HTTP 代理意味着略微更改 HTTP 请求,以及联系代理服务器而不是 URL 中指定的主机,因此必须在实现发送 HTTP 请求的代码中完成此操作。
curl 和 wget 有自己的 HTTP 代码,使用自己的配置文件 - 它们没有被编程来查找 Mac OS X 保存它们的代理设置,也没有使用 Mac OS X 提供的使用这些代理设置的 HTTP 库。
答案4
如果你不想触碰你的配置文件,使用 curl 你可以执行以下操作:
curl http://example.com --proxy 127.0.0.1:8888