質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

解決済

1回答

7078閲覧

プロキシチェインはどう動いているのか

退会済みユーザー

退会済みユーザー

総合スコア0

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

1クリップ

投稿2017/12/15 11:29

いつもお世話になってます。

プロキシチェインについての自分の理解はあっているでしょうか?
少し検索して調べたところProxy chaining: how does it exactly work?というものを見つけました

自分の理解ですと

client -> proxy1 -> proxy2 -> proxy3 -> proxy4 -> proxy5 -> server

という風に繋ぎたい場合には、まず、

clientからproxy1に

CONNECT proxy2:port HTTP/1.1 Host: proxy2

というリクエストを送る。
次に、 proxy2に対して

CONNECT proxy3:port HTTP/1.1 Host: proxy3

を送る。
これを目的のサーバーに到達するまで続ける。
ここでは全てがHTTPプロキシだということにしています。

CONNECTメソッドを使えば全てのTCPプロトコルをトンネルできるようになる。
そして、目的のサーバーまでコネクションが通ったら

GET / HTTP/1.1 Host: server

を送ればいい。

このようにすればプロキシのチェインを作ることができる。

ということであっていますでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

解決しました。
自分の理解で合っていると思われます(多分)。

(書く需要があるかどうかわかりませんが一応書いておきます。)
proxychains-ngというソケットのコネクションをsocks/httpプロキシにリダイレクトしてくれるツールのソースを読んでみました。

connect()をモックしている部分に

lang

1 2/* HTTPプロキシ*/ 3 4len = snprintf((char *)buff, sizeof(buff), 5 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n%s%s%s\n", 6 dns_name, hs_port, 7 dns_name, hs_port, 8 ulen ? "Proxy-Authorization: Basic " : dst, 9 dst, ulen ? "\r\n" : data); 10

というコードがありdns_nameには次のプロキシのドメイン名が入るようになっています。

socksプロキシについても同様に次のプロキシに対して接続するようになっていました。

configファイルでsocks/httpプロキシを複数指定できるようになっており、それらの情報を収めた構造体の配列を作っているようです。

そして、

lang

1 2proxy_data *p1, *p2, *p3; 3 4/* 一番最初のプロキシの構造体をとる */ 5if (!(p1 = select_proxy(FIFOLY, pd, proxy_count, &offset))) { 6 PDEBUG("select_proxy failed\n"); 7 goto error_strict; 8} 9 10/* それに接続 */ 11if(SUCCESS != start_chain(&ns, p1, ST)) { 12 PDEBUG("start_chain failed\n"); 13 goto error_strict; 14} 15 16/* 2つ目以降のプロキシ... */ 17while(offset < proxy_count) { 18 /* 構造体をとる */ 19 if(!(p2 = select_proxy(FIFOLY, pd, proxy_count, &offset))) 20 break; 21   /* 接続... */ 22 if(SUCCESS != chain_step(ns, p1, p2)) { 23 PDEBUG("chain_step failed\n"); 24 goto error_strict; 25 } 26 p1 = p2; 27} 28 29/* 最後に関数の引数(ここには書いてませんが)として渡された本来のサーバーに接続 */ 30p3->ip = target_ip; 31p3->port = target_port; 32if(SUCCESS != chain_step(ns, p1, p3)) 33 goto error; 34 35

このようにしてチェインを実現してるようです。

投稿2017/12/16 07:23

編集2017/12/16 07:25
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問