靴下

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

SOCKSは、プロキシサーバーを介してクライアントサーバー間でネットワークパケットを交換するインターネット プロトコルですSOCKS5はオプションで認証を提供するため、許可されたユーザーのみがサーバーにアクセスできます。実際には、SOCKSサーバーはTCP接続を任意のIPアドレスにプロキシし、UDPパケットを転送する手段を提供します。

SOCKSは、OSIモデルのレイヤー5 (セッションレイヤー、プレゼンテーションレイヤートランスポートレイヤーの間の中間レイヤー)で実行されます。SOCKSサーバーは、 RFC  1928で定義されているように、TCPポート1080で着信クライアント接続を受け入れます[2]

歴史

このプロトコルは元々、 MIPS ComputerSystemsのシステム管理者であるDavidKoblasによって開発/設計されました1992年にMIPSがシリコングラフィックスに買収された後、Koblasはその年のUsenixセキュリティシンポジウムでSOCKSに関する論文を発表し[3]、SOCKSを公開しました。[4]プロトコルはNECのYing-DaLeeによってバージョン4に拡張されました

SOCKSリファレンスアーキテクチャとクライアントは、Permeo Technologies [5]が所有しています。NECからのスピンオフです。Blue CoatSystemsはPermeoTechnologiesを買収し、Symantecに買収されました。)

SOCKS5プロトコルは元々、ファイアウォールやその他のセキュリティ製品の管理を容易にするセキュリティプロトコルでした。これは、1996年にRFC 1928としてIETFによって承認されました(作成者:M。Leech、M。Ganis、Y。Lee、R。Kuris、D。Koblas、およびL.Jones)。このプロトコルは、アジア以外で技術を販売しているAventailCorporationと共同で開発されました。[6] 

使用法

SOCKSは、回線レベルのゲートウェイ(レベル5ゲートウェイ)の事実上の標準です。[7]

SOCKSの回線/セッションレベルの性質により、TCP(またはSOCKS5以降のUDP)トラフィックを転送するための多用途のツールとなり、すべてのタイプのルーティングツールに適したインターフェイスが作成されます。次のように使用できます。

  • 回避ツール。トラフィックがインターネットフィルタリングをバイパスして、政府、職場、学校、国固有のWebサービスなどによってブロックされているコンテンツにアクセスできるようにします。[8] SOCKSは非常に検出可能であるため、一般的なアプローチは、より高度なプロトコル用のSOCKSインターフェイスを提示することです。
    • Tor onionプロキシソフトウェアは、クライアントにSOCKSインターフェイスを提供します[9]
  • 仮想プライベートネットワークと同様の機能を提供し、接続をサーバーの「ローカル」ネットワークに転送できるようにします。
    • OpenSSHなどの一部のSSHスイートは、ユーザーがローカルSOCKSプロキシを作成できるようにする動的ポート転送をサポートしています。[10]これにより、ユーザーは事前定義されたリモートポートとサーバーにのみ接続するという制限から解放されます。

プロトコル

SOCKS4

典型的なSOCKS4接続要求は次のようになります。

サーバーへの最初のパケット
VER CMD DSTPORT DSTIP ID
バイトカウント 1 1 2 4 変数
VER
SOCKSバージョン番号、このバージョンでは0x04
CMD
コマンドコード:
  • 0x01 = TCP / IPストリーム接続を確立します
  • 0x02 = TCP / IPポートバインディングを確立する
