プロキシ

プロキシ (Web)

[46] プロキシ (proxy) は、アプリケーション層プロトコルを中継するものです。 Web では、 HTTPFTP などの通信をネットワーク境界を超えさせるために使ったり、 キャッシュアプリケーション層経路制御などの機能のために用いたりします。

仕様書

分類と用途

[15] プロキシは、キャッシュ変形経路制御アクセス制御防火壁ウイルス検査検閲検閲回避など様々な目的のために利用されています。

[10] プロキシは、用途やプロトコル、配置などによって、様々に分類されています。

[19] 特定の WebサイトHTML を書き換えたり JavaScript を注入したり、キャッシュ機能を強化したりして利用者側で高度な Webサイトのカスタマイズを行うことを目的としたもあります。 他の言語や方言に翻訳するもあります。しかしこうした内容を書き換える利用者エージェントにとって MITM 攻撃と区別がつかないので、好ましくないのかもしれません。 そのような書き換えがあったかどうか利用者エージェント側から確実に判定する方法はありません。

[31] 組織内ネットワークの出入口に当たるや、年少者向けのフィルタリングを行うなど、 検閲を目的としたドメイン名IPアドレスURL応答の内容その他の要求応答の特徴に基づき要求を遮断したり、 応答を改変・差し替えたりすることがあります。その場合は 403 などの状態符号が使われると思われますが、その保証はありません。また利用者エージェント側から通常の応答と確実に区別する方法はありません。

[32] 透過プロキシにより、こうした改変が利用者の気づかないうちに行われている場合もあります。
[9] HTTP は、一般的な技術用語としての「プロキシ」よりもかなり狭い意味 (HTTPプロトコルとして使った順プロキシ) に限定して 「プロキシ」を定義しています。 interception proxy透過串は、クライアントによって選択されたものではありませんから、 HTTP の定義によるプロキシではありません >>7 2.3.HTTPプロキシについては、順プロキシを参照。

[1] 組織内ネットワークから外部のネットワークに接続するため、 あるいは VPN 等特別なネットワークに接続するためにプロキシを通す必要がある場合も存在します。 実用上、 Webブラウザーその他の Webクライアントソフトウェアは、 プロキシに対応しなければなりません。

[14] は多段化できます。すなわち、もまたを使うことができます。

[13] インターネットアプリケーションサーバーの間に、 ネットワーク境界を超えると共に経路制御を行うための逆プロキシと、 HTTPキャッシュ機能を持ったプロキシの2段階のサーバーを挟むことがあります。

[11] あるいは、上位層のプロトコルプロキシを使った通信が、それとは別個に、 下位層のプロキシを使った通信の上で行われることもあります。

プロトコル

[48] プロキシの実現を目的としたプロトコルに次のようなものがあります。

[49] プロキシを想定した機能を持ったプロトコルに次のようなものがあります。

[22] 素のHTTP では、プロキシ要求を解釈し改めて自身の要求として上流に送信する形を採っています。 HTTPS では、 TLS の仕様や趣旨からそのような書き換えは望ましくない (というか MITM proxy でない限り不可能) なため、プロキシTLS の通信を盲目的に中継するトンネルとして動作します。

[20] WebSocket は、通常の HTTP と同じ形でプロキシが使えます。

[17] WebDAV に対応するは、 HTTP/1.1 に適合しなければなりません >>16

[21] FTPプロキシは色々な方法が歴史的に使われてきましたが、 Web ではもっぱら FTP over HTTP が使われます。

認証

[33] は、その機能の一部または全部の利用にログイン等の操作が必要なことがあります。 プロキシプロトコル認証機能が組み込まれていることもあります。 ログイン等の操作を促す手段として captive portal が用いられる場合もあります。

エラー処理

[25] プロトコルによっては、起源サーバーのエラーとプロキシ自体のエラーやプロキシから上流への接続に関するエラーを明確に区別できないことがあります。

[27] 素のHTTPプロキシ機能では、プロキシ上流からのエラー応答転送したのか、 プロキシエラー応答生成したのかクライアントが確実に区別する方法がありません。

