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


11

次のように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]]

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

よろしくお願いします。

回答:


14

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ます。ここで使用するかどうかはわかりません。

補遺 Netcatが示すように 、通常の HTTPプロキシ、たとえばSquid(私が知っているように)を使用するブラウザは、例で示したものとほぼ同じです。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

行動することで、このように、あまりにも、あなたは、HTTPプロキシを介してHTTPサーバにアクセスするためにNetcatを使用することができます。では、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要求は通常、明白なポートのみに制限されます。


@sr_ブラウザがサーバー部分を介してTCP接続をどのように達成するかについてもう少し詳しく説明していただけますか?socks4、socks5、connectと同じように、プレーンなHTTPプロキシ用のプロトコルもあるようです。これを確認していただけますか?どうもありがとう。
ハリー

1
@BruceEdiger、はい、確かに。私は0.1自分の無知を隠すために差し引いた。:)
sr_

1
@Harry私ncとFirefoxをいじくり回して、少しわかりやすくしていますか?
sr_

@sr_私が試しnc squid-proxy 3128に続いてGET http://webserver/sample HTTP/1.0、しかし、HTTP / 1.0 403は、禁止を得た(アクセスが拒否エラー)。
ハリー

1
ええと、すみません、わかりません。ここでは専門家ではありません、:)あなたはおそらくあなた自身の接続を使用しtcpdumpたりwireshark、あなた自身のCONNECT接続をタップして洞察を得たりすることができるのを見ます...
sr_

3

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


ありがとう、+ 1。非常に洗練された複雑なツールのように見えます。試しましecho "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDINたが、次のエラーが発生しました:2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden。さて、このツールを正しく理解しているかどうかを確認するために、次に、プロキシ以外の基本的な使用法を試しましecho "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDINたが、応答がありませんでした。だから、明らかに、私はここでsocatの使い方に何か不足しています。私の間違いを指摘していただければ幸いです。
ハリー

OK、代わりにSTDIO(または-)を使用して、非プロキシバージョンの呼び出しを機能させることができますSTDIN。しかし、プロキシバージョンでも同じエラーが発生します。
ハリー

1
別の更新:私が試したところecho "GET http://web-server/sample" | socat - TCP:squid-proxy:3128、うまくいきました。これが私が使用することになっている方法であるかどうかを確認しますかsocatPROXY:...アドレス指定の代わりに)?
ハリー、

1
こんにちは、私はあまり使用していませんが、正しいと思います。Socatはhttp-proxyへのプレーンなTCP接続を開き、squidがhttp-GETを解析して残りを行います。https btwで動作しますか?そして最後に別のリンク:technostuff.blogspot.com/2008/10/...
ファビアンZeindl

いいえ、まだhttpsを試すことはできません。私も間もなくhttpsについて心配するでしょう。ありがとう。
ハリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.