[46] プロキシは、アプリケーション層プロトコルを中継するものです。 Web では、 HTTP や FTP などの通信をネットワーク境界を超えさせるために使ったり、 キャッシュやアプリケーション層の経路制御などの機能のために用いたりします。
[15] プロキシは、キャッシュ、変形、経路制御、アクセス制御・防火壁、ウイルス検査、 検閲、検閲回避など様々な目的のために利用されています。
[10] プロキシは、用途やプロトコル、配置などによって、様々に分類されています。
[19] 特定の Webサイトの HTML を書き換えたり JavaScript を注入したり、キャッシュ機能を強化したりして利用者側で高度な Webサイトのカスタマイズを行うことを目的とした串もあります。 他の言語や方言に翻訳する串もあります。しかしこうした内容を書き換える串は利用者エージェントにとって MITM 攻撃と区別がつかないので、好ましくないのかもしれません。 そのような書き換えがあったかどうか利用者エージェント側から確実に判定する方法はありません。
[31] 組織内ネットワークの出入口に当たる串や、年少者向けのフィルタリングを行う串など、
検閲を目的とした串はドメイン名、IPアドレス、URL、応答の内容その他の要求や応答の特徴に基づき要求を遮断したり、
応答を改変・差し替えたりすることがあります。その場合は 403
などの状態符号が使われると思われますが、その保証はありません。また利用者エージェント側から通常の応答と確実に区別する方法はありません。
[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] プロトコルによっては、起源サーバーのエラーとプロキシ自体のエラーやプロキシから上流への接続に関するエラーを明確に区別できないことがあります。
[28] プロキシを通じて使うプロトコルが HTTPS のように TLS を使ってセキュリティーを確保したものでは無い場合、 クライアントはプロキシを無条件で信頼することになります。
[29] 例えば素のHTTPのプロキシ機能の場合は、プロキシは応答の内容を自由に覗いて自由に書き換えることができます。 プロキシが信頼できないものであるなら、機密情報が漏洩するかもしれませんし、 危険なスクリプトが埋め込まれるかもしれません。
[35] 組織内ネットワークなどでプロキシが絶対に信頼できる場合を除いて、 プロキシを使って平文で通信するべきではありません。 プロキシが信頼できるはずの場合でも、信頼できないプロキシが別に設置される危険性には注意が必要です。
[59] HTTPのプロキシ機能には、次のプロトコル要素が関与します。
[60] HTTPプロキシのサーバーとしての基本動作は、通常の HTTPサーバーと変わりありません。 詳細はHTTPサーバー参照。
[63] 要求検査においては、プロキシ認証を行うことができます。 プロキシ自体に対する利用権限を検査するHTTP認証ですが、 具体的な認証方式や利用権限の決定方法などは実装と設定に依存します。
[62] トンネルとしての動作は、 CONNECT
を参照してください。
[61] 順プロキシや逆プロキシとしての挙動は、 要求の処理の選択を次のように行うものです。
[77] プロキシ処理は、要求を次のようにするものです。
[84] メッセージの接続ヘッダー消去は、次のようにします。
[91] 要求の要求改変処理や応答の応答改変処理は、 サーバーの実装と設定に依存した方法で要求や応答を改変できます。
[93] 逆プロキシは要求に X-Forwarded-*:
ヘッダーを付与して元のアクセスの情報を残すのが一般的です。
[106] HTTPS を扱う MITM proxy は更にいくつかのヘッダーを削除するかもしれません。
[4] HTTPクライアント (Webブラウザーその他の末端のクライアントも、 経路の中間にあるプロキシも。) のほとんどは、 何らかの接続するべきプロキシの指定 (プロキシ設定) の手段を用意しています。
[8] プロキシの機能やプロキシ設定の機能は、 クライアントソフトウェアごとに実装されていることもあれば、 動作しているプラットフォームの側で一部または全部が提供されていることもあります。
[6] プロキシ設定の方法は、ソフトウェアごとに異なりますが、
次のような手段から1つ以上提供しているのが普通です。
[18] 環境変数による指定は、http_proxy
など一式がデファクト標準となっていて、
多くのソフトウェアで共通で参照されます。
http_proxy
参照。[24] 指定の方法や提供する機能はソフトウェアごとに異なりますが、 おおよそ次のような形とするのが一般的なようです。
[97] ChromeDriver は httpProxy
にホスト:ポート
を指定できます。
GeckoDriver は httpProxy
にホスト、
httpProxyPort
にポートを指定できます。(両方指定しないとエラーが帰ってきます。)
WebDriver 仕様書は GeckoDriver の挙動の他に、 httpProxy
に URL、
httpProxyPort
無指定、という指定方法ができると書いてありますが、
GeckoDriver はエラーを返します。
[98] GeckoDriver は、 httpProxyPort
を数値でなく文字列で指定してもエラーとします。
[100] GeckoDriver で httpProxy
に ホスト:ポート
を指定しても直ちにエラーとはなりませんが、プロキシに接続できず navigate
でエラーになります。
[99] ChromeDriver は httpProxyPort
に対応していません。
[104] プロキシの名前として、通常のホスト (ドメイン名やIPアドレス) の他に、真のホストを隠匿した識別子が使われる場合があります。 これは、プロキシによって内部ネットワーク内の構造を外部に晒してしまうことを防ぐのが目的です。
[2] もともと串
というのは「プロクシ」の後半の音から取った俗語だけど、語呂がいいのですっかり定着してしまった。
[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
--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.
-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.
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
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