SOCKS5 プロトコル。 RFC1928 で記述されており、UDPのサポートを提供します。
要約すると、SOCKS5サーバーを介してUDPパケットを中継することを希望するクライアントは、少なくとも次のことを行う必要があります。
UDP ASSOCIATE
リクエストを送信します(cf セクション4 );セクション6 からのいくつかの関連する引用があります:
UDP ASSOCIATE要求が到着したTCP接続が終了すると、UDPアソシエーションは終了します。
UDP ASSOCIATE要求への応答で、BND.PORTフィールドとBND.ADDRフィールドは、クライアントが中継するUDP要求メッセージを送信する必要があるポート番号/アドレスを示します。
および セクション7 :
UDPベースのクライアントは、UDPASSOCIATE要求への応答でBND.PORTによって示されるUDPポートでUDPリレーサーバーにデータグラムを送信する必要があります。
なぜそんなに複雑なのですか? 既存のTCP接続でUDPパケットを送信しないのはなぜですか?
EDIT:clarify に、SOCKSプロキシがTCPストリームを介してUDPパケットを受信することを期待しています次に、実際のUDPを使用してそれらをターゲットに送信します。次に、ターゲットからUDPパケットを受信し、それらをTCPストリームに送り返します。
ここにいくつかのコンテキストがあります。
私の目標は、逆テザリングを実装して、Androidデバイスが、rootアクセスを必要とせずに、接続されているコンピューターのインターネット接続を使用できるようにすることです。デバイスとコンピューター( SimpleRT は機能しますが、コンピューター上でrootアクセスが必要です)。
私の最初のアイデアは、コンピューター上でssh -D
を使用して単純なSOCKS5サーバーを起動することでした。そのため、クライアントを実装するだけで済みました。パケットは、adb reverse
…によって提供されるリモートポート転送のおかげで、デバイスからadb
を介してコンピュータに送信されます。
残念ながら、OpenSSHSOCKSサーバー DPをサポートしていません 。しかし、それは実装からの単なる制限であり、代わりに別のSOCKSサーバーを使用することもできました。
ただし、adb reverse
はUDP転送もサポートしていません。
したがって、SOCKS5プロトコルについての私の質問。
私は現在、UDPパケットを中継できるTCPを介して独自の(単純な)プロトコルを実装するPoCを作成していますが、標準プロトコルを使用できない(そして既存の実装の恩恵を受ける)ことに失望しています。
私は自分の質問に答えています:おそらくTCPメカニズム(パケットの再送信、 行頭ブロッキング …)を回避することです。
ローカルリバーステザリングツールの場合、問題はないので、SOCKSを使用せずにTCP 。