-
Notifications
You must be signed in to change notification settings - Fork 4
/
27.txt
294 lines (219 loc) · 15.3 KB
/
27.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
[46] [DFN[[RUBYB[プロキシ]@en[proxy]]]]は、[[アプリケーション層プロトコル]]を中継するものです。
[[Web]] では、 [[HTTP]] や [[FTP]] などの通信を[[ネットワーク]]境界を超えさせるために使ったり、
[[キャッシュ]]や[[アプリケーション層]]の[[経路制御]]などの機能のために用いたりします。
* 仕様書
[REFS[
- [7] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#page-10>
- [16] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-18>
]REFS]
* 分類と用途
[15] [[プロキシ]]は、[[キャッシュ]]、[[変形]]、[[経路制御]]、[[アクセス制御]]・[[防火壁]]、[[ウイルス検査]]、
[[検閲]]、[[検閲]]回避など様々な目的のために利用されています。
[10] [[プロキシ]]は、用途や[[プロトコル]]、配置などによって、様々に分類されています。
[FIG(short list)[
- [[キャッシュ串]]
- [[共有串]]
- [[open proxy]]
- [[変形串]]
- [[順プロキシ]]
- [[逆プロキシ]]
- [[透過串]]
- [[interception proxy]]
]FIG]
[19] 特定の [[Webサイト]]の [[HTML]]
を書き換えたり [[JavaScript]] を注入したり、[[キャッシュ]]機能を強化したりして[[利用者]]側で高度な
[[Webサイト]]のカスタマイズを行うことを目的とした[[串]]もあります。
他の言語や方言に翻訳する[[串]]もあります。しかしこうした内容を書き換える[[串]]は[[利用者エージェント]]にとって
[[MITM]] 攻撃と区別がつかないので、好ましくないのかもしれません。
そのような書き換えがあったかどうか[[利用者エージェント]]側から確実に判定する方法はありません。
[31] 組織内ネットワークの出入口に当たる[[串]]や、年少者向けの[[フィルタリング]]を行う[[串]]など、
[[検閲]]を目的とした[[串]]は[[ドメイン名]]、[[IPアドレス]]、[[URL]]、[[応答]]の内容その他の[[要求]]や[[応答]]の特徴に基づき[[要求]]を遮断したり、
[[応答]]を改変・差し替えたりすることがあります。その場合は [CODE(HTTP)[[[403]]]]
などの[[状態符号]]が使われると思われますが、その保証はありません。また[[利用者エージェント]]側から通常の[[応答]]と確実に区別する方法はありません。
;; [32] [[透過プロキシ]]により、こうした改変が[[利用者]]の気づかないうちに行われている場合もあります。
;;
[9] [[HTTP]] は、一般的な技術用語としての「[[プロキシ]]」よりもかなり狭い意味
([[HTTP]] を[[プロトコル]]として使った[[順プロキシ]]) に限定して
「[[プロキシ]]」を定義しています。
[[interception proxy]] や[[透過串]]は、[[クライアント]]によって選択されたものではありませんから、
[[HTTP]] の定義による[[プロキシ]]ではありません [SRC[>>7 2.3.]]。
[[HTTP]] の[[プロキシ]]については、[[順プロキシ]]を参照。
[1] 組織内ネットワークから外部のネットワークに接続するため、
あるいは [[VPN]] 等特別なネットワークに接続するために[[プロキシ]]を通す必要がある場合も存在します。
実用上、 [[Webブラウザー]]その他の [[Web]] の[[クライアント]]ソフトウェアは、
[[プロキシ]]に対応しなければなりません。
[14] [[串]]は多段化できます。すなわち、[[串]]もまた[[串]]を使うことができます。
[EG[
[13] [[インターネット]]と[[アプリケーションサーバー]]の間に、
[[ネットワーク]]境界を超えると共に[[経路制御]]を行うための[[逆プロキシ]]と、
[[HTTPキャッシュ]]機能を持った[[プロキシ]]の2段階の[[サーバー]]を挟むことがあります。
]EG]
[11] あるいは、上位層の[[プロトコル]]の[[プロキシ]]を使った通信が、それとは別個に、
下位層の[[プロキシ]]を使った通信の上で行われることもあります。
* プロトコル
[48] [[プロキシ]]の実現を目的とした[[プロトコル]]に次のようなものがあります。
[FIG(short list)[
- [[SOCKS]]
- [[PAC]]
- [[WPAD]]
]FIG]
[49] [[プロキシ]]を想定した機能を持った[[プロトコル]]に次のようなものがあります。
[FIG(short list)[
- [[HTTP]]
-- [[HTTP over FTP]]
]FIG]
[22] [[素のHTTP]] では、[[プロキシ]]が[[要求]]を解釈し改めて自身の[[要求]]として[[上流]]に送信する形を採っています。
[[HTTPS]] では、 [[TLS]] の仕様や趣旨からそのような書き換えは望ましくない
(というか [[MITM proxy]] でない限り不可能) なため、[[プロキシ]]は [[TLS]]
の通信を盲目的に中継する[[トンネル]]として動作します。
[20] [[WebSocket]] は、通常の [[HTTP]] と同じ形で[[プロキシ]]が使えます。
[17] [[WebDAV]] に対応する[[串]]は、 [[HTTP/1.1]] に適合しなければ[['''なりません''']]
[SRC[>>16]]。
[21] [[FTP]] の[[プロキシ]]は色々な方法が歴史的に使われてきましたが、
[[Web]] ではもっぱら [[FTP over HTTP]] が使われます。
** 認証
[33] [[串]]は、その機能の一部または全部の利用に[[ログイン]]等の操作が必要なことがあります。
[[プロキシ]]の[[プロトコル]]に[[認証]]機能が組み込まれていることもあります。
[[ログイン]]等の操作を促す手段として [[captive portal]] が用いられる場合もあります。
** エラー処理
[25] [[プロトコル]]によっては、[[起源サーバー]]のエラーと[[プロキシ]]自体のエラーや[[プロキシ]]から[[上流]]への接続に関するエラーを明確に区別できないことがあります。
[EG[
[27] [[素のHTTP]]の[[プロキシ]]機能では、[[プロキシ]]が[[上流]]からの[[エラー応答]]を[[転送]]したのか、
[[プロキシ]]が[[エラー応答]]を[[生成]]したのか[[クライアント]]が確実に区別する方法がありません。
]EG]
** セキュリティー
[28] [[プロキシ]]を通じて使う[[プロトコル]]が [[HTTPS]] のように [[TLS]]
を使って[[セキュリティー]]を確保したものでは無い場合、
[[クライアント]]は[[プロキシ]]を無条件で信頼することになります。
[EG[
[29] 例えば[[素のHTTP]]の[[プロキシ]]機能の場合は、[[プロキシ]]は[[応答]]の内容を自由に覗いて自由に書き換えることができます。
[[プロキシ]]が信頼できないものであるなら、機密情報が漏洩するかもしれませんし、
危険な[[スクリプト]]が埋め込まれるかもしれません。
]EG]
[35] 組織内ネットワークなどで[[プロキシ]]が絶対に信頼できる場合を除いて、
[[プロキシ]]を使って[[平文]]で通信するべきではありません。
[[プロキシ]]が信頼できるはずの場合でも、信頼できない[[プロキシ]]が別に設置される危険性には注意が必要です。
[EG[
[36] 例えば悪意のある者が物理的に[[ネットワーク]]にアクセスできるなら、
[[プロキシ]]として動作する[[計算機]]から [[LANケーブル]]を抜いて、
偽の[[プロキシ]]に差し替えるかもしれません。
]EG]
* クライアントの設定
[4] [[Webブラウザー]]その他の末端の[[クライアント]]も、
経路の中間にある[[プロキシ]]も、
ほとんどは接続するべき[[プロキシ]]を指定する何らかの手段を用意しています。
[8] [[プロキシ]]の機能や指定機能は、[[クライアント]]ソフトウェアごとに実装されていることもあれば、
動作している[[プラットフォーム]]の側で一部または全部が提供されていることもあります。
[EG[
[12] 例えば [[Windows]] は [[OS]] 全体の[[プロキシ]]設定を保持しています。
]EG]
;; [[ネットワーク設定]]も参照。
[6] [[プロキシ]]の指定方法は、[[ソフトウェア]]ごとに異なりますが、
次のような手段から1つ[[以上]]提供しているのが普通です。
[FIG(list middle)[
- 設定画面
- 設定ファイル
- [[コマンドライン引数]]
- [[環境変数]]
]FIG]
[18] [[環境変数]]による指定は、[CODE[http_proxy]] など一式が[[デファクト標準]]となっていて、
多くのソフトウェアで共通で参照されます。
;; [CODE[http_proxy]] 参照。
[24] 指定の方法や提供する機能はソフトウェアごとに異なりますが、
おおよそ次のような形とするのが一般的なようです。
[FIG(list members)[
: [F[[[HTTP]] [[プロキシ]]]] : ([F[プロトコル]], [F[ホスト]], [F[ポート]]) または [[null]]
: [F[[[HTTPS]] [[プロキシ]]]] : ([F[プロトコル]], [F[ホスト]], [F[ポート]]) または [[null]]
: [F[[[FTP]] [[プロキシ]]]] : ([F[プロトコル]], [F[ホスト]], [F[ポート]]) または [[null]]
: [F[[[SOCKS]] [[プロキシ]]]] : ([F[プロトコル]], [F[ホスト]], [F[ポート]]) または [[null]]
: [F[[[PAC]] の [[URL]]]] : [[絶対URL]]または [[null]]
: [F[[[WPAD]] 利用フラグ]] : [[boolean]]
: [F[除外[[ホスト]]リスト]] : 0個[[以上]]の[[ホスト]]の[[リスト]]
]FIG]
;; [26] かつては [[Gopher]] や [[WAIS]] にも対応していることが多かったのですが、
最近は見かけません。ソフトウェアの種類によっては、 [[POP]]、[[IMAP]]、[[SMTP]]、
[[IRC]] などの指定もできるかもしれません。
;; [30] [[Webブラウザー]]以外の[[クライアント]]は [[PAC]] や [[WPAD]]
に対応していない場合も少なくありません。
;; [23] [[HTTP接続の処理]]や[[ネットワーク設定]]も参照。
* メモ
[2] もともと[CODE[串]]というのは「プロクシ」の後半の音から取った[[俗語]]だけど、語呂がいいのですっかり定着してしまった。
[3] 派生語: [[串刺し]], [[串規制]]
[5]
[CITE[国内open proxyの現状]] <http://spam.h1r.org/jpproxy/index.html>
([[名無しさん]] [WEAK[2006-05-27 02:42:05 +00:00]])
[34] [CITE@en[draft-rpeon-httpbis-exproxy-00 - Explicit Proxies for HTTP/2.0]]
([TIME[2015-04-24 04:17:39 +09:00]] 版)
<http://tools.ietf.org/html/draft-rpeon-httpbis-exproxy-00>
[37] [CITE[Pretty-Bad-Proxy: An Overlooked Adversary in Browsers’ HTTPS Deployments - Microsoft Research]]
([TIME[2015-09-13 00:16:48 +09:00]] 版)
<http://research.microsoft.com/apps/pubs/default.aspx?id=79323>
[38] [CITE@en[713023 – Websockets: don't prefer SOCKS to HTTP proxy until bug 449251 is fixed]]
([TIME[2015-09-14 23:36:09 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=713023>
[39] [CITE@en[''''''[''''''chrome'''''']'''''' Index of /trunk/src/net/proxy]]
([TIME[2015-09-22 18:15:37 +09:00]] 版)
<http://src.chromium.org/viewvc/chrome/trunk/src/net/proxy/>
[40] [CITE[Secure Web Proxy - The Chromium Projects]]
([TIME[2016-04-23 03:43:10 +09:00]] 版)
<https://www.chromium.org/developers/design-documents/secure-web-proxy>
[41] [CITE[Data Saver - Google Chrome]]
([TIME[2016-04-23 17:44:55 +09:00]] 版)
<https://developer.chrome.com/multidevice/data-compression>
[42] [CITE@en[378637 – Add support for connecting to HTTP proxy over HTTPS]]
([TIME[2016-04-23 18:34:40 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=378637>
[43] [CITE@en[Features/HTTPS - Squid Web Proxy Wiki]]
( ([TIME[2016-05-07 01:33:40 +09:00]]))
<http://wiki.squid-cache.org/Features/HTTPS>
[FIG(quote)[
[FIGCAPTION[
[44] [CITE[cURL - How To Use]]
( ([TIME[2016-05-31 06:05:05 +09:00]]))
<https://curl.haxx.se/docs/manpage.html#--proxy10>
]FIGCAPTION]
> --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.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[45] [CITE[cURL - How To Use]]
( ([TIME[2016-05-31 06:05:05 +09:00]]))
<https://curl.haxx.se/docs/manpage.html#-x>
]FIGCAPTION]
> -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.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[47] [CITE@ja[匿名化ソフト(TOR)で攻撃された場合の生IPアドレス取得方法 | WhiteHackerzBlog ハッカー養成学院 公式ブログ]]
( ([TIME[2016-06-16 11:33:38 +09:00]]))
<http://www.whitehackerz.jp/blog/?p=1809>
]FIGCAPTION]
> Flash Playerは串に非対応
> Javaはブラウザに設定された串を使用できるが、
> 串を使用せずにリクエストを送信することもできる
> SilverlightのHTTPクライアントはブラウザに設定された串を使用するが、
> ソケットクラスを使用すれば串をbypassできる
]FIG]
[50] [CITE@en[Issue 35748 - chromium - Flash Plugin for Linux does NOT honor the --proxy-server command line options - Monorail]]
( ([TIME[2016-06-16 11:35:01 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=35748>
[FIG(quote)[
[FIGCAPTION[
[51] [CITE[evan_tech -- socks5 proxying flash via ssh]]
( ([TIME[2016-06-16 11:36:29 +09:00]]))
<http://evan-tech.livejournal.com/273224.html>
]FIGCAPTION]
> tsocks firefox
]FIG]
[52] [CITE@en[Issue 35748 - chromium - Flash Plugin for Linux does NOT honor the --proxy-server command line options - Monorail]]
( ([TIME[2016-06-16 11:37:53 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=35748>