2011-01-24 7 views
6

私はUDPでの穴あけに関するいくつかの質問があります。 wikiに基づいてhttp://en.wikipedia.org/wiki/UDP_hole_punchingUDP穴あけ

1)NATの後ろにあるクライアント、NAT以外のサーバの間でUDPセッションをセットアップするには、クライアントはサーバにパケットを送信するだけで済みます。セッションは両方の方法で許可されています(& receieveを送信します)。クライアントがサーバーからも受信できることを意味します。

2)UDPホールパンチング:2つのクライアントが最初にサーバーに接続した後、サーバーはクライアントポート/ IPを他のクライアントに与えます。そのため、クライアントはこれらのポートでパケットを相互に送信します。これは厳しいですか?

3)#2が真の場合、ファイアウォールは、そのポートで接続を確立する際に使用されたIP以外のIPからデータを受信できるのはなぜですか?簡単にフィルタリングする必要がある大きなセキュリティホールのように聞こえますか?私はソースIPのなりすましがそれを欺くことを理解していますが、これは何ですか?

事前のおかげで、 ヨハン

答えて

4

1)非常に妄想的なモードで設定しない限り、ほとんどの妥当なファイアウォールがあります。

2)正確ではありません。 This articleで詳細に説明されていますが、クライアントのうちの1人が最初に相手のパブリックIPにデータグラムを送信するという考え方があります。その後、このデータグラムは破棄されますが、他のクライアントは、最初のサーバがサーバ経由でそれを伝えたために送信されたことを知ります。次に、もう一方のクライアントは、最初のデータグラムを元のデータグラムと同じポートに戻します。最初のクライアントのNATはそのポートからのパケットがあることを記憶しているので、着信データグラムは最初のものへの応答であるとみなされます。ここで問題となるのは、どのパブリックポートNATが最初のデータグラムを送信するかを決めることですが、ほとんどのNATは予測可能な方法でそれを行います。

+0

私はそれを理解しているので、ユーザーはデータを送信するときに2つの異なるポートを使用します。最初にbind()(クライアントの「プライベート」ポート)と実際に送信するポート(クライアントの「パブリック」ポート)を持つポート。だから私は、他のクライアントのパブリックポートは何か、プライベートポートと通信しようとするとうまくいかないことを各クライアントに伝える必要がありますか? (例えば、私はすべてのポートを12340にバインドします(他のクライアントは他のクライアントにIP + 12340を送信できません) – KaiserJohaan

+0

@ Kaiser、通常は動作しません。どのパブリックポートがプライベートポートにマップされているのか把握する必要があります。私が理解する限り、最初にこのプライベートポートから何かをサーバーに送ることによって行われます。そして、サーバーはこのポートを両側に伝えます。しかしプライベートIPを使ってプライベートポートに通信しようとする価値はまだあります。両方のクライアントが誤って同じNATの後ろにいると、LAN経由で通信できるようになります。 –

2

1)はい。ただし、NATなしのサーバーに接続する場合は、穴あけをする必要はありません。クライアントアプリケーションは正常に動作します。

2)はい。

3)一部のNATでは、実際にパブリックポートを1つの送信側と受信側のペアに限定しています。このようなシナリオで穴を開ける必要がある場合は、NATが直接接続用に選択するパブリックポートを推測する必要があります。

ただし、NATはセキュリティ機能ではありません。したがって、インターネットに直接接続されたクライアントの単純なケースには違いがないので、パブリックポートへのパケットを受け入れることはセキュリティホールではありません。

+0

したがって、プライベートポート(アプリケーションのbind()ポート)は(実際に送信される)パブリックポートとは異なります。クライアントがサーバーに接続すると、サーバーはパブリックまたはプライベートポートを参照しますか?プライベートポートではなくパブリックポートを他のクライアントにリレーして通信させる必要がありますか? – KaiserJohaan

+0

@ KaiserJohaanはい、プライベートポートは公衆通信には無関係です – phihag

関連する問題