SOCKS

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

SOCKSは、クライアントサーバー間で転送されるネットワークパケットをプロキシサーバー経由で交換するためにインターネット上で利用されるプロトコルである。SOCKS5は、追加で認証の機能を提供するため、認証されたユーザーのみ接続を許可するように設定できる。実用的には、SOCKSサーバーはTCP接続を任意のIPアドレスにプロキシしたり、UDPパケットを転送する手段を提供する。

SOCKSはOSI参照モデルの第5層のセッション層プレゼンテーション層トランスポート層の中間)で実行される。そのため、SOCKSサーバーは、クライアントからのTCPポート1080の接続を受け入れる必要がある[1][2]

歴史[編集]

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

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

SOCKS5プロトコルは、もともとはファイアウォールの一部として、他のセキュリティ製品とともに管理を容易にするために作られたセキュリティプロトコルだった[7]。1996年にIETFによって承認された[7]。SOCKS5は、アジア外の技術を販売している企業Aventail Corporationの協力のもとに開発された[8]

使用例[編集]

SOCKS は、circuit-level gateways英語版のファイアウォールにおけるデファクトスタンダードとなっている[要出典]

SOCKSは迂回のためのツールとしても使用されることがある。たとえば、政府、職場、学校、特定の国限定のウェブサービスなどで、インターネットのコンテンツへのアクセスフィルタやブロッキングが行われている場合に、それらを回避することができる[9]

OpenSSHなどのSSHスイートの一部では、動的なポートフォワーディングをサポートしており、これにより、ユーザーはローカルなSOCKS proxyを作成することができる[10]。この機能のおかげで、リモートポートやサーバーがあらかじめ作成されていなくても、ユーザーはSOCKS proxyを自由に利用できる。

Tor onion proxyソフトウェアは、クライアントに対して、SOCKSインターフェイスを提供している[11]

サイバー犯罪における使用[編集]

クラッキングされたコンピュータには、ボットネットの制御を隠したり、クレジットカード詐欺の目的のために、SOCKS proxyソフトウェアが設定されることがある[12][13][14][15]

解説[編集]

SOCKSは、ネットワーク・ファイアウォール越えやアクセス制御等を目的として、クライアントサーバ型のプロトコルが、透過的に使用できるよう設計されたプロキシ(proxy)のプロトコル、及びシステム(の一つ)である。"SOCKetS" [16] の略。

いわゆるTCP/IPの4層モデル(インターネット・プロトコル・スイートDARPAモデル)の観点からは、Internet Protocol(IP)の上の、TCPUDP(ただしUDPに関しては有用性が限られる)のようなトランスポート層における通信の手続きを中継・代理するメカニズムとなっている。SOCKSサーバ自身とクライアント間の通信はストリーム指向であり、一般にはLAN内からTCPで接続する。

プロトコル上は多段にもできるが、原理の説明には1段階で十分なので、以下はそのような前提とする。またファイアウォールを設けないシステムでもユースケースは考えられるが、以下ではファイアウォールの存在を前提とする。

似たような目的のための他のプロキシ類と同様、SOCKSサーバはその目的から、内外のネットワークの両方が見えるファイアウォール自身、あるいはDMZ内に置く。そうでない場合は、SOCKSサーバのみは外部との通信を可能にする、あるいは、内部からSOCKサーバにだけは通信を可能にする、といったような設定が必要となる。

そして、内側から外部に通信する必要があるノードは、代わりにSOCKSサーバに接続し、SOCKSサーバがプロキシとして代わりに外部と通信する。SOCKSプロキシは、例えば、クライアントが外部サーバにアクセスする資格を制御するなどといった、認証や認可を掛けることもできる。SOCKSはまた正反対にも使用することができる。つまり、ファイアウォールの外側の許可された外部クライアントのみが、物理的にはファイアウォールの内側にある、公開のサービスを提供するサーバのみに接続できるようにする、といった用途のための設定もできる。

プロトコル[編集]

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: サーバ側でbindされたアドレス
    • IPv4 用の4バイト
    • 1バイトのドメイン名長に続けて、ドメイン名
    • IPv6 用の16バイト
  • フィールド 6: ネットワークバイトオーダのポート番号, 2バイト

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

ソフトウェア[編集]

  • 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 は、動的ポートフォワード機能を利用するためのインタフェースのひとつとして、SOCKS プロトコルを使うことができる。OpenSSH クライアントを仮想的な SOCKS サーバの受付側にすることができ、接続先の OpenSSH サーバが仮想的な SOCKS サーバの出口側となって、クライアントからのネット接続を代理する。
  • WinSocksProxy Labs により開発された軽量 SOCKS4/SOCKS5 サーバである。
  • SOcat Multipurpose は (SOcket CAT) を中継する: socks4 とsocks4a の機能性を含む (Linux / Mac)
  • FreeCap Windows 用の Socksifyer , 全てのアプリケーションは、一つの SOCKS あるいは HTTP proxy によって、そのネットワークトラフィックを透過的に実行することができる。
  • DeleGate 多機能なProxyソフトウェア。SOCKS4/SOCKS5サーバとしての他、多段プロキシ的に自身の接続のためにSOCKSを使うクライアントとしての機能もある。

参考文献[編集]

  1. ^ RFC 1928
  2. ^ Service Name and Transport Protocol Port Number Registry”. Internet Assigned Numbers Authority (2017年5月19日). 2017年5月23日閲覧。
  3. ^ Darmohray, Tina. "Firewalls and fairy tales". ;LOGIN:. Vol 30, no. 1.
  4. ^ http://www.socks.permeo.com/ (broken link as of July 2008)
  5. ^ News Release from Bluecoat
  6. ^ Article from infosecurityproductsguide.com
  7. ^ a b RFC 1928
  8. ^ CNET: Cyberspace from outer space
  9. ^ 2010 Circumvention Tool Usage Report”. The Berkman Center for Internet & Society at Harvard University (2010年10月). 2018年8月20日閲覧。
  10. ^ OpenSSH FAQ”. 2002年2月1日時点のオリジナル[リンク切れ]よりアーカイブ。
  11. ^ Tor FAQ”. I want to run another application through Tor.. 2018年8月28日閲覧。
  12. ^ “How to chain socks with Tor”. https://www.deepdotweb.com/security-tutorials/chain-socks-tor/ 2017年1月23日閲覧。 
  13. ^ Graham, James. Cyber Fraud. p. 45. https://books.google.co.uk/books?id=BZLLBQAAQBAJ&pg=PA45&lpg=PA45&dq=socks+proxy+fraud&source=bl&ots=x6VDwUxEct&sig=H8gsSdPljFhdefp17-Tmg-E8W5g&hl=en&sa=X&ved=0ahUKEwjh6Lzx6tjRAhVcFMAKHco4AxwQ6AEIRjAH#v=onepage&q=socks%20proxy%20fraud&f=false. 
  14. ^ Krebs, Brian (2016年10月16日). “IoT Devices as Proxies for Cybercrime”. https://krebsonsecurity.com/2016/10/iot-devices-as-proxies-for-cybercrime/ 2017年1月23日閲覧。 
  15. ^ van Hardeveld, Gert Jan; Webber, Craig; O'Hara, Kieron. Discovering credit card fraud methods in online tutorials. https://www.researchgate.net/publication/303418684_Discovering_credit_card_fraud_methods_in_online_tutorials 2017年8月23日閲覧。. 
  16. ^ Hummingbird SOCKS FAQ

外部リンク[編集]