セキュリティー

[28] プロキシを通じて使うプロトコルHTTPS のように TLS を使ってセキュリティーを確保したものでは無い場合、 クライアントプロキシを無条件で信頼することになります。

[29] 例えば素のHTTPプロキシ機能の場合は、プロキシ応答の内容を自由に覗いて自由に書き換えることができます。 プロキシが信頼できないものであるなら、機密情報が漏洩するかもしれませんし、 危険なスクリプトが埋め込まれるかもしれません。

[35] 組織内ネットワークなどでプロキシが絶対に信頼できる場合を除いて、 プロキシを使って平文で通信するべきではありません。 プロキシが信頼できるはずの場合でも、信頼できないプロキシが別に設置される危険性には注意が必要です。

[36] 例えば悪意のある者が物理的にネットワークにアクセスできるなら、 プロキシとして動作する計算機から LANケーブルを抜いて、 偽のプロキシに差し替えるかもしれません。

HTTP プロキシ

[59] HTTPプロキシ機能には、次のプロトコル要素が関与します。

処理

[60] HTTPプロキシサーバーとしての基本動作は、通常の HTTPサーバーと変わりありません。 詳細はHTTPサーバー参照。

[63] 要求検査においては、プロキシ認証を行うことができます。 プロキシ自体に対する利用権限を検査するHTTP認証ですが、 具体的な認証方式や利用権限の決定方法などは実装と設定に依存します。

[62] トンネルとしての動作は、 CONNECT を参照してください。

[61] 順プロキシ逆プロキシとしての挙動は、 要求処理の選択を次のように行うものです。

  1. [64] 要求要求対象が本プロキシサーバーで扱う対象かどうかを判断します。 の場合、
    1. [65] 何か適切なエラーの応答を返します。
  2. [73]
  3. [75] それ以外の場合、
    1. [76] プロキシ処理を返します。
[68] 対象かどうかの検査では、 自分自身が指定された場合や、自身の所属するプライベートネットワーク (外部からアクセスできるべきでないもの) への接続要求を弾く必要がありそうです。

[77] プロキシ処理は、要求を次のようにするものです。

  1. [78] 要求キャッシュで処理できるものなら、
    1. [79] キャッシュ項目を返す処理を行い、ここで停止します。
  2. [66] 起源を、要求対象URL起源に設定します。
  3. [67] 接続を、起源接続を得るを実行した結果に設定します。
    credentials
  4. [83] 要求に接続ヘッダー消去を適用します。
  5. [89] 要求要求改変処理を適用します。
  6. [69] 接続上に要求を送信します。
    credentials
  7. [80] 応答を、接続から得られた応答に設定します。
  8. [87] 応答ネットワークエラーか、 応答状態407511 なら、
    1. [88] 適切な 5xx エラーの応答 (4xx 参照。) を送信し、ここで停止します。
  9. [81] 応答に接続ヘッダー消去を適用します。
  10. [90] 応答応答改変処理を適用します。
  11. [82] 応答を送信します。
  12. [85] キャッシュを使うなら、
    1. [86] 応答キャッシュ保存操作を実行します。

[84] メッセージの接続ヘッダー消去は、次のようにします。

  1. [71] メッセージConnection: ヘッダーがあれば、
    1. [72] メッセージから、 Connection: ヘッダーで名前が指定されたヘッダーをすべて削除します。
  2. [70] メッセージから、次のヘッダーをすべて削除します。
[96] Server:User-Agent: は削除しません。

[91] 要求要求改変処理応答応答改変処理は、 サーバーの実装と設定に依存した方法で要求応答を改変できます。

[92] HTTP の仕様上は要求Via: ヘッダーを追加することが求められています。 応答Date: が含まれないとき付与することが求められています。

[95] これらの規定がどの程度実施されているかは不明です。敢えて Via: を付加しないことも多そうです。

[93] 逆プロキシ要求X-Forwarded-*: ヘッダーを付与して元のアクセスの情報を残すのが一般的です。

