Node ソケットの connect イベントは、TCP がプロキシに到達したことを示します。プロキシが宛先への接続を開いたことは示しません。

SOCKS5 サーバーは、アプリケーションの通信の前に、メソッドのネゴシエーション、選択された認証、および宛先要求を期待します。HTTP リクエストをすぐに送ると、サーバーが接続を閉じることがあります。その後の書き込みで EPIPE が発生することがあります。

EPIPE だけではハンドシェイクの欠落を証明できません。相手がもはやその通信を受け付けていない接続への書き込みを報告するものです。相手がなぜ閉じたのかを調べるには、以前のイベントとプロトコルの応答を読みます。

SOCKS のやり取りを完全に実装したコネクターを使用します。Node の標準 HTTPS クライアントなら、SOCKS 対応エージェントが宛先の TLS の前にそのネゴシエーションを実行できます。やり取りを自分で実装する場合は、プロトコルのフィールド長に従ってデータを蓄積します。1 つの data イベントに完全な応答が 1 つ入るとは限らず、返されるバインド済みアドレスがハードコードした 1 つのバイト列と一致する必要もありません。

操作が失敗し得る前にエラー処理を登録し、エラー報告に接続段階を残し、ネゴシエーションが成功した後にのみ宛先プロトコルを送信します。エラーを捕捉しても未処理イベントは防げますが、無効なやり取りは修復されません。

関連記事