Indy の UDP ASSOCIATE 要求における 0.0.0.0:0 は意図的な場合があります。この要求はクライアント側で想定される UDP エンドポイントを表し、不明な場合にゼロを許すと RFC 1928 が定めています。最終的なサービスを選ぶものではありません。

応答の BND.ADDR/BND.PORT は、クライアントがカプセル化したデータグラムを送るリレーを示します。

TCP control: client → SOCKS5 proxy → UDP association reply
UDP payload: client → returned relay address → target service

Indy では TIdUDPClient.Connect が透過プロキシの OpenUDP を呼び出します。TIdSocksInfo がゼロの関連付けフィールドを渡します。その後 SendBuffer が目的のサービスを SendToUDP に渡し、これがアプリケーションのペイロードの前に SOCKS UDP 宛先ヘッダーを組み立てます。

関連付けが成功しても通信が失敗する場合は、返されたリレー、符号化された宛先、UDP 応答経路を確認してください。NAT/ファイアウォールが TCP のやり取りを通しつつ UDP を遮断することがあります。

TCP 制御接続は開いたままにしてください。閉じると関連付けが終了します。SOCKS4/4a にはこの操作がなく、SOCKS5 という名前だけではサーバーが UDP をサポートする保証にはなりません。

関連記事