web-dev-qa-db-ja.com

netcatに既存のHTTPプロキシを使用させる方法

次のようにWebサーバーに直接アクセスすることで、Webページに問題なくアクセスできます。

$ echo "GET /sample" | nc web-server 80
This is contents of /sample...
$

ここで、プロキシ設定でFirefoxブラウザを構成してHTTPプロキシ経由で実行できるように、netcatにSquid HTTPプロキシ経由(ポート3128でリッスン)経由で送信したいと思います。

私は以下を試しましたが、うまくいきませんでした:

$ 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のmanページからの抜粋:

 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トラフィックのルーティング)を達成する方法が複数ある場合は、それらをすべて共有していただければ幸いです。

よろしくお願いします。

11
Harry

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呼び出しの後、プロキシとして127.0.0.1ポート8080を使用するようにFirefoxを構成し、開こうとしましたグーグル、これは出力されたものです(クッキーを除いて):

_$ 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 Webサーバーにアクセスしようとするとどうなりますか?ブラウザは確かにトラフィックを真ん中に誰にも公開しないので、直接接続が必要です。これが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リクエストは通常​​、明らかなポートのみに制限されます。

14
sr_

Socatを見てください: http://www.dest-unreach.org/socat/doc/README

3
Fabian Zeindl