トップページに戻る
tokix.netはネットワーク・セキュリティ周辺から半径rな雑文を垂れ流す不定期更新個人サイト>>このサイトについて

小学生でも分かるプロキシ講座

<<トップカテゴリー「NetChildren」に戻る

小学生でも分かるプロキシ講座(1) (>>この記事のみを表示)

このコンテンツは、プロキシの基本的な話を既に知っている人に発展的内容・・・例えば「プロキシとは結局のところ何なのか」といった・・・と提供するモノです。

まずは、この連載を読み始める時点で知っているであろうプロキシ関連情報を羅列します。もし「知らなかった」というのがあったら「そういうものなのか」と思って下さい。それで「参考」を見るなりキーワードっぽいのをgoogleで検索するなりすれば分かると思います。
□1:何故プロキシはIPを隠すのか
プロキシ(プロクシ・Proxy・串・・・)とは「代理」という意味である。俗に言われる「串」とは「HTTPプロキシ」の意であり、これを使うと本来は直接的な「クライアント←→ウェブサーバー」というコネクションが「クライアント←→プロキシサーバー←→ウェブサーバー」という具合になり、ウェブサーバーから見た「接続元」がクライアントではなくプロキシサーバーになる。ウェブサーバーが取得する「接続元IPアドレス」がクライアントではなくプロキシサーバーの物になる訳だ。
※参考:小学生でも分かるIP抜き講座(1)
「何故『接続元のIPアドレス』が分かるのか」という基本的な原理
※参考:小学生でも分かるIP抜き講座(3)
「プロキシサーバーを『第三者』とすることでIP抜きを免れる」という基本的な原理
□2:プロキシのポート番号
HTTPプロキシの多くはポート8080で公開されている。この事実を利用すれば、使用可能なプロキシがリストアップされた俗にいう「串集(プロキシリスト)」を効率よく検索エンジンで探すことが可能である。
※参考:検索マニヤ〜串集の探し方〜
□3:プロキシの設定方法
InternetExplorerの場合は「ツール」「インターネットオプション」で行う。その他各種ツールを利用すれば更に楽に設定を行うことが出来る。
□4:漏れ串とは
プロキシの中にはクライアントのIPアドレスを完全には隠さないサーバーも存在する。こうしたプロキシは俗に「漏れ串」と呼ばれる。それっぽい言い方をすれば「環境変数FORWARDED_FORにクライアントのIPアドレスを記述するプロキシ」ということになる。
□5:プロキシ特有の環境変数
さらに、クライアントのIPアドレスを漏らさない串の中にも「自分はプロキシです」という情報をウェブサーバーに伝えてしまうプロキシも存在する。それっぽい言い方をすれば「プロキシ特有の環境変数を記述するプロキシ」ということになる。こうしたプロキシでは、いわゆる「串弾き」を潜ることができない。
※参考:ReadMe!不正投票マニュアル(3)
初歩的な「串弾き」の原理等
□6:広義のプロキシ
「串」とは「メカニズムによる総称」というよりは「役割による総称」であり、広義にはHTTPプロキシ以外・・・例えばCGIプロキシ(URLを入力するとCGIサーバーが当該ウェブサーバーに接続しデータを受け取りクライアントに送る、というCGI)・・・も、間接的なコネクションを張るために使用できるモノは全て「串」である。
例えばエキサイト翻訳のような「英語ウェブページのURLを指定すると日本語に訳して表示してくれる」というサービスも「串」の一種として捉えることはできる(つまり、エキサイトサーバーが当該ウェブサーバーに接続して受け取ったデータを和訳してクライアントに送る訳で)。「和訳」以外にも「関西弁翻訳」とか「電波化」とか色々ありますよね。
□7:delegate
更に、広義の「串」の中には(HTTPプロキシとは違う)delegateというモノもあり、これを使えばいわゆる「多段串」が可能である。多段串をさす場合は「http://delegate.server1.net/-_-http://delegate.server2.net/-_-http://開きたいウェブページのURL」等とブラウザの「アドレス」欄に打ち込んで「移動」すれば良い。