[94] 変形プロキシ応答ヘッダー本体を目的に応じて改変します。

[106] HTTPS を扱う MITM proxy は更にいくつかのヘッダーを削除するかもしれません。 MITM proxy

クライアントの設定

[4] HTTPクライアント (Webブラウザーその他の末端のクライアントも、 経路の中間にあるプロキシも。) のほとんどは、 何らかの接続するべきプロキシの指定 (プロキシ設定) の手段を用意しています。

[8] プロキシの機能やプロキシ設定の機能は、 クライアントソフトウェアごとに実装されていることもあれば、 動作しているプラットフォームの側で一部または全部が提供されていることもあります。

[12] 例えば WindowsOS 全体のプロキシ設定を保持しています。

ネットワーク設定

[6] プロキシ設定の方法は、ソフトウェアごとに異なりますが、 次のような手段から1つ以上提供しているのが普通です。

[18] 環境変数による指定は、http_proxy など一式がデファクト標準となっていて、 多くのソフトウェアで共通で参照されます。

http_proxy 参照。

[24] 指定の方法や提供する機能はソフトウェアごとに異なりますが、 おおよそ次のような形とするのが一般的なようです。

プロキシモード
「なし」、「PAC」、「WPAD」、「プラットフォーム」、「手動」のいずれか。
HTTP プロキシ
(プロトコル, 利用者名, 合言葉, ホスト, ポート) または null
HTTPS プロキシ
(プロトコル, 利用者名, 合言葉, ホスト, ポート) または null
FTP プロキシ
(プロトコル, 利用者名, 合言葉, ホスト, ポート) または null
SOCKS プロキシ
(プロトコル, 利用者名, 合言葉, ホスト, ポート) または null
PACURL
絶対URLまたは null
除外ホストリスト
0個以上ホストリスト
[26] かつては GopherWAIS にも対応していることが多かったのですが、 最近は見かけません。ソフトウェアの種類によっては、 POPIMAPSMTPIRC などの指定もできるかもしれません。
[30] Webブラウザー以外のクライアントPACWPAD に対応していない場合も少なくありません。

WebDriver

[97] ChromeDriverhttpProxyホスト:ポートを指定できます。 GeckoDriverhttpProxyホストhttpProxyPortポートを指定できます。(両方指定しないとエラーが帰ってきます。) WebDriver 仕様書GeckoDriver の挙動の他に、 httpProxyURLhttpProxyPort 無指定、という指定方法ができると書いてありますが、 GeckoDriver はエラーを返します。

[98] GeckoDriver は、 httpProxyPort数値でなく文字列で指定してもエラーとします。

[100] GeckoDriverhttpProxyホスト:ポート を指定しても直ちにエラーとはなりませんが、プロキシに接続できず navigate でエラーになります。

[99] ChromeDriverhttpProxyPort に対応していません。

名前

[104] プロキシの名前として、通常のホスト (ドメイン名IPアドレス) の他に、真のホストを隠匿した識別子が使われる場合があります。 これは、プロキシによって内部ネットワーク内の構造を外部に晒してしまうことを防ぐのが目的です。

詳しくはプロキシの名前を参照。

メモ

[2] もともとというのは「プロクシ」の後半の音から取った俗語だけど、語呂がいいのですっかり定着してしまった。

[3] 派生語: 串刺し, 串規制

[5] 国内open proxyの現状 http://spam.h1r.org/jpproxy/index.html (名無しさん 2006-05-27 02:42:05 +00:00)

[34] draft-rpeon-httpbis-exproxy-00 - Explicit Proxies for HTTP/2.0 ( 版) http://tools.ietf.org/html/draft-rpeon-httpbis-exproxy-00

[37] Pretty-Bad-Proxy: An Overlooked Adversary in Browsers’ HTTPS Deployments - Microsoft Research ( 版) http://research.microsoft.com/apps/pubs/default.aspx?id=79323

[38] 713023 – Websockets: don't prefer SOCKS to HTTP proxy until bug 449251 is fixed ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=713023