DSTPORT
2バイトのポート番号(ネットワークバイトオーダー
宛先
IPv4アドレス、4バイト(ネットワークバイト順)
ID
ユーザーID文字列、可変長、ヌル終了
サーバーからの応答パケット
VN REP DSTPORT DSTIP
バイトカウント 1 1 2 4
VN
応答バージョン、ヌルバイト
REP
返信コード
バイト 意味
0x5A リクエストが許可されました
0x5B リクエストが拒否または失敗しました
0x5C クライアントがidentdを実行していない(またはサーバーから到達できない)ため、リクエストが失敗しました
0x5D クライアントのIDがリクエストのユーザーIDを確認できなかったため、リクエストは失敗しました
DSTPORT
宛先ポート。BINDで付与されている場合は意味があり、それ以外の場合は無視します。
DSTIP
上記の宛先IP–クライアントがバインドする必要のあるip:port

たとえば、これはフレッドを66.102.7.99:80に接続するSOCKS4リクエストであり、サーバーは「OK」で応答します。

  • クライアント:0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00
    • 最後のフィールドはASCIIの「Fred」で、その後にヌルバイトが続きます。
  • サーバ:0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX
    • 0xXXは任意のバイト値にすることができます。SOCKS4プロトコルは、これらのバイトの値を無視する必要があることを指定しています。

この時点から、SOCKSクライアントからSOCKSサーバーに送信されたデータはすべて66.102.7.99に中継され、その逆も同様です。

コマンドフィールドは、「接続」の場合は0x01、「バインド」の場合は0x02です。「bind」コマンドは、アクティブなFTPなどのプロトコルの着信接続を許可します

SOCKS4a

SOCKS4aは、SOCKS4プロトコルを拡張して、クライアントがIPアドレスではなく宛先ドメイン名を指定できるようにします。これは、クライアント自体が宛先ホストのドメイン名をIPアドレスに解決できない場合に役立ちます。これは、SOCKS4の作者であるYing-DaLeeによって提案されました。[11]

クライアントは、DSTIPの最初の3バイトをNULLに設定し、最後のバイトをゼロ以外の値に設定する必要があります。(これはIPアドレス0.0.0.xに対応し、xはゼロ以外であり、許可されない宛先アドレスであるため、クライアントがドメイン名を解決できる場合は発生しないはずです。)USERIDを終了するNULLバイトに続いて、クライアントは宛先ドメイン名を送信する必要があります。そしてそれを別のNULLバイトで終了します。これは、「接続」要求と「バインド」要求の両方に使用されます。

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

サーバーへの最初のパケット
SOCKS4_C ドメイン
バイトカウント 8+変数 変数
SOCKS4_C
SOCKS4クライアントハンドシェイクパケット(上記)
ドメイン
連絡するホストのドメイン名、null(0x00)が終了しました

サーバーからSOCKSクライアントへ:(SOCKS4と同じ)

プロトコルSOCKS4aを使用するサーバーは、要求パケットのDSTIPをチェックする必要がありますxがゼロ以外のアドレス0.0.0.xを表す場合、サーバーはクライアントがパケットで送信するドメイン名を読み取る必要があります。サーバーはドメイン名を解決し、可能であれば宛先ホストに接続する必要があります。

SOCKS5

SOCKS5プロトコルは、RFC1928で定義されてますこれは、SOCKS4プロトコルの互換性のない拡張です。認証の選択肢が増え、 IPv6UDPのサポートが追加されます。後者は、DNSルックアップに使用できます。最初のハンドシェイクは次のもので構成されます。  

  • クライアントは接続し、サポートされている認証方法のリストを含むグリーティングを送信します。
  • サーバーはいずれかの方法を選択します(または、いずれも受け入れられない場合は失敗応答を送信します)。
  • 選択した認証方法に応じて、クライアントとサーバー間で複数のメッセージが渡される場合があります。
  • クライアントはSOCKS4と同様の接続要求を送信します。
  • サーバーはSOCKS4と同様に応答します。

クライアントからの最初の挨拶は次のとおりです。

クライアントの挨拶
VER NAUTH AUTH
バイトカウント 1 1 変数
VER
SOCKSバージョン(0x05)
NAUTH
サポートされている認証方法の数、uint8
AUTH
認証方法、サポートされる方法ごとに1バイト
サポートされている認証方法には、次のように番号が付けられています。
  • 0x00:認証なし
  • 0x01:GSSAPIRFC 1961 
  • 0x02:ユーザー名/パスワード(RFC 1929 
  • 0x03–0x7F:IANAによって割り当てられたメソッド[12]
    • 0x03:チャレンジハンドシェイク認証プロトコル
    • 0x04:未割り当て
    • 0x05:チャレンジ/レスポンス認証方式
    • 0x06:Secure Sockets Layer
    • 0x07:NDS認証
    • 0x08:複数認証フレームワーク
    • 0x09:JSONパラメーターブロック
    • 0x0A–0x7F:未割り当て
  • 0x80–0xFE:私的使用のために予約されたメソッド
サーバーの選択
VER CAUTH
バイトカウント 1 1
VER
SOCKSバージョン(0x05)
CAUTH
選択された認証方法、または受け入れ可能な方法が提供されなかった場合は0xFF

その後の認証はメソッドに依存します。ユーザー名とパスワードの認証(メソッド0x02)は、RFC1929で説明されいます 

クライアント認証要求、0x02
VER IDLEN ID PWLEN PW
バイトカウント 1 1 (1-255) 1 (1-255)
VER
ユーザー名/パスワード認証の現在のバージョンの場合は0x01
IDLEN、ID
ユーザー名の長さ、uint8; バイト文字列としてのユーザー名
PWLEN、PW
パスワードの長さ、uint8; バイト文字列としてのパスワード
サーバーの応答、0x02
VER 状態
バイトカウント 1 1
VER
ユーザー名/パスワード認証の現在のバージョンの場合は0x01
状態
0x00成功、それ以外の場合は失敗、接続を閉じる必要があります

認証後、接続を続行できます。まず、住所のデータ型を次のように定義します。

SOCKS5アドレス
タイプ ADDR
バイトカウント 1 変数
タイプ
アドレスのタイプ。の一つ:
  • 0x01:IPv4アドレス
  • 0x03:ドメイン名
  • 0x04:IPv6アドレス
ADDR
次のアドレスデータ。タイプに応じて:
  • IPv4アドレスの場合は4バイト
  • 名前の長さが1バイトで、その後にドメイン名が1〜255バイト
  • IPv6アドレスの場合は16バイト
クライアント接続要求
VER CMD RSV DSTADDR DSTPORT
バイトカウント 1 1 1 変数 2
VER
SOCKSバージョン(0x05)
CMD
コマンドコード:
  • 0x01:TCP / IPストリーム接続を確立します
  • 0x02:TCP / IPポートバインディングを確立します
  • 0x03:UDPポートを関連付ける
RSV
予約済み、0x00である必要があります
DSTADDR
宛先アドレスについては、上記のアドレス構造を参照してください。
DSTPORT
ネットワークバイトオーダーのポート番号
サーバーからの応答パケット
VER 状態 RSV BNDADDR BNDPORT
バイトカウント 1 1 1 変数 2
VER
SOCKSバージョン(0x05)
状態
ステータスコード:
  • 0x00:リクエストが許可されました
  • 0x01:一般的な障害
  • 0x02:ルールセットで接続が許可されていません
  • 0x03:ネットワークに到達できません
  • 0x04:ホストに到達できません
  • 0x05:宛先ホストによって接続が拒否されました
  • 0x06:TTLの有効期限が切れました
  • 0x07:コマンドはサポートされていません/プロトコルエラー
  • 0x08:アドレスタイプはサポートされていません
RSV
予約済み、0x00である必要があります
BNDADDR
上記で指定された「SOCKS5アドレス」形式のサーバーバインドアドレス(RFC 1928で定義) 
BNDPORT
ネットワークバイトオーダーのサーバーバインドポート番号

クライアントは解決されたアドレスまたはドメイン名のいずれかを使用できるため、cURLの規則により、SOCKS5のドメイン名バリアントに「socks5h」、その他の単に「socks5」にラベルを付けることができます。SOCKS4aとSOCKS4の間にも同様の規則があります。[13]

ソフトウェア

サーバー

SOCKSプロキシサーバーの実装

  • Sun Java System Webプロキシサーバーは、HTTPS、NSAPI I / Oフィルター、動的再構成、SOCKSv5、およびリバースプロキシをサポートするSolaris、Linux、およびWindowsサーバーで実行されるキャッシングプロキシサーバーです。
  • WinGateは、Microsoft Windows用のマルチプロトコルプロキシサーバーおよびSOCKSサーバーであり、SOCKS4、SOCKS4a、およびSOCKS5(UDP-ASSOCIATEおよびGSSAPI認証を含む)をサポートします。また、HTTPプロキシへのSOCKS接続の受け渡しもサポートしているため、HTTP overSOCKSをキャッシュしてスキャンできます。
  • Socksgate5 SocksGate5は、OSIモデルのレイヤー7であるアプリケーションレイヤーに検査機能を備えたアプリケーションSOCKSファイアウォールです。パケットは7OSIレベルで検査されるため、アプリケーション-SOCKSファイアウォールは、プロトコルの非準拠を検索し、指定されたコンテンツをブロックする場合があります。
  • Danteは、便利で安全なネットワーク接続を提供するために使用できる回線レベルのSOCKSサーバーであり、Danteが実行されているホストのみが外部ネットワーク接続を持っている必要があります。[14]

SOCKSサーバーインターフェースを提供する他のプログラム

  • OpenSSHを使用すると、SOCKSプロトコルのサブセットを介して指定されたトンネルを動的に作成でき、CONNECTコマンドをサポートします。
  • PuTTYは、リモートSSHサーバーを介したSOCKS(動的)トンネルのローカル作成をサポートするWin32SSHクライアントです。
  • ShimmerCat [15]は、SOCKS5を使用して内部ネットワークをシミュレートするWebサーバーであり、Web開発者が/ etc / hostsファイルを変更せずにローカルサイトをテストできるようにします。
  • Torは、オンラインの匿名性を実現することを目的としたシステムです。Torは、TCPのみのSOCKSサーバーインターフェイスをクライアントに提供します。
  • Shadowsocksは、回避型の検閲ツールです。SOCKS5インターフェースを提供します。

クライアント

クライアントソフトウェアは、SOCKSを介して接続するために、ネイティブSOCKSサポートを備えている必要があります。ユーザーがそのような制限を回避できるようにするプログラムがあります。

ソックスファイアー

ソックスファイアを使用すると、アプリケーションは、プロキシプロトコルをサポートしなくても、ネットワークにアクセスしてプロキシを使用できます。最も一般的な方法は、仮想ネットワークアダプタと適切なルーティングテーブルを設定して、アダプタを介してトラフィックを送信することです。

  • Win2Socks。これにより、アプリケーションはSOCKS5、HTTPS、またはShadowsocksを介してネットワークにアクセスできます。
  • tun2socksは、SOCKSプロキシから仮想TCPTUNアダプターを作成するオープンソースツールです。LinuxとWindowsで動作し、[16]はmacOSポートとGolangでのUDP対応の再実装を備えています。
  • プロキシチェーン、起動する(動的にリンクされた)プログラムでSOCKSまたはHTTPプロキシを介してTCPトラフィックを強制するUnixプログラム。さまざまなUnixライクなシステムで動作します。[17]

プロキシの翻訳

  • PolipoIPv4をサポートする転送およびキャッシングHTTP /1.1プロキシサーバー。LinuxOpenWrtWindowsMac OS X、およびFreeBSDで実行されているオープンソースほとんどすべてのWebブラウザで使用できます。
  • Privoxy、非キャッシュSOCKSからHTTPへのプロキシ。

Dockerベース

  • multsocks[18] Dockerに基づくアプローチで、Dockerを実行する任意のプラットフォームで実行され、クライアント、サーバー、またはその両方を使用してプロキシを変換します。

セキュリティ

要求とパケット交換の暗号化が欠如しているため、SOCKSは中間者攻撃やIPアドレスの盗聴に対して実質的に脆弱になり、その結果、政府による検閲への道が開かれます。

参考文献

  1. ^ W. Richard Stevens、 TCP / IP Illustrated、Volume 1:The Protocols、Addison Wesley、1994、ISBN0-201-63346-9。
  2. ^ 「サービス名およびトランスポートプロトコルポート番号レジストリ」Internet Assigned NumbersAuthority2017年5月19日2017年5月23日取得
  3. ^ コブラス、デビッド; Koblas、Michelle R. SOCKS(PDF)USENIXUNIXセキュリティシンポジウムIII 2019年11月16日取得
  4. ^ ダーモレイ、ティナ。ファイアウォールとおとぎ話」。;ログインする:。30巻、no。1.1。
  5. ^ WaybackMachine アーカイブインデックス
  6. ^ CNET:宇宙からのサイバースペース
  7. ^ Oppliger、Rolf(2003)。「回路レベルのゲートウェイ」。ワールドワイドウェブのセキュリティ技術(第2版)。アーテックハウス。ISBN 15805334852020年1月21日取得
  8. ^ 「2010年回避ツール使用状況レポート」(PDF)ハーバード大学のバークマンインターネット&ソサエティセンター。2010年10月。
  9. ^ 「TorFAQ」
  10. ^ 「OpenSSHFAQ」2002-02-01にオリジナルからアーカイブされました
  11. ^ イン・ダ・リー。「SOCKS4A:SOCKS4プロトコルの単純な拡張」OpenSSH 2013年4月3日取得
  12. ^ IANA.org
  13. ^ "CURLOPT_PROXY"curl.se。_ 2020年1月20日取得
  14. ^ 「InfernoNettverkA / Sによって開発された製品」www.inet.no。_ 2021-03-20を取得
  15. ^ 「SOCKS5の簡単なネット」shimmercat.comシマーキャット。2018-09-13にオリジナルからアーカイブされました2016年4月20日取得
  16. ^ Bizjak、Ambroz(2020年1月20日)。「ambrop72 / badvpn:NCDスクリプト言語、tun2socksプロキシー、P2PVPN」GitHub 2020年1月20日取得
  17. ^ ハムシーク、アダム(2020年1月20日)。「プロキシチェーン:特定のアプリケーションによって作成されたTCP接続を、TORやその他のSOCKS4、SOCKS5、HTTP(S)プロキシなどのプロキシを介して強制的に実行するツール」GitHub 2020年1月20日取得
  18. ^ Momm、Gregorio(2020-08-24)、gregoriomomm / docker-multsocks2020-08-29を取得

外部リンク