・・・大体こんな感じでしょうか(実際割と思いつくままに書いたので「これ足りない」ってのあったら教えて頂けると助かります)。 さて。では、ここまでを既に知っている人に以下の質問を行います。「上記は普通に知っているが以下の質問には一瞬以上悩む」という人が対象です。
  • いわゆる「匿名串(環境変数にクライアントの接続元を記述しない串)」と「漏れ串(記述する串)」って結局のところ何が違うんですか?
  • 「多段串が出来る串(delegate)」と「出来ない串(HTTP-Proxy)」って結局のところ何が違うんですか?
  • 「インターネットオプションで設定する串(HTTP-Proxy)」と「アドレス欄で設定する串(delegate)」って結局のところ何が違うんですか?
  • 同じHTTP-Proxyの中でもポート8080で公開されているモノとポート80で公開されているモノと・・・がある訳ですが、何が違うんですか?
  • 串をさしたままCookie必須サイトを利用することって出来ましたっけ?
小学生でも分かるプロキシ講座(2)
小学生でも分かるプロキシ講座(3)
小学生でも分かるプロキシ講座(3')
小学生でも分かるプロキシ講座(4)
小学生でも分かるプロキシ講座(5)
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(2) (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
「プロキシ」とは、いわば「特殊なブラウジングを行うために必要なモノ」です。では、どのように「特殊」なのか。プロキシを使うと
本来は直接的な「クライアント←→ウェブサーバー」というコネクションが「クライアント←→プロキシサーバー←→ウェブサーバー」という具合になり
このため一定の「匿名性」が確保される・・・と。

「どのように特殊なのか」をある程度深く理解するには、「通常のブラウジング」に関するある程度の理解が必要不可欠です。今回は「通常のブラウジング」を「リクエスト・レスポンス」という視点で見てみましょう。
本来は直接的な「クライアント←→ウェブサーバー」というコネクションが「クライアント←→プロキシサーバー←→ウェブサーバー」という具合になり
このため一定の「匿名性」が確保される・・・と。
「どのように特殊なのか」をある程度深く理解するには、「通常のブラウジング」に関するある程度の理解が必要不可欠です。今回は「通常のブラウジング」を「リクエスト・レスポンス」という視点で見てみましょう。

「通常のブラウジング」は「リクエスト」「レスポンス」から成立している。例えば。tokix.netトップページ(http://www.tokix.net/index.html)の実体とは、この世界の何処かにある「tokix.netサーバーマシン」のHDD内に存在するデータです。ブラウザのアドレス欄に上記URLを打ち込み「移動」を押す。ブラウザにtokix.netトップページが表示される。この時行われていることとは
  1. クライアント(閲覧者)がサーバーに対し「お前のトコの/index.htmlをよこせ」という意味の「リクエスト」を送信する
  2. tokix.netサーバーがクライアントに対して当該データを「レスポンス」として送信する
ということです。普段何気なくブラウザのアドレス欄にURLを打ち込み「移動」を押した時、ブラウザは(閲覧者の目に触れない場所で)上記のようなリクエストを行いレスポンスを受け、そのレスポンスを元に「ウェブページ」を表示している訳です。

「PC同士の通信」を頭に描こうとする時、「電話による通話」ではなく「文通」をイメージすると良いと思います。PC1は「リクエスト手紙」をPC2に送り、PC2は「レスポンス手紙」をPC1に送る。・・・何が言いたいかと言えば、PC1とPC2がお互いに「相手の住所」を理解していなければ「文通」が成立しない。電話番号を知らない相手と電話で話すことは(向こうからかけてくれば)可能だが、住所を知らない相手と文通を行うことはできない。「住所」というのが「IPアドレス」であり、つまり「リクエスト・レスポンス」を行う二台のPCはお互いが「相手のIPアドレス」を知っている。
参考:小学生でも分かるIP抜き講座(1)
「コネクションを持つ二台のPCはお互いが相手のIPアドレスを知っている」という基本的なメカニズム。
このような仕組みで「リクエスト・レスポンス」が行われ、ウェブサーバーは「クライアントのIPアドレス」を知ることになる訳です。「サーバーがクライアントのIPアドレスを抜いている」と言うより「クライアントが自分のIPアドレスを自主的にサーバーに教えている」という表現の方が正しいかもしれません。
クライアントからサーバーに送信される「リクエスト」の実体は、例えばtokix.netトップページをtokix.netサーバーに対してリクエストする場合だったら
クライアント → www.tokix.net
GET /index.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.tokix.net
大意: お前のトコの(※1)/index.htmlをよこせ
※1
「リクエスト」では「GET」と「Host」に注目して下さい。上記リクエストの意味は「www.tokix.netの/index.htmlをよこせ」という意味です。「リクエスト」において、基本的には「宛先」と「Host」は同じであり(※2)、この連載ではこの場合「お前のトコの」という表現を使うことにします。
※2
上記ならば両方とも「www.tokix.net」ですよね。
「ウェブサーバー」というのは「自分のHDD内にあるファイル(の内容)をリクエストに応じレスポンスとして送信する」を役割とします。例えば「www.tokix.net」に対して「Host」を「www.yahoo.co.jp」にしてリクエストを送信してもtokix.netウェブサーバーはどうしようもない訳です。
という感じです。
参考:初級CGIクラックガイド(4)
このような「リクエスト」を受けるとtokix.netサーバーは以下のような「レスポンス」を行う。
www.tokix.net → クライアント
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
<title>tokix.net - 毎週水曜更新</title>
(以下省略)
大意: /index.htmlはコレだ
別に「リクエスト」「レスポンス」の細かい意味を知る必要はないと思いますが、例えば、「リクエスト」内に「User-Agent」が記述されている、という事実に目を向けてもらえれば「リクエスト・レスポンスとしてのHTTP」という知識は「微妙に高度な掲示板荒らしテク」にも繋がります。
参考:User-Agentで掲示板荒らし
よく「サイト管理人にはクライアントが使用しているブラウザがバレている」というような記述を見ることがあると思います。実は「クライアントの使用しているブラウザ」というのは「クライアントが自己申告する情報」である。この事実を利用し一部の掲示板を荒らす方法について。
参考:アダルトサイトで学ぶHTTP基礎
「リクエスト・レスポンスとしてのHTTP」を「アダルトサイトを巡回する」という視点で書いています。「常識」のように言われる「アダルトサイト巡回時はJavaScriptを切れ」や環境変数について。

では、「インターネットオプション」「接続」でプロキシサーバーを設定した場合は「どのような」リクエストが「誰」に対して行われているのか。
小学生でも分かるプロキシ講座(3)
小学生でも分かるプロキシ講座(3')
小学生でも分かるプロキシ講座(4)
小学生でも分かるプロキシ講座(5)
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(3) (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
小学生でも分かるプロキシ講座(2)
前回で(プロキシを使わない)通常のブラウジングについて書いたので今回はプロキシ経由のブラウジングについて。「インターネットオプション」「接続」でHTTPプロキシを設定した場合、サーバーにはどのような「リクエスト」が送信されるのか。

プロキシを設定すると、クライアントがリクエストを送信する相手が「ウェブサーバー」ではなく「プロキシサーバー」になります。プロキシサーバーを経由してhttp://www.tokix.net/index.htmlを開く場合なら。
クライアント → HTTPプロキシ
GET http://www.tokix.net/index.html HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.tokix.net
大意: www.tokix.netの「http://www.tokix.net/index.html」をよこせ
このようなリクエストを受けたプロキシサーバーはウェブサーバーに対し以下のような「リクエスト」を送信する。
HTTPプロキシ → www.tokix.net
GET /index.html HTTP/1.1
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.tokix.net
大意: お前のトコの「/index.html」をよこせ
するとウェブサーバーがプロキシサーバーに対し「レスポンス」を行う。
www.tokix.net → HTTPプロキシ
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
<title>tokix.net - 毎週水曜更新</title>
(以下省略)
最後に、上記レスポンスを受けたプロキシサーバーがクライアントに対して「レスポンス」を行う。
HTTPプロキシ → クライアント
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
<title>tokix.net - 毎週水曜更新</title>
(以下省略)
・・・以上が「プロキシサーバーがクライアントとウェブサーバーの間に入る」という表現の実体です。すなわち、「プロキシ」の役割とは
  1. クライアントからのリクエストを受け、適切なリクエストをウェブサーバーに対して行う
  2. ウェブサーバーからのレスポンスを受け、適切なレスポンスをクライアントに対して行う
の二点。

さて、話を戻します。例えばInternetExplorerといった「ブラウザ」は、ウェブページを開こうとした時、あるリクエストを誰かに対して行っている訳です。その一般形は、「http://WebServer/File」を開く場合
クライアント → WebServer
GET /File HTTP/1.1
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: お前のとこの「File」をよこせ
です。で、「インターネットオプション」「接続」にHTTPプロキシ(ここでは「Proxy」とします)が設定されている場合、送信される「リクエスト」の一般形は以下です。
クライアント → Proxy
GET http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: WebServerの「http://WebServer/File」をよこせ
このリクエストを受けたProxyが発行するリクエストの一般形は以下です。
ProxyWebServer
GET /File HTTP/1.1
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: お前のとこの「File」をよこせ
「HTTPプロキシ」は自分が受けた「リクエスト」の一部を改変しウェブサーバーへリクエストを行う。その「改変」とは
  • リクエストの相手をWebServerにする
  • GET内の「http://WebServer」を除去する
この二点です。

delegateも基本的には同じように
クライアントとウェブサーバーの間に入る
訳ですが、細かく見ると役割が違うのが分かると思います。「http://Delegate/-_-http://WebServer/File」と打って(「インターネットオプション」「接続」内のプロキシ設定は行わずに)「移動」を押した場合、クライアントから送信される「リクエスト」は以下です(ということをわざわざ書かれなくてもここまでの内容から推測できるでしょうか?)。
クライアント → Delegate
GET -_-http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: Delegate
大意: お前のとこの「-_-http://WebServer/File」をよこせ
上記のような「リクエスト」を受けたDelegateは以下のような「リクエスト」を送信します。
DelegateWebServer
GET /File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: お前のとこの「File」をよこせ
delegateの場合の「改変」とは
  • リクエストの相手をWebServerにする
  • GET内の「-_-http://WebServer」を除去する
  • HostをWebServerにする
の三点。

・・・以上が、「delegateでは『多段串』ができるのにHTTP-Proxyではできない」という理由です。「delegateはリクエスト内Hostの改変を行うがHTTP-Proxyは行わない」。よく分からない方は「どのようなリクエストを送ればHTTPプロキシで多段串ができるか」というのを考えてみてください。「そんなリクエストは存在し得ない」というのが分かると思います。また、delegateによる多段串の場合はどのようにリクエストがチェーンされるのかも考えてみてください。「delegateは三箇所の『改変』を行う」ということを知っていればチェーンの実体も分かるはずです。
小学生でも分かるプロキシ講座(3')
小学生でも分かるプロキシ講座(4)
小学生でも分かるプロキシ講座(5)
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(3') (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
小学生でも分かるプロキシ講座(2)
小学生でも分かるプロキシ講座(3)
「delegate」というモノの役割は前回書いたとおりです。
  • 自分が受け取ったリクエストの一部と宛先を改変し送信する
  • 自分が受け取ったレスポンスを「自分にリクエストを送ってきた相手」に送信する
の二つ。で、その「改変」は基本的に三カ所である、と。
このメカニズムさえ分かっていれば「delegateによる『多段串』の実体」というのも理解できるはずです。ですが、まぁ頭の中で考えるのも面倒なので一応書いておきます。特に新しい内容ではないです。前回小学生でも分かるプロキシ講座(3)で書いたとおりの「改変」が行われていることを確認して下さい。
「http://Delegate1/-_-http://Delegate2/-_-http://WebServer/File」とブラウザの「アドレス」欄に打って「移動」を押した場合。
□リクエスト1: クライアント → Delegate1
GET -_-http://Delegate2/-_-http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: Delegate1
大意: お前のとこの「-_-http://Delegate2/-_-http://WebServer/File」をよこせ
リクエストを受け取ったDelegate1
  • 宛先を「Delegate2」にする
  • GET内の「-_-http://Delegate2/」を除去する
  • Hostを「Delegate2」にする
□リクエスト2: Delegate1Delegate2
GET -_-http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: Delegate2
大意: お前のとこの「-_-http://WebServer/File」をよこせ
リクエストを受け取ったDelegate2
  • 宛先を「WebServer」にする
  • GET内の「-_-http://WebServer/」を除去する
  • Hostを「WebServer」にする
□リクエスト3: Delegate2WebServer
GET /File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: お前のとこの「File」をよこせ
一応書いておくと、「ウェブサーバー」というのは「自分のサーバー内にあるファイルを『リクエスト』に応じ『レスポンス』として送信する」を役割とします。この場合なら「File」が「レスポンスすべきデータ」となる訳です。
□レスポンス1: WebServerDelegate2
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
(以下省略)
delegateは「レスポンス」を受けると、自分が受けたレスポンスを「自分にリクエストを送信してきた相手」に送信する。Delegate2に「リクエスト」を送ってきたのはDelegate1でしたね。
□レスポンス2: Delegate2Delegate1
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
(以下省略)
そして、Delegate1に「リクエスト」を送ってきたのはクライアントです。
□レスポンス3: Delegate1 → クライアント
HTTP/1.1 200 OK
Date: Wed, 25 Dec 2002 09:00:00 GMT
Server: Apache/1.3.9 (Unix)
Content-Type: text/html

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=SHIFT_JIS">
(以下省略)
以上が、delegateによる「多段串」の実体です。小学生でも分かるプロキシ講座(3)で書いたとおりの規則でリクエスト・レスポンスが仲介されているのが分かったでしょうか。ここでは二つのdelegateを経た「多段串」について書きましたが、コレが三つ四つと増えても「規則」は変わりません。あくまで「delegateは小学生でも分かるプロキシ講座(3)で書いたとおりの規則でリクエスト・レスポンスを仲介する」ということです。
小学生でも分かるプロキシ講座(4)
小学生でも分かるプロキシ講座(5)
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(4) (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
小学生でも分かるプロキシ講座(2)
小学生でも分かるプロキシ講座(3)
小学生でも分かるプロキシ講座(3')
さて、前回までで書いてきたように、「串」とは
  • クライアントからの「リクエスト」の一部を書き換えサーバーに転送する
  • サーバーからの「レスポンス」の一部を書き換えクライアントに転送する
という二つの役割を果たす代物です。そして
  • リクエストに対する書き換えは基本的に2〜3箇所(宛先・GET・HOST)
  • レスポンスに対する書き換えは基本的に1箇所(宛先)
である、と。
基本的に
つまり、それ以上の書き換えを行う「串」も存在します。
いわゆる「初心者向けプロキシ講習」みたいなテキストで読んだ人も多いと思いますが、この世には「漏れ串」というモノが存在します。クライアントの生IPアドレスをサーバーに教えてしまう串。
いわゆる「匿名串」と「漏れ串」で、リクエスト・レスポンスの中継方法にはどのような差があるのか。「環境変数FORWARDED_FORにクライアントの生IPを吐く」という、典型的な漏れ串LeakProxyと、小学生でも分かるプロキシ講座(3)でも書いたProxyの差を見てみましょう。
クライアント → Proxy
GET http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: WebServerの「http://WebServer/File」をよこせ
クライアント → LeakProxy
GET http://WebServer/File HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: WebServerの「http://WebServer/File」をよこせ
クライアントから(「インターネットオプション」→「接続」に設定された)プロキシへの「リクエスト」は、その串が匿名串であれ漏れ串であれ変わらない。しかしこの後が違う。
ProxyWebServer
GET /File HTTP/1.1
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: WebServer
大意: お前のとこの「File」をよこせ
LeakProxyWebServer
GET /File HTTP/1.1
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Forwarded-For: クライアントの生IP
Host: WebServer
大意: お前のとこの「File」をよこせ
「漏れ串」とは、「リクエスト中継時に余分な書き換え(or追記)を行う串」のことです。
リクエストに対する書き換えは基本的に2〜3箇所(宛先・GET・HOST)
その2〜3箇所の書き換えしかなければ、原理的にウェブサーバーには
  • クライアントの生IP
  • それがプロキシ経由のアクセスであるという事実
は伝わらない。小学生でも分かるプロキシ講座(3)で書いた
  • プロキシ設定を行わずにウェブページを開く場合の「クライアント→ウェブサーバー」のリクエスト
  • プロキシ設定を行ってウェブページを開く場合の「プロキシ→ウェブサーバー」のリクエスト
を比べてみて下さい。何も変わらない。変わらなければ「リクエスト」を受けたウェブサーバーは「それがクライアントから送られたリクエストなのかプロキシによって中継されたリクエストなのか」を判断することは(基本的に)出来ない。
「ウェブサーバー」というのは「自分のHDD内にあるファイル(の内容)をリクエストに応じレスポンスとして送信する」を役割とします。
ウェブサーバーは基本的に「自分が受けたリクエスト」によってしか「相手に関する情報」を得ることが出来ない。そして、プロキシが余分な書き換え(or追記)を行うからこそ
  • プロキシ設定を行わずにウェブページを開く場合の「クライアント→ウェブサーバー」のリクエスト
  • プロキシ設定を行ってウェブページを開く場合の「プロキシ→ウェブサーバー」のリクエスト
が変わってくる。本来前者には含まれないような文字列が「(プロキシ→ウェブサーバーの)リクエスト」の中に現れる。ウェブサーバーは「リクエスト」内の「本来前者には含まれないような文字列」を発見し「それがプロキシ経由のアクセスだ」という判断を行う。「本来前者には含まれないような文字列」に「クライアントの生IPアドレス」が含まれていれば、プロキシ経由であってもクライアントの生IPアドレスを取得することが可能になる(「クライアントの生IPアドレス」を「本来前者には含まれないような文字列」に記述し中継を行う串が「漏れ串」と呼ばれる)。

・・・という原理を受け入れて貰えれば分かると思いますが、プロキシが記述する「本来前者には含まれないような文字列」の形式というのはケースバイケースです。プロキシは、中継を行う以上「リクエスト」を好きに書き換えることが出来る。どんな「書き換え」や「追記」や「一部削除」を行うかはプロキシ次第です。

ここでは「リクエスト」の書き換えのみを論じましたが、当然「レスポンス」だって「プロキシによって好きに書き換えられ得る代物」です。例えば「英語ウェブページを日本語に翻訳するプロキシ」は、レスポンス内の英文を日本語に翻訳してクライアントに転送している訳です。
小学生でも分かるプロキシ講座(5)
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(5) (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
小学生でも分かるプロキシ講座(2)
小学生でも分かるプロキシ講座(3)
小学生でも分かるプロキシ講座(3')
小学生でも分かるプロキシ講座(4)
前回何気なく書いたんですが
  • プロキシ設定を行わずにウェブページを開く場合の「クライアント→ウェブサーバー」のリクエスト
  • プロキシ設定を行ってウェブページを開く場合の「プロキシ→ウェブサーバー」のリクエスト
を比べてみて下さい。何も変わらない。変わらなければ「リクエスト」を受けたウェブサーバーは「それがクライアントから送られたリクエストなのかプロキシによって中継されたリクエストなのか」を判断することは(基本的に)出来ない。
前半は問題なく受け入れて貰えていると思います。小学生でも分かるプロキシ講座(3)で書いたように
  • プロキシ設定を行わずにウェブページを開く場合の「クライアント→ウェブサーバー」のリクエスト
  • プロキシ設定を行ってウェブページを開く場合の「プロキシ→ウェブサーバー」のリクエスト
は何も変わらない。しかし後半が問題で。
変わらなければ「リクエスト」を受けたウェブサーバーは「それがクライアントから送られたリクエストなのかプロキシによって中継されたリクエストなのか」を判断することは(基本的に)出来ない。
ここに気持ち悪さを感じた人もいると思います。小学生でも分かるプロキシ講座(2)で書いた通り
「リクエスト・レスポンス」を行う二台のPCはお互いが「相手のIPアドレス」を知っている。
つまり、ウェブサーバーは(クライアントからのリクエストを中継した)プロキシのIPアドレスを知っている。「IPアドレスを知っている」のに「それがプロキシであるということを知らない」という事態があり得るのか?ということです。

例えばWinnyを例に使います。Winnyを起動しているPCは「他のユーザーからのリクエスト」を待機している。誰かが「ファイルのダウンロード」をリクエストすると、それを受けたPCは相手にファイルを送信する。Winnyというのはそういうアプリですね。
「他のユーザーからのリクエスト」を待機
して何らかのサービス(ファイル転送・リクエストの中継…)を提供するアプリの総称が「サーバーソフト」です。「サーバーソフト」が起動しているマシンが「サーバーマシン」です。ある種の言い方をすれば、Winnyとは「サーバー兼クライアント(他のWinnyに対して『ファイル転送リクエスト』を送ることも出来ますからね)」です。

「サーバー」と言われると急に話に具体性を見出せなくなる人が多い理由は、その言葉が時に「サーバーソフト」、時に「サーバーマシン」の略として使われることだと思います。「HTTPプロキシサーバーマシン」とは「HTTPプロキシサーバーソフトが起動しているマシン」であって、例えば僕が自分のマシンに「HTTPプロキシサーバーソフト」を入れればそれも「HTTPプロキシサーバーマシン」です。いわゆる「串」とは「インターネットに接続している一台のマシン(HTTPプロキシサーバーソフトが起動しているマシン)」に過ぎない。
「HTTPプロキシサーバー」とは、つまるところ「Winnyが起動しているマシン」と同種の代物です。「他のユーザーからのリクエスト」を待機する「HTTPプロキシソフト」が起動しているマシン。「HTTPプロキシソフト」というのは、ここまで書いてきたように「リクエスト・レスポンスの中継を行うソフト」です。他のマシンから「リクエスト」を受けるのを待ち、「リクエスト」が届いたらある規則に基づいた書き換えを行いサーバーに転送し、サーバーからのレスポンスを受けある規則に基づいた書き換えを行ってクライアントに転送するソフト。
参考: BlackJumboDog
多くのプロキシサーバーソフトはUNIX用であり、Windowsでは起動できません。BlackJumboDogはWindows用プロキシサーバーソフトです。起動しておくと外部の「リクエスト中継依頼」を待機します。

前回書いたんですが
プロキシが記述する「本来前者には含まれないような文字列」の形式というのはケースバイケースです。
例えばBlackJumboDogはソフトの「リクエストヘッダをブラウザと同じにする」という設定項目にチェックを入れないと「リクエストに対する余分な書き換え」を行います。
参考: BlackJumboDog内「リクエストヘッダをブラウザと同じにする
「IPアドレスを知っている」のに「それがプロキシであるということを知らない」という事態があり得るのか?
それは「IPアドレスを元に、そのマシンでWinnyが起動しているかいないかを調べることはできるか?」という問いに似ている。
小学生でも分かるプロキシ講座(6)

小学生でも分かるプロキシ講座(6) (>>この記事のみを表示)

小学生でも分かるプロキシ講座(1)
小学生でも分かるプロキシ講座(2)
小学生でも分かるプロキシ講座(3)
小学生でも分かるプロキシ講座(3')
小学生でも分かるプロキシ講座(4)
小学生でも分かるプロキシ講座(5)
前回書いたように
「HTTPプロキシサーバー」とは、つまるところ「Winnyが起動しているマシン」と同種の代物
です。例えば現在このウェブページを開いているクライアントマシンでWinnyを起動させている人もいるでしょう。僕の場合は現在
  • InternetExplorer
  • FFFTP
  • MSNメッセンジャー
  • ICQ
が同時起動してます。その一つ一つのソフトが何処かのマシンとの間でコネクションを張っている。・・・「コネクション」というより
「PC同士の通信」を頭に描こうとする時、「電話による通話」ではなく「文通」をイメージすると良いと思います。
例えば、今僕のマシンに何処かのIPアドレスから「手紙」が届いたとする。それは「ブラウザでリクエストしたウェブサーバーからのレスポンス」かもしれないし「メッセンジャーで誰かがオンラインになったという通知」かもしれないし「FFFTPでFTPサーバーからタイムアウトしたという通知」かもしれない。一つのマシン上で同時起動しているソフトが一つであれば問題ない。一つであれば、届いた「手紙」は全て「そのソフト宛の手紙」です。そのソフトがその手紙を解釈できないなら、その手紙は「ゴミ」です。しかし現実にはそんなことはない訳で、一つのマシン上では同時に複数のソフトが起動している。
・・・ということで生まれたのが「ポート」という概念です。割とよく使われる気がする表現ですが、IPアドレスは住所であり、その住所が示すアパートの部屋番号が「ポート番号」。一つのアパート(一台のマシン)の中には複数の部屋(複数のソフト)があり、部屋番号(ポート番号)によって「どの部屋(ソフト)宛の手紙か」が識別される。
と、いうような「ポート番号に関する超初歩的知識」のみを持っている人の中には、以下のような誤解を持っている人もいると思います。
HTTPプロキシサーバー(ソフト)はポート8080。だから、ウェブサーバーは「自分に送られたリクエストの差出元ポート番号」をチェックし、それが8080であったら「串経由だ」という判断を行えば良い。
論より証拠、ということでCyberSyndromさんとかで適当な串を探してここを開いてみて下さい。例えば僕は今とある串をさして開いたところ
あなた(orあなたが設定しているプロキシ)がtokix.netとの接続に使用しているポートは 2109 です。
と言われました。ちなみに生の場合は
あなた(orあなたが設定しているプロキシ)がtokix.netとの接続に使用しているポートは 2453 です。
だそうです。
ポート8080で公開されているプロキシを使ったところで、ウェブサーバーへのアクセスポートが8080になる訳ではない。
上記の場合だったら
クライアントのポート2453→プロキシサーバーのポート8080
プロキシサーバーのポート2109→ウェブサーバーのポート80
という具合にリクエストが転送された。「プロキシサーバーソフト」という一つのソフトがポート8080と2109を「リクエスト受付用」「受けたリクエスト転送用」に使い分けてる訳です。
ウェブサーバーは、自分にリクエストを送ってきたマシンのポート番号から「それがプロキシか否か」を判断することは出来ない。ならば。
「IPアドレスを知っている」のに「それがプロキシであるということを知らない」という事態があり得るのか?
それは「IPアドレスを元に、そのマシンでWinnyが起動しているかいないかを調べることはできるか?」という問いに似ている。
「あるIPアドレスのあるポートが開いているか否か」というのは簡単に調べることが出来ます。「ポートスキャン」って単語聞いたことがあると思うんですが、アレはつまり「開いているポートを探す」ということです。
通常、プロキシサーバーソフトは「リクエスト受付」にポート8080を使用します。つまり、「ポート8080が開いているマシン」とは「プロキシサーバーソフトが起動しているマシン」であり、「プロキシサーバーソフトが起動しているマシン」から送られるリクエストの多くは「中継されたリクエスト」です。・・・厳密なことを言えば、「プロキシサーバーソフトが起動しているマシン」から送られるリクエストは必ずしも「中継されたリクエスト」ではない。例えば僕がプロキシサーバーソフトを走らせていたとして、「僕自身が自分でブラウザから送ったリクエスト」と「プロキシサーバーソフトによって中継された、他人からのリクエスト」をウェブサーバーが判別することは出来ないからです。ただ、まぁ、「ポート8080が開いているマシンからのリクエストは(それが相手自身のモノであれ中継であれ)問答無用に弾く」ということは出来る。

2chは「リクエスト内の余分な書き換え分を探す」等といった通常の「串弾き」に加え、上記のような方法の串弾きを行っています。つまり、「2chに書き込める串」が欲しいと思うならば、最低限ポート8080を開いていないプロキシサーバー(=ポート8080以外でプロキシサーバーソフトを走らせているマシン)を探さなくてはいけません。
しかし、全てのプロキシサーバーソフトが「待ち受け」にポート8080を使用する訳ではない。例えば、ネットサーフィン中に以下のようなURLを見たことがあると思うんですが、
http://www.server.net:1080/
この「:」以降(=1080)は相手のポート番号を表します。
通常、HTTPサーバーソフトはポート80で「リクエスト」を待機します。普通にブラウザのアドレス欄に「http://www.server.net/」と打って「移動」を押した場合は
  • www.server.netの
  • ポート80
に対して「リクエスト」が送信される。
通常、HTTPサーバーはポート80で「リクエスト」を待機
するため、ブラウザは「ポート番号が指定されない場合はポート80にリクエストを送信する」という仕様になっている訳です。しかしこの世にはポート80以外で公開されるウェブサーバーソフトもある(というか「ポート80以外で公開するように設定している管理人もいる」)ため、そういう場合にはURLを「http://www.server.net:1080/」とすることで
  • www.server.netの
  • ポート1080
に対してリクエストを送信する、と。
プロキシサーバーに関しても話は同じで、必ずしも全てのプロキシがポート8080を「待ち受け」に使用する訳ではない。前回使った例で言えば、Winnyは(旧バージョンでは)「デフォルトポート番号7743」であるため、「ポート7743が開いているマシン=Winnyが起動しているマシン」という判断は可能だが、待ち受けポート番号設定をユーザーが変更しているならば
IPアドレスを元に、そのマシンでWinnyが起動しているかいないかを調べること
は出来ない。IPアドレスを元に、そのマシンで(ポート8080以外で)プロキシサーバーソフトが走っているか否かを判断することは出来ない。
・・・以上が「プロキシ」というモノを理解した上で使用するために必要となってくる知識でした。「串」というモノが結局のところ何なのか、少しでも「得るモノ」を提供できていれば光栄です。

dammy

Credit

SeeAlso

OtherSubCategory

Footprint

Navigation