-
Notifications
You must be signed in to change notification settings - Fork 4
/
805.txt
235 lines (176 loc) · 10.4 KB
/
805.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
[22] [DFN[[[SOCKS]]]] は、 [[TCP]] [[アプリケーション]]のための[[トンネル]]化[[プロトコル]]です。
[[防火壁]]等を越えて [[HTTP]] その他の[[アプリケーション層プロトコル]]で通信するために使います。
* 仕様書
[REFS[
- [9] [CITE[SOCKS: A protocol for TCP proxy across firewalls]] ([TIME[2002-04-03 17:26:00 +09:00]] 版) <http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol>
- [14] [CITE[SOCKS 4A: A Simple Extension to SOCKS 4 Protocol]] ([TIME[2012-04-12 19:29:58 +09:00]] 版) <http://www.openssh.com/txt/socks4a.protocol>
- [6] [CITE@en[RFC 1928 - SOCKS Protocol Version 5]] ([TIME[2015-08-02 14:17:13 +09:00]] 版) <https://tools.ietf.org/html/rfc1928>
- [7] [CITE[RFC Errata Report]] ([TIME[2015-09-11 18:57:28 +09:00]] 版) <https://www.rfc-editor.org/errata_search.php?rfc=1928>
- [8] [CITE@en[RFC 1929 - Username/Password Authentication for SOCKS V5]] ([TIME[2015-07-26 16:21:40 +09:00]] 版) <https://tools.ietf.org/html/rfc1929>
- [10] [CITE@en[RFC 1961 - GSS-API Authentication Method for SOCKS Version 5]] ([TIME[2015-06-21 17:56:54 +09:00]] 版) <https://tools.ietf.org/html/rfc1961>
]REFS]
* 操作
[19] [[SOCKS]] 4 には [CODE[[[CONNECT]]]] と [CODE[[[BIND]]]] の2つの[RUBYB[操作]@en[operation]]があります [SRC[>>9]]。
[21] [[要求]]には次の欄があります。
[FIG(list members)[
:[CODE[[[VN]]]]: 最初のバイトはプロトコルの版番号で、 [CODE[4]] とするべきです [SRC[>>9]]。
:[CODE[[[CD]]]]: 第2バイトは[RUBYB[命令符号]@en[command code]]で、
[CODE[[[CONNECT]]]] では [CODE[1]] とするべきで、
[CODE[[[BIND]]]] では [CODE[2]] としなければなりません [SRC[>>9]]。
:[CODE[[[DSTPORT]]]]: その次の2バイト [SRC[>>9]] は[[ポート番号]]です。
:[CODE[[[DSTIP]]]]: その次の4バイト [SRC[>>9]] は[[IPアドレス]]です。
:[CODE[[[USERID]]]]: その次の任意の長さのバイト列は userid とします [SRC[>>9]]。
:[CODE[[[NULL]]]]: 最後の1バイトは [CODE[0]] とします [SRC[>>9]]。
]FIG]
[FIG(packet)[
:width:32
= 8 VN
= 8 CD
= 16 DSTPORT
= 32 DSTIP
= 56... USERID
= 8 NULL
]FIG]
[32] 明記されていませんが、 [CODE[[[USERID]]]] に [[NULL]]
は含められないと思われます。
[37] 返答パケットには次の欄があります [SRC[>>9]]。
[FIG(list members)[
:[[VN]]: 最初の1バイトは、返答符号の版とします。 [CODE[[[0]]]] とするべきです [SRC[>>9]]。
:[[CD]]: 次の1バイトは、結果符号とします [SRC[>>9]]。
:[CODE[[[DSTPORT]]]]: その次の2バイト [SRC[>>9]] は[[ポート番号]]です。
:[CODE[[[DSTIP]]]]: その次の4バイト [SRC[>>9]] は[[IPアドレス]]です。
]FIG]
[FIG(packet)[
:width:32
= 8 VN
= 8 CD
= 16 DSTPORT
= 32 DSTIP
]FIG]
[26] 結果符号は、次のいずれかです [SRC[>>9]]。
[FIG(list)[
- [CODE[[[90]]]] は、要求を受け入れたことを表します。
- [CODE[[[91]]]] は、要求を拒絶または失敗したことを表します。
- [CODE[[[92]]]] は、[[クライアント]]の [[identd]] に接続できなかったために要求を拒絶したことを表します。
- [CODE[[[93]]]] は、[[クライアント]]と [[identd]] が異なる user-id を報告したために要求を拒絶したことを表します。
]FIG]
[48] 明記されていませんが、[[ネットワークバイト順]]と思われます。
** [CODE[CONNECT]] 操作
[20] [[クライアント]]は、他のホストに接続したい時、 [[SOCKS]] [[サーバー]]に接続して、
[CODE[[[CONNECT]]]] [[要求]]を送信します [SRC[>>9]]。
[31] [CODE[[[DSTIP]]]] は[[終点]]の [[IPアドレス]]、
[CODE[[[DSTPORT]]]] は[[終点]]の[[ポート番号]]とします [SRC[>>9]]。
[23] [[サーバー]]は、 [CODE[[[CONNECT]]]] [[要求]]を受信したら、
受け付けるかどうかを次の情報の一部または全部を使って検査します [SRC[>>9]]。
[FIG(list)[
- [[始点]] [[IPアドレス]]
- [[終点]] [[IPアドレス]]
- [[終点]][[ポート番号]]
- [[userid]]
- [[RFC 1413]] [[IDENT]] により得られる情報
]FIG]
[24] [[サーバー]]は、要求を受け付ける場合には、
指定された[[終点]]のホストとポートに接続します [SRC[>>9]]。
[25] [[サーバー]]は、接続が確立されたら、
または拒絶する時や操作が失敗した時は、
返答パケットを送信します [SRC[>>9]]。
[38] 返答パケットの [CODE[[[DSTIP]]]] と [CODE[[[DSTPORT]]]] は、無視します [SRC[>>9]]。
;; [39] サーバーが何を設定するべきなのかは明らかではありません。
[27] [[サーバー]]は失敗または拒絶を通知したら、直ちに[[接続]]を閉じます [SRC[>>9]]。
[45] 一定時間 (例えば2分) 経過後接続が確立できていなければ、
断念して[[クライアント]]との接続も閉じます [SRC[>>9]]。
;; [46] その場合も返答パケットは送信するべきと思われますが、不明瞭です。
[28] 要求を受け入れた場合は、以後送受信を中継します [SRC[>>9]]。
** [CODE[BIND]] 操作
[29] [[クライアント]]は、他のホストからの接続を受け付けたい時、
[[SOCKS]] [[サーバー]]に接続して [CODE[[[BIND]]]]
要求を送信します [SRC[>>9]]。
;; [30] 任意のホストに対するアプリケーションサービスの提供を想定しているのではなく、
[CODE[[[CONNECT]]]] で主たる接続を確立済みの同じアプリケーションでサーバーからクライアントへと補助的な接続を確立する
(のを待ち受ける) ためのもののようです。
[33] [CODE[[[DSTIP]]]] はアプリケーションサーバーの [[IPアドレス]]、
[CODE[[[DSTPORT]]]] は主たる接続の[[ポート番号]]とします [SRC[>>9]]。
;; [34] つまり [CODE[[[CONNECT]]]] 要求で指定した[[終点]]です。
[35] [[サーバー]]は、[[クライアント]]の情報により、
受け付けるかどうか決定します [SRC[>>9]]。
[36] [[サーバー]]は、受け付ける場合も受け付けない場合も、
返答パケットを送信します [SRC[>>9]]。
[40] 受け入れる場合 ([CODE[[[CD]]]] = [CODE[[[90]]]]) は、
[[サーバー]]は接続を待ち受けることとし、その[[IPアドレス]]と[[ポート番号]]を返答パケットの
[CODE[[[DSTIP]]]] と [CODE[[[DSTPORT]]]] にそれぞれ設定します [SRC[>>9]]。
[41] [CODE[[[DSTIP]]]] が [CODE[[[0]]]] ([CODE[[[INADDR_ANY]]]])
の場合、[[クライアント]]は、[[SOCKS]] [[サーバー]]の
[[IPアドレス]]とみなすべきです [SRC[>>9]]。
[42] それ以外の場合は [CODE[[[DSTIP]]]] と [CODE[[[DSTPORT]]]] は無視されます [SRC[>>9]]。
[43] [[サーバー]]が待ち受けるアドレスに接続があると、
次のようにします。
[FIG(steps)[
= 接続元の[[ホスト]]と [CODE[[[BIND]]]] 要求の [CODE[[[DSTIP]]]] が一致すれば、
== 返答パケットを[[クライアント]]に送信します。 [CODE[[[CD]]]] は [CODE[[[90]]]] とします。
== 以後両接続間の送受信を中継します。
= それ以外なら、
== 返答パケットを[[クライアント]]に送信します。 [CODE[[[CD]]]] は [CODE[[[91]]]] とします。
== 両接続とも、切断します。
]FIG]
[44] 一定時間 (例えば2分) 経過後接続が確立できていなければ、
断念して[[クライアント]]との接続も閉じます [SRC[>>9]]。
;; [47] その場合も返答パケットは送信するべきかもしれませんが、不明瞭です。
* URL scheme
[FIG(short list)[
- [CODE(URI)@en[[[socks:]]]]
- [CODE(URI)@en[[[socks4:]]]]
- [CODE(URI)@en[[[socks4a:]]]]
- [CODE(URI)@en[[[socks5:]]]]
]FIG]
* 実装
[FIG[
[FIGCAPTION[
[1] [CITE[AnyEvent::HTTP::Socks - search.cpan.org]] ([TIME[2012-04-25 09:51:27 +09:00]] 版) <http://search.cpan.org/~oleg/AnyEvent-HTTP-Socks-0.04/lib/AnyEvent/HTTP/Socks.pm>
]FIGCAPTION]
[PRE(URI code)[
"socks4://10.0.0.1:1080 socks5://root:123@10.0.0.2:1080 socks4a://85.224.100.1:9010"
]PRE]
]FIG]
[FIG[
[FIGCAPTION[
[3] [CITE[AnyEvent::HTTP::Socks - search.cpan.org]] ([TIME[2012-04-25 09:51:27 +09:00]] 版) <http://search.cpan.org/~oleg/AnyEvent-HTTP-Socks-0.04/lib/AnyEvent/HTTP/Socks.pm>
]FIGCAPTION]
[PRE(URI code)[
http_get 'http://www.google.com/', socks => 'socks5://localhost:1080', sub {
]PRE]
]FIG]
[4] [CITE[LWP::Protocol::socks - search.cpan.org]]
([TIME[2010-01-20 18:01:04 +09:00]] 版)
<http://search.cpan.org/~scr/LWP-Protocol-socks-1.1/lib/LWP/Protocol/socks.pm>
[FIG[
[FIGCAPTION[
[5] [CITE[SSH: プロキシ設定の定義]] ([TIME[2011-12-14 03:32:52 +09:00]] 版) <http://www.ssh.com/manuals/client-user/43J/firewall.html>
]FIGCAPTION]
> プロキシサーバのアドレスを入力します SOCKSプロキシのためのアドレス形式は次のとおりです。
[PRE(URI code)[
socks://username@socks_server:port/network/netmask,network/netmask...
]PRE]
>
プロキシサーバ設定の例:
[PRE(URI code)[
socks://socks.ssh.com:1080/203.123.0.0/16,198.74.23.0/24
]PRE]
]FIG]
* メモ
[2] [CITE@ja[SOCKS - Wikipedia]]
( ([TIME[2011-12-10 16:21:00 +09:00]] 版))
<http://ja.wikipedia.org/wiki/SOCKS>
[13] [CITE@en[SOCKS - Wikipedia, the free encyclopedia]] ([TIME[2015-09-05 01:05:46 +09:00]] 版) <https://en.wikipedia.org/wiki/SOCKS>
[11] [CITE@en[RFC 3089 - A SOCKS-based IPv6/IPv4 Gateway Mechanism]] ([TIME[2015-07-26 16:11:34 +09:00]] 版) <https://tools.ietf.org/html/rfc3089>
[12] [CITE@en[draft-ietf-aft-socks-chap-01 - Challenge-Handshake Authentication Protocol for SOCKS V5]] ([TIME[2015-07-20 00:36:46 +09:00]] 版) <https://tools.ietf.org/html/draft-ietf-aft-socks-chap-01>
[15] [CITE[IO::Socket::Socks - search.cpan.org]]
([TIME[2015-09-11 19:05:59 +09:00]] 版)
<http://search.cpan.org/dist/IO-Socket-Socks/lib/IO/Socket/Socks.pm>
[16] [CITE@ja[第 15 章 SOCKS の使用]]
([TIME[2010-12-30 01:42:14 +09:00]] 版)
<https://docs.oracle.com/cd/E19438-01/819-3160/agsocks.html>
[17] [CITE@en[Socks Proxy - Free Socks5 and Socks4 Proxy List]]
([TIME[2015-09-11 19:32:04 +09:00]] 版)
<http://www.socks-proxy.net/>
[18] >>17 によれば 5 が多いですが、 4 (4 か 4a かは不明。) もまだまだ使われているようです。
[TIME[2015-09-11T10:11:54.200Z]]