SOCKS5 サーバーは TCP 接続を受け付けても、宛先へのアクセス要求を拒否することがあります。どのエンドポイントで失敗したか判断する前に、正しい段階の応答を読んでください。

最初は方式選択です。ユーザー名とパスワードによる認証が選択された場合、それ自体の結果があります。その後に初めて CONNECT などの SOCKS コマンドへの応答が返されます。ある段階のバイト値を別の段階の表で解釈することはできません。

要求への応答は異なる失敗を示す

応答値SOCKS5 要求への応答での意味
0x01一般的なサーバー障害。
0x02ルールセットで接続が許可されていない。
0x03ネットワークに到達できない。
0x04ホストに到達できない。
0x05接続拒否。
0x06TTL 期限切れ。
0x07コマンド非対応。
0x08アドレス種別非対応。

例えば、要求レベルの拒否は SOCKS サービスに到達した後で報告されます。OS がそのサービスへの最初の TCP 接続を拒否する場合とは異なります。

アドレス種別のエラーは IPv4、IPv6、ホスト名の表現に関係することがあります。エンドポイント全体が SOCKS5 非対応だと自動的に判断できるわけではありません。同様に、UDP コマンド非対応という結果だけで、別の TCP CONNECT 要求について断定はできません。

コードを役立てるための状況情報を集める

エラー報告を書くときは、結果とともにプロキシアドレス、コマンド、宛先ホストとポート、アドレスファミリー、DNS モードを残してください。エンドポイントを管理しているなら、サーバー側のポリシーログも役立ちます。ルールセットによる拒否では、接続タイムアウトを延ばすのではなく、適用される権限を確認します。

応答はサーバーからの報告であり、宛先ネットワークの完全な独立診断ではありません。クライアントの文言も異なります。短い翻訳済みエラーメッセージだけに頼らず、取得できる場合は段階と元の応答を記録してください。

関連記事