1

TCP 接続を介して仮想 IP ネットワークを作成する必要があります。ホスティング システムは Linux で、TUN/TAP カーネル ドライバーを使用しているため、仮想ネットワークの IP パケットを簡単に受信して再注入できます。

難しいのは、受信した IP パケットを別のホストに送信することです。技術的でない理由により、UDP ではなく TCP プロトコルでのみパケットを送信できます。UDP 経由で IP パケットを送信するのは簡単ですが、TCP を使用すると難しくなります。理由は次のとおりです。

UDP プロトコルは、IP と同様に、再送信/並べ替えをサポートしていません。そのため、受信した仮想 IP パケットごとに 1 つの UDP パケットが送信された場合でも、カーネル TCP/IP プロトコル スタックは仮想 IP パケットの損失/重複/再順序付けを認識します (これらの「機能」があれば、TCP/IP が適切に機能するために必要です)。ない場合、仮想ネットワークの TCP 接続速度が低下します)。IP パケットが TCP 経由で送信される場合、何らかの方法でシミュレートされない限り、必要なすべての「機能」が失われます。

TCP 接続である種のパケットの重複/損失/並べ替えを偽装するか、カーネル TCP/IP プロトコル スタックにパッチを当てる必要があるようです。どちらのオプションも簡単ではありません。

私の問題に対する他の簡単な解決策はありますか? または、完全に間違った方向に進んだだけですか?ぜひ聞きたいです。

====更新====

受信した仮想ネットワーク IP パケットを送信するために、生の IP ソケット (TCP パケットを使用しながら、物理ネットワーク上のすべての TCP 再送信/並べ替えを簡単に取り除くことができる) を使用することを考えています。しかし、受信ホストで、関心のあるパケットのみを受信し、他のすべての IP パケットをカーネル TCP/IP スタックに返すにはどうすればよいでしょうか?

4

1 に答える 1

5

まず第一に、最終的に tcp-over-tcp になってしまうため、VPN over TCP を作成したくありません。主な問題は、内部 TCP と外部 TCP のタイマーが大幅に異なる可能性があり、TCP セッションの信頼性に悪影響を与えることです。ここでもう少し長い説明を見つけることができます。

UDP プロトコルは、IP と同様に、再送信/並べ替えをサポートしていません。そのため、受信した仮想 IP パケットごとに 1 つの UDP パケットが送信された場合でも、カーネル TCP/IP プロトコル スタックは仮想 IP パケットの損失/重複/再順序付けを認識します (TCP/IP が適切に機能するためには、これらの「機能」が必要です)。ない場合、仮想ネットワークの TCP 接続速度が低下します)。IP パケットが TCP 経由で送信される場合、何らかの方法でシミュレートされない限り、必要なすべての「機能」が失われます。

これは意味がありません.外側の層がTCPをトランスポートメカニズムとして使用している場合、内側の層がそれらの機能を含む完全なip / tcpスタックを引き続き使用することを止めるものは何もありません. 私が言ったように、それらはひどく競合する可能性がありますが、この機能が消えたり完全に壊れたりするわけではありません。

ヘッダーを取得し、実際のプロトコルを無視するためだけに実際に TCP を使用したいようです。これにより、実際に tcp over tcp の問題を回避できます。ただし、これは非常に悪い考えです。ファイアウォール、NAT、DPI、tcp ブースターのフロー処理はますます一般的になり、TCP パケットを偽造すると、これらのボックスに負荷がかかり、自分の接続が再び悪化する可能性があります。

したがって、UDP を使用できない理由と、GRE や L2TP などの代替プロトコル (ヘッダー) が適切でない場合は、自問する必要があります。

于 2015-01-13T11:14:19.477 に答える