192.168.2.4 是一台在端口 3128 上运行 Squid 代理的机器,以及一个在端口 80 上只能通过此代理访问的 Web 服务器。
如果我运行:
$ curl 192.168.2.4 --proxy 192.168.2.4:3128
它运行完美,并且 cURL 输出了主页的内容。现在,当我尝试使用 ProxyChains 时:
$ cat proxychains.conf
strict_chain
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
http 192.168.2.4 3128
$ proxychains curl 192.168.2.4
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-192.168.2.4:3128-<><>-192.168.2.4:80-<--denied
curl: (7) Couldn't connect to server
它不起作用。它似乎可以正确连接到 Squid 代理,但无法连接到最终 Web 服务器。
知道为什么会出现这种情况吗?
答案1
我发现与wireshark
代理对话时curl
使用GET
而proxychains
使用CONNECT
。 区别解释如下:“CONNECT” 和 “GET HTTPS” 有什么区别?
另一个答案提到了使用 的代理链CONNECT
。我认为GET
不能链式,这就是为什么proxychains
使用CONNECT
。
现在,有关 HTTP 隧道的 Wikipedia 文章说了以下内容CONNECT
:
并非所有 HTTP 代理服务器都支持此功能,即使支持此功能,也可能会限制其行为(例如,仅允许连接到默认 HTTPS 端口 443,或阻止看起来不是 SSL 的流量)。
确实,Squid 缓存 Wiki状态(重点是我的):
值得注意的是,传递的协议
CONNECT
不仅限于 Squid 通常处理的协议。确切的说,任何使用双向 TCP 连接的东西都可以通过CONNECT
隧道传输。这就是 Squid 默认 ACL 的开头,deny CONNECT !SSL_Ports
以及为什么您必须有非常好的理由将任何类型的允许规则置于它们之上。
我猜你的squid.conf
代码里有这样一行:
http_access deny CONNECT !SSL_Ports
我已经发现一个答案说的是注释掉这一行就足够了。经检查,它有效。但是,如果您不想在代理上打这么大的漏洞,请尝试将以下三行添加到您的squid.conf
:
acl myserver dst 192.168.2.4
acl myport port 80
http_access allow CONNECT myserver myport
# the original uncommented line must be below, like this
http_access deny CONNECT !SSL_Ports