SOCKS

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

SOCKS は、クライアントサーバ型のアプリケーションに、ネットワーク・ファイアウォールのサービスを透過的に使用することを可能にするインターネットプロトコルの一つである。 SOCKS は、 "SOCKetS" [1] の略語である。

ファイアウォールの背後にあり、外部サーバにアクセスする必要があるクライアントは、代わりに SOCKS プロキシサーバに接続できる。 SOCKS プロキシサーバはクライアントが外部サーバにアクセスする資格を制御し、外部サーバにリクエストを伝える。 SOCKS はまた正反対にも使用することができる。つまり、ファイアウォールの外側のクライアント("外部クライアント")が、ファイアウォールの内側のサーバ(内部サーバ)に接続することを可能にする。

SOCKS は当初、 MIPS Computer Systems のシステム管理者である David Koblas によって開発された。 Koblas は、 MIPS Computer Systems が1992年に Silicon Graphics によって吸収合併された後に、その年の Usenix Security Symposium で SOCKS の研究論文を公開した。これにより SOCKS は公に利用できるようになった。[2] SOCKS は、 NEC の Ying-Da Lee によってバージョン4に拡張された。

SOCKS 関連のアーキテクチャやクライアントは Permeo Technologies によって所有されている。[3] (注 Permeo Technologies は NEC からスピンオフした Blue Coat Systems [4] によって吸収合併された。)[5]

SOCKS はOSI参照モデルのレイヤー5で動作する - セッション層(プレゼンテーション層トランスポート層の中間レイヤー)。

SOCKS 4プロトコル[編集]

標準の SOCKS 4 接続はこのように要求される。:

SOCKS クライアントからサーバ:

  • フィールド 1: SOCKS バージョン番号,1バイト,このバージョンでは 0x04 でなくてはならない
  • フィールド 2: コマンドコード,1バイト:
    • 0x01 = TCP/IP ストリーム接続を確立する
    • 0x02 = TCP/IP ポートバインディングを確立する
  • フィールド 3: ネットワークバイトオーダのポート番号,2バイト
  • フィールド 4: ネットワークバイトオーダの IP アドレス,4バイト
  • フィールド 5: ユーザID文字列, 可変長, null (0x00) で終了させる

SOCKS サーバからクライアント:

  • フィールド 1: null バイト
  • フィールド 2: 状態,1バイト
    • 0x5a = リクエストの許可
    • 0x5b = リクエストの拒絶または失敗
    • 0x5c = リクエストはクライアントが identd を起動していなかったので失敗(もしくは、サーバから到達できなかった)
    • 0x5d = リクエストはクライアントの identd がリクエストにユーザID文字列を確認できなかったので失敗
  • フィールド 3: 任意の2バイト,無視されなければならない
  • フィールド 4: 任意の4バイト,無視されなければならない

例:

これは、66.102.7.99:80にユーザ「Fred」を接続する SOCKS 4 のリクエストである。そして、サーバは、"OK"の返事をする。

  • クライアント: 0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00
    • 最後のフィールドは ASCII コードの「Fred」であり、次に1バイトの null が続く
  • サーバ: 0x00 | 0x5a | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX
    • 0xXX は全てのバイト値になることができる。 Socks 4 プロトコルはそれらのバイト値が無視されなければならないことを規定している。

この時点以降、 SOCKS クライアントから SOCKS サーバまで送る全てのデータは66.102.7.99に向けて中継される。そして、 SOCKS サーバから SOCKS クライアントに送る場合も同様である。

コマンドフィールドは、 "connect" で 0x01 、あるいは、 "bind" で 0x02 になることができる。 "bind" は動作中の FTP のようなプロトコルのために入ってくる接続を許可する。

SOCKS 4aプロトコル[編集]

SOCKS 4a は、 SOCKS 4 プロトコルのシンプルな拡張機能であり、宛先ホストのドメイン名を解決できないクライアントがドメイン名を指定することを可能にする。