[39] [chrome] Index of /trunk/src/net/proxy ( 版) http://src.chromium.org/viewvc/chrome/trunk/src/net/proxy/

[40] Secure Web Proxy - The Chromium Projects ( 版) https://www.chromium.org/developers/design-documents/secure-web-proxy

[41] Data Saver - Google Chrome ( 版) https://developer.chrome.com/multidevice/data-compression

[42] 378637 – Add support for connecting to HTTP proxy over HTTPS ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=378637

[43] Features/HTTPS - Squid Web Proxy Wiki ( ()) http://wiki.squid-cache.org/Features/HTTPS

[44] cURL - How To Use ( ()) https://curl.haxx.se/docs/manpage.html#--proxy10

--proxy1.0 <proxyhost[:port]>

Use the specified HTTP 1.0 proxy. If the port number is not specified, it is assumed at port 1080.

The only difference between this and the HTTP proxy option (-x, --proxy), is that attempts to use CONNECT through the proxy will specify an HTTP 1.0 protocol instead of the default HTTP 1.1.

[45] cURL - How To Use ( ()) https://curl.haxx.se/docs/manpage.html#-x

-x, --proxy <[protocol://][user:password@]proxyhost[:port]>

Use the specified proxy.

The proxy string can be specified with a protocol:// prefix to specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or socks5h:// to request the specific SOCKS version to be used. No protocol specified, http:// and all others will be treated as HTTP proxies. (The protocol support was added in curl 7.21.7)

If the port number is not specified in the proxy string, it is assumed to be 1080.

This option overrides existing environment variables that set the proxy to use. If there's an environment variable setting a proxy, you can set proxy to "" to override it.

All operations that are performed over an HTTP proxy will transparently be converted to HTTP. It means that certain protocol specific operations might not be available. This is not the case if you can tunnel through the proxy, as one with the -p, --proxytunnel option.

User and password that might be provided in the proxy string are URL decoded by curl. This allows you to pass in special characters such as @ by using %40 or pass in a colon with %3a.

The proxy host can be specified the exact same way as the proxy environment variables, including the protocol prefix (http://) and the embedded user + password.

[47] 匿名化ソフト(TOR)で攻撃された場合の生IPアドレス取得方法 | WhiteHackerzBlog ハッカー養成学院 公式ブログ ( ()) http://www.whitehackerz.jp/blog/?p=1809

Flash Playerは串に非対応

Javaはブラウザに設定された串を使用できるが、

串を使用せずにリクエストを送信することもできる

SilverlightのHTTPクライアントはブラウザに設定された串を使用するが、

ソケットクラスを使用すれば串をbypassできる

[50] Issue 35748 - chromium - Flash Plugin for Linux does NOT honor the --proxy-server command line options - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=35748

[51] evan_tech -- socks5 proxying flash via ssh ( ()) http://evan-tech.livejournal.com/273224.html

tsocks firefox

[52] Issue 35748 - chromium - Flash Plugin for Linux does NOT honor the --proxy-server command line options - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=35748

[53] Issue 163116 - chromium - Flash and other plugins should be forced through the browser's proxy - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=163116

[55] Network Settings - The Chromium Projects ( ()) https://www.chromium.org/developers/design-documents/network-settings

[56] Issue 72692 - chromium - Handle UTF-8 URLs in Proxy Settings API - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=72692

[57] chrome/browser/extensions/api/proxy - chromium/src - Git at Google ( ()) https://chromium.googlesource.com/chromium/src/+/master/chrome/browser/extensions/api/proxy

[101] Better define proxies (shs96c著, ) https://github.com/w3c/webdriver/commit/a90db4b119de8c77875647e30b611c1c49a4349b

[102] 426736 - WebSocket connections not using configured system HTTPS Proxy in MacOS - chromium - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=426736

[103] Understanding Web Proxy Configuration – IEInternals () https://blogs.msdn.microsoft.com/ieinternals/2013/10/11/understanding-web-proxy-configuration/

[105] 684681 - Plaintext websockets does not work via HTTP/2 proxy - chromium - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=684681