C# で TCP ホール パンチング (NAT トラバーサル) を実行したいと考えています。必要に応じて、ランデブー サーバーで実行できます。http://sharpstunt.codeplex.com/を見つけましたが、これを機能させることができません。理想的には、ポート番号 (int) をパラメーターとして指定し、このメソッドへの呼び出し後に NAT で使用できる (「ポート転送」) メソッドが必要です。メソッドが単にポート番号を返し、それが NAT で利用可能になる場合も問題ありません。誰かがC#でこれをやったことがありますか? Sharpstunt などの実際の例を教えてください。
5 に答える
各ネットワーク シナリオでは、TCP ホール パンチングは UDP ホール パンチングと同様の方法で動作します。たとえば、2 つのピア A と B が異なる NAT の背後にある場合、各ピアの最初の SYN パケットが他のピアに送信されると、それぞれの NAT のパブリック アドレスに関連付けられた穴が開きます。B から A への最初の SYN パケットが B の NAT に到達する前に、A から B への最初の SYN パケットが B の NAT に到達した場合、B の NAT は A の SYN パケットを未承諾と見なし、ドロップします。ただし、その後、B の最初の SYN パケットは A の NAT を正常に通過できます。これは、A の NAT が B のパブリック アドレスを、A が開始した発信セッションの宛先として認識するためです。
あ、はい。TCPホールパンチが可能です。誰もがそうでないと考える理由がわかりません。
また、このタイプの動作を手動で作成することはできませんか? 必要な情報をすべて収集する手順が同じである限り、特定のプロトコルに依存する必要はありません。
一般に、TCP ホール パンチング (3.2.1) は次のように進行します。
クライアント:A、B サーバー:S
• A は、S との接続を使用して、S に B との接続を要求します。 • S は、B のプライベート アドレスとパブリック アドレスを A に返信し、同時に A のアドレスを B に送信します。
• A と B は、S への登録に使用したポートと同じポートから、互いのパブリック アドレスとプライベート アドレスに対して非同期的に発信接続を試みます (SYN パケットを送信します)。ローカル TCP ポート。
• A と B は、発信 SYN パケットに対する SYN-ACK 応答、または着信接続要求 (SYN パケット) を待ちます。接続が失敗した場合、ピアは最大タイムアウト期間まで接続を再試行できます。
• スリーウェイ ハンドシェイク プロセスが完了すると、ピアは相互に認証します。認証が失敗すると、ピアはその接続を閉じ、別の接続が正常に認証されるまで待機します。認証に成功した最初の接続は、TCP データの転送に使用されます。
(これはあまり答えではないことはわかっていますが、コメントするのに十分な余地がありませんでした)。
完全な NAT トラバーサルで ICE/STUN/TURN を使用して P2P ストリーミングを行うIceLinkというライブラリをまとめました。STUN ベースのホール パンチングは、大多数のルーターがピア間の直接接続を確立するために機能し、そこにある「不良」ルーターの場合、接続は TURN ベースのリレーにフォールバックします。
TCPとUDPが混同されているようです。TCPは接続指向のプロトコルであり、ファイアウォールとルーターによって簡単に理解でき、1つのイニシエーター(クライアント)と1つのリスナー(サーバー)が必要です。クライアントとサーバーの両方がファイアウォールまたはNATの背後にある場合、両方を何らかのプロキシサーバー(ファイアウォールではない)に接続しない限り、穴を開けることはできません。これに伴う問題は、プロキシがすべてのトラフィックの中継を担当することです。
あなたの質問から、UDPはステートレスであり、接続指向ではないという脂肪を利用するUDPホールパンチングにもっと興味があるようです。したがって、ほとんどの状態追跡ファイアウォールは、UDPデータフローについて「最良の推測」を行い、特定のポートを離れるトラフィックが同じポートで応答を受信し、それらを自動的にルーティングし直すと想定します。チャネル外の手段(データではなくアドレスを渡すだけのTCPサーバーなど)を使用して、両方のピアが同じポートで相互にデータを送信できる場合、それぞれのファイアウォール/NATルーターが穴を開けて許可します。のトラフィック。
それを行う方法に関しては、それはすべて、ピアのIPアドレスを相互に取得する方法によって異なります。取得したら、合意されたポートでUDPパケットの送信を開始し、応答を待ちます。
http://sipsorcery.codeplex.comには、動作中のスタン サーバーがあります。
SipSorcery.core -> SipSorcery.Net -> Stun