クライアントは宛先アドレスの最初の3バイトを NULL に、そして最後のバイトを0でない値に設定すべきである(これは、x を非零の値として、 IP アドレス 0.0.0.x に対応する。この値は宛先アドレスとして使用してはならない。したがって、この値は、もしクライアントがドメイン名を解決できるならば、決して設定するべきではない。)。

ユーザ ID を終了する NULL バイトの次に、クライアントは宛先ドメイン名を送らなければならない、そして、それを別の NULL バイトで終了させなければならない。これは "connect" と "bind" の両方のリクエストに使われる。

SOCKS クライアントからサーバ:

  • フィールド 1: SOCKS バージョン番号,1バイト,このバージョンでは 0x04 でなくてはならない
  • フィールド 2: コマンドコード,1バイト:
    • 0x01 = TCP/IP ストリーム接続を確立する
    • 0x02 = TCP/IP ポートバインディングを確立する
  • フィールド 3: ネットワークバイトオーダのポート番号,2バイト
  • フィールド 4: ネットワークバイトオーダの IP アドレス,4バイト
  • フィールド 5: ユーザ ID 文字列, 可変長, null (0x00) で終了させる
  • フィールド 6: 接続先のホストのドメイン名, 可変長, null (0x00) で終了させる

SOCKS サーバからクライアント:

  • フィールド 1: null バイト
  • フィールド 2: 状態,1バイト
    • 0x5a = リクエストの許可
    • 0x5b = リクエストの拒絶または失敗
    • 0x5c = リクエストはクライアントが identd を起動していなかったので失敗(もしくは、サーバから到達できなかった)
    • 0x5d = リクエストはクライアントの identd がリクエストにユーザ ID 文字列を確認できなかったので失敗
  • フィールド 3: ネットワークバイトオーダのポート番号,2バイト
  • フィールド 4: ネットワークバイトオーダの IP アドレス,4バイト

4A プロトコルを使用するサーバはリクエストパケット内の宛先アドレスをチェックしなければならない。宛先アドレスが、 x を非零の値としてアドレス 0.0.0.x を表現するならば、サーバはクライアントがパケット内に送付するドメイン名を読み込まなければならない。サーバはドメイン名を解決すべきであり、そしてそれが可能であるならば、宛先ホストへの接続を確立しなくてはならない。

SOCKS 5プロトコル[編集]

より多くの認証の選択を提供する SOCKS 4 プロトコルの拡張である SOCKS 5 プロトコルは RFC 1928 内で定義されている。最初のハンドシェイクは下記の事項から成り立つ。

  • クライアントは接続し、サポートされた認証方法のリストを含む挨拶を送る。
  • サーバは一つ選ぶ(もしくは、提供されたメソッドがアクセスできないならば、失敗の応答を送る)。
  • いくつかのメッセージが、選択された認証方法に応じて、クライアントとサーバーの間を送受信される。
  • クライアントは、接続要求を SOCKS 4 と同じように送る。
  • サーバは SOCKS 4 と同じように応答する。

サポートされた認証方法は次の通りに番号を割り付けている:

  • 0x00 - 認証なし
  • 0x01 - GSSAPI
  • 0x02 - ユーザ名/パスワード
  • 0x03-0x7F - IANA により割り当てられたメソッド
  • 0x80-0xFE - プライベート使用のために予約されたメソッド

クライアントからの最初の挨拶:

  • フィールド 1: SOCKS バージョンナンバ(このバージョンでは 0x05 でなくてはならない)
  • フィールド 2: サポートされた認証方法の数,1バイト
  • フィールド 3: 認証方法, 可変長, サポートされたメソッドにつき1バイト

サーバの選択が伝えられる:

  • フィールド 1: SOCKS バージョン, 1バイト(このバージョンでは 0x05 でなくてはならない)
  • フィールド 2: 選択された認証方法, 1バイト, もしくはアクセスできないメソッドが提供した 0xFF

次の認証は認証方法によって異なり、 RFC 1929 で記述されている。

クライアントの認証要求:

  • フィールド 1: バージョン番号, 1バイト( 0x01 でなくてはならない)
  • フィールド 2: ユーザ名長,1バイト
  • フィールド 3: ユーザ名
  • フィールド 4: パスワード長,1バイト
  • フィールド 5: パスワード

認証のためのサーバの応答:

  • フィールド 1: バージョン, 1バイト
  • フィールド 2: 状態コード,1バイト
    • 0x00 = 成功
    • 他の全ての値 = 失敗, 接続は終了されなければならない

クライアントの接続要求:

  • フィールド 1: SOCKS バージョン番号, 1バイト(このバージョンでは 0x05 でなくてはならない)
  • フィールド 2: コマンドコード,1バイト:
    • 0x01 = TCP/IP ストリーム接続を確立する
    • 0x02 = TCP/IP ポートバインディングを確立する
    • 0x03 = UDP ポートを結合させる
  • フィールド 3: 予約されている, 0x00 でなければならない
  • フィールド 4: アドレスタイプ, 1バイト:
  • フィールド 5: 宛先アドレス
    • IPv4 用の4バイト
    • 1バイトのドメイン名長に続けて、ドメイン名
    • IPv6 用の16バイト
  • フィールド 6: ネットワークバイトオーダのポート番号, 2バイト

サーバの応答:

  • フィールド 1: SOCKS プロトコルバージョン, 1バイト(このバージョンでは 0x05 でなくてはならない)
  • フィールド2: 状態,1バイト
    • 0x00 = リクエストの許可
    • 0x01 = 一般的な失敗
    • 0x02 = ルール設定により許可されない接続
    • 0x03 = 到達できないネットワーク
    • 0x04 = 到達できないホスト
    • 0x05 = 宛先ホストにより拒否された接続
    • 0x06 = TTL の期限切れ
    • 0x07 = サポートされていないコマンド/ プロトコルエラー
    • 0x08 = サポートされないアドレスタイプ
  • フィールド 3: 予約されている, 0x00 でなければならない
  • フィールド 4: アドレスの種類, 1バイト:
    • 0x01 = IPv4 アドレス
    • 0x03 = ドメイン名
    • 0x04 = IPv6 アドレス
  • フィールド 5: 宛先アドレス
    • IPv4 用の4バイト
    • 1バイトのドメイン名長に続けて、ドメイン名
    • IPv6 用の16バイト
  • フィールド 6: ネットワークバイトオーダのポート番号, 2バイト

SOCKSによって外部ネットワークに接続する、全てのネットワーク・ソフトウェアの適合を可能にする "socksify"[1] というクライアント用のプログラムがある。

SOCKSソフトウェア[編集]

  • Tor
  • Kernel SOCKS Bouncer ksb26 (Kernel Socks Bouncer) は socks 4/5 chains を介して、TCP接続(ユーザが定義した目的ホストに向けて)をリダイレクトする Linux Kernel 2.6.x Loadable Kernel Module である。
  • SS5 Socks Server はオープンソースの SOCKS4/SOCKS5 サーバである.
  • DanteInferno Nettverk A/S によって開発され、商業的サポートを伴ったオープンソースの SOCKS4/SOCKS5 実装である。
  • OpenSSH は遠隔サーバーに SSH トンネルを介して SOCKS の要求を送ることをサポートしている。
  • WinSocksProxy Labs により開発された軽量 SOCKS4/SOCKS5 サーバである。
  • SOcat Multipurpose は (SOcket CAT) を中継する: socks4 とsocks4a の機能性を含む (Linux / Mac)
  • FreeCap Windows 用の Socksifyer , 全てのアプリケーションは、一つの SOCKS あるいは HTTP proxy によって、そのネットワークトラフィックを透過的に実行することができる。
  • DeleGate 汎用Proxyソフトウェア。SOCKS4/SOCKS5サーバとしても、クライアントとしても使用出来る。

参照[編集]

  1. ^ Hummingbird SOCKS FAQ
  2. ^ Darmohray, Tina. "Firewalls and fairy tales". ;LOGIN:. Vol 30, no. 1.
  3. ^ http://www.socks.permeo.com/ (broken link as of July 2008)
  4. ^ News Release from Bluecoat
  5. ^ Article from infosecurityproductsguide.com

外部リンク[編集]