14

私はベースサーバーなしでp2p通信についていくつかの調査を行い、STUNにやって来ました。私が読んだところによると、STUNはNATの「ホールパンチング」の方法であり、接続するためにピアをポート転送する必要はありません。これは正しいですか、そして穴あけは正確にはどういう意味ですか?ポートフォワーディングを必要としない場合、ファイアウォールを通過するため、すべてが非常に脆弱であるように見えます。また、STUNが何をするのか完全には理解していません。STUNは、Javaのp2pプログラム、またはTCP / UDPポートを介してベースサーバーなしで、またはユーザーにポートフォワードを要求せずにピアにメッセージを送信するチャットクライアントなどの別の言語で使用できますか?

4

1 に答える 1

62

互いに通信したい 2 台のマシンのタスクを考えてみましょう。2 台のマシンが (ルーターの背後ではなく) パブリック インターネットに直接接続されている場合、2 台のマシンは単純に互いのパブリック IP にパケットを送受信します。通常、マシンは 1 つ以上のルーターの背後にあります。問題を単純化するために、1 レベルのルーターのみを想定しています。

NAT トラバーサルは、ルーターがパケットの発信ポート番号を別のものに変換する問題を解決します (たとえば、ポート X から要求を送信すると、ルーターはパケットを変換して、代わりにポート Y から出たように動作します)。ルーターがポート転送の場合、ルーターは実際には変換を行いません (ポート X->X)。ただし、ほとんどのホーム/企業/その他のルーターはポート転送ではないため、NAT トラバーサルが機能します。NAT トラバーサルとさまざまな種類のNATを参照してください。

上記の記事の非ポート転送変換のいずれかを行うルーターのファイアウォールを考えてみましょう (例: フル コーン)。ルーターがポート X に何らかのパケットを受信したが、ルーターがポート Y からパケットを送信していない場合、そのルーターはそのパケットをドロップします (結局のところ、そのパケットが誰に宛てられたものなのか? ルーターには見当がつきません!)。一部のプライベート マシンがパケットを送信し、ルーターがそのプライベート マシンのポート X を外部ポート Y にマップする変換を行う場合にのみ、ポート Y への外部パケットがプライベート マシンに転送されます。

STUNトラバーサル

A と B の 2 つのクライアント (両方ともファイアウォールの背後にあり、インターネットを介して) が直接通信するには、何らかの方法でルーター マッピングを認識している必要があります。一般的な解決策は、STUN サーバーを使用してポート マッピングを決定することです。マシン A はポート X からパケットを STUN に送信します。ルーターはポートを Y に変換し、STUN サーバーはこれを見て A に応答し、外部ポートが何であるかを伝えます。Bさんも同じです。次に、A と B は変換されたポートを交換します (他の中央サーバーを使用して...簡単な例として、Skype には中央ログイン サーバーがあり、A と B は Skype サーバーにポート変換を伝え、Skype は A と B にそれぞれ伝えます)。ポートマッピングについて)。次に、B は、X ではなくポート Y を使用して A のパブリック IP にパケットを送信します。マシン A はファイアウォールを「パンチ」し、外部ポート Y からパケットを受信できるようにしました。

安全?

あなたはセキュリティについて言及していますが、ホールパンチングはネットワークをセキュリティ違反に開放しますか? 潜在的に...私はこの主題を研究していませんが、フルコーンNATを検討してください。マッピングが作成されると、任意の外部マシンがマシン A のルーターにパケットを送信できるようになり、A が悪意のあるマシン Z にパケットを送信したことがなくても、A はパケットを取得します。もちろん、マシン Z は何らかの方法でマッピングを検出する必要があります。 . 一部のウィキペディアの記事では、図はこの脆弱性を持つフル コーン NAT のみを示していますが、私の言葉を信じてはいけません。ホール パンチングを使用するアプリケーション (Skype、xbox live など) の量から判断すると、ネットワークは、ルーターのファイアウォール対策に加えて、アプリケーションおよびシステム レベルのファイアウォール保護に依存しているようです。

以下の Ford の記事では、セキュリティについて簡単に言及しています。ネットワークは、ルーター ファイアウォールよりもシステム レベルのファイアウォールに依存しているように思われます。

対称 NAT と TURN トラバーサル

STUN は常に機能するとは限りません。ルーターの中には「動作が悪い」ものがあります。マシン A は、ポート X から 2 つのパケットを送信する場合があります。1 つは stackoverflow.com に、もう 1 つは facebook.com に送信します。ルーターは、ポート Y からの stackoverflow.com パケットとポート Z からの facebook.com パケットをマップします (マシン A が両方のパケットを内部ポート X から送信したとしても)。これは対称 NAT です。上記の STUN/Skype 接続が機能しないため、これらの NAT には問題があります。stackoverflow.com を STUN に、facebook.com をマシン B (Skype の相手) に置き換えます。残念ながら、STUN は A が STUN に送信するパケットの NAT マッピングを見つけることができますが、B に送信されるパケットはまったく異なるマッピングを使用します。一般に、対称 NAT のポート マッピングを決定することは (アウトバウンド ルーター パケットを追跡できなければ) 不可能です。したがって、クライアントが通信するには中央のルーティング サーバーが必要ですが、これは p2p の要点全体を無効にします。見る回す

これを Java チャット プログラムで使用できますか?

任意のポートからパケットを送信できるネットワーク ライブラリをサポートする言語 (Java、C など) は、STUN を使用して NAT をトラバーサルできます (対称 NAT などでない限り)。一般に、1 つは常に中央サーバーを必要とします (この場合は 2 つ: STUN とログインサーバー)。ログインサーバーは、Skype の例で説明されているように使用されます。2 つのクライアントがポート マッピングを認識したら、p2p 通信が開始される前に何らかの方法でこれを相互に通信する必要があります (ニワトリが先か卵が先かを参照)。しかし、A と B が互いのパブリック IP と NAT マッピングを認識すると、直接通信できるようになります。

警告

NAT トラバーサルに関する注意事項をすべて列挙することはできませんが、重要な概念の 1 つはキープ アライブです。ルーターがポート マッピングを作成したら、それはどのくらい続くのでしょうか? STUN サーバーに接続し、B にマッピングを伝えたら、B がパケットを送信するまで 10 分間待ちます。ルーターはおそらくマッピングを削除します (ルーターは、新しいマッピング用のスペースを確保するため、およびセキュリティの試みを最小限にするために、古いマッピングを定期的に消去する必要があります)。リファレンスが見つかりません。TCP と UDP のパケットによって異なると思いますが、私がよく知っているアプリケーションは、ルーターがマッピングをドロップしないように、60 秒以下ごとにキープアライブ パケットを送信します。ルーターがマッピングをドロップし、マシンがパケットを送信しようとすると、パケットはドロップされます (私にとっては何時間もの混乱につながります...)。

記事

前回の記事は、ルーターと NAT トラバーサルのアイデアの多くをジャンル別に紹介した優れた入門書です。少し前にTURNサーバー/クライアントの手順を実装したときにそれを読みましたが、作者は彼らが何について話しているのかを本当に知っています!

于 2012-11-24T09:27:31.760 に答える