web-dev-qa-db-ja.com

SOCKS5がUDPを介してUDPを中継する必要があるのはなぜですか?

SOCKS5 プロトコル。 RFC1928 で記述されており、UDPのサポートを提供します。

要約すると、SOCKS5サーバーを介してUDPパケットを中継することを希望するクライアントは、少なくとも次のことを行う必要があります。

  • sOCKS5サーバーへのTCP接続を開きます。
  • UDP ASSOCIATEリクエストを送信します(cf セクション4 );
  • サーバーから、中継するUDPパケットを送信する必要があるアドレスとポートを受信します。
  • いくつかのヘッダーでカプセル化されたデータグラム(UDP)をそのアドレスに送信します( セクション7 を参照)。

セクション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を作成していますが、標準プロトコルを使用できない(そして既存の実装の恩恵を受ける)ことに失望しています。

9
rom1v

私は自分の質問に答えています:おそらくTCPメカニズム(パケットの再送信、 行頭ブロッキング …)を回避することです。

ローカルリバーステザリングツールの場合、問題はないので、SOCKSを使用せずにTCP 。

2
rom1v