我可以通过直接访问我的网络服务器来访问网页,如下所示:
$ echo "GET /sample" | nc web-server 80
This is contents of /sample...
$
现在,我希望 netcat 通过 Squid HTTP 代理(监听端口 3128),就像我可以通过其代理首选项配置 Firefox 浏览器并让它通过 HTTP 代理一样。
我尝试了以下方法,但没有成功:
$ echo "GET /sample" | nc -x squid-proxy:3128 web-server 80
<Seemed to be blocked FOREVER on input, so I killed it.>
<Ctrl-C>
$
注意:我使用的是 RHEL 5.3 版本的 netcat,它具有以下选项:
$ nc --help
nc: invalid option -- -
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
手册页摘录nc
:
EXAMPLES
<snip>
Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080.
This example could also be used by ssh(1); see the ProxyCommand directive in
ssh_config(5) for more information.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
现在,因为我的不是 ssh/SSL 用例,所以我不确定如何使用-x
/-X
选项,甚至不知道是否应该使用它们!
如果有不止一种方法可以实现上述目标(即通过 HTTP 代理路由 netcat 流量),那么如果您能分享所有这些方法,我将不胜感激。
提前谢谢了。
答案1
Netcat 不是专门的 HTTP 客户端。通过 Netcat 的代理服务器连接意味着通过服务器创建 TCP 连接,这就是为什么它需要带有参数的 SOCKS 或 HTTPS 代理-x
,由 指定-X
:
-X proxy_protocol
Requests that nc should use the specified protocol when talking
to the proxy server. Supported protocols are “4” (SOCKS v.4),
“5” (SOCKS v.5) and “connect” (HTTPS proxy). If the protocol is
not specified, SOCKS version 5 is used.
connect
指定通过代理服务器创建 SSL (HTTPS) 连接的方法。由于代理不是另一个端点,并且连接是端点加密的,因此请求CONNECT
允许您通过 HTTP 代理建立点对点连接的隧道(如果允许)。 (我可能会在这里掩盖细节,但这不是重点;有关“HTTP CONNECT
隧道”的详细信息请参见此处)
所以,要使用代理连接到您的网络服务器,您必须执行网络浏览器会执行的操作 -与代理交谈:
$ nc squid-proxy 3128
GET http://webserver/sample HTTP/1.0
(这个问题与这个问题有相似之处;不知道proxychain
这里有没有用)
附录
浏览器使用普通的HTTP代理,例如Squid(据我所知),或多或少执行示例所示的操作,正如Netcat可以向您展示的那样:调用后nc
,我将Firefox配置为使用127.0.0.1端口8080作为代理并尝试打开google,这是输出的内容(减去 cookie):
$ nc -l 8080
GET http://google.com/ HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Proxy-Connection: keep-alive
通过行为这边走您也可以使用 Netcat 通过 HTTP 代理访问 HTTP 服务器。现在,如果您尝试访问 HTTPS 网络服务器,会发生什么情况?浏览器肯定不应该向任何人透露流量在中间,所以一个直接连接是需要的;这就是CONNECT
发挥作用的地方。当我再次启动nc -l 8080
并尝试访问(例如,https://google.com
将代理设置为 )时127.0.0.1:80
,结果如下:
CONNECT google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Proxy-Connection: keep-alive
Host: google.com
您会看到,CONNECT
请求要求服务器直接连接到google.com
, 端口443
(https)。 现在,这个请求有什么作用?
$ nc -X connect -x 127.0.0.1:8080 google.com 443
实例的输出nc -l 8080
:
CONNECT google.com:443 HTTP/1.0
所以它使用同样的方式来创建直接连接。然而,由于这当然可以用于几乎任何事情(例如使用corkscrew
),因此CONNECT
请求通常仅限于明显的端口。