次の2つの質問があります。次の問題を解決するのに役立ちます。
私が知る限り、対称NATでは、リモートホストからのパケットがローカルネットワークに戻ることができるように、NATにウィンドウを作成するために、ローカル隠しノード(NATの背後)が接続を開始する必要があります。誰かがこれを行う方法を教えてもらえますか?
アプリケーションは、ソースとターゲットの間のパスにNATが存在することをどのように知ることができますか?
答え1
(2)から始めるだけです。Michal Zalewskiのp0fパッシブモニタリングツール。これは、TCP "SYN"ソースがNATの背後にあるという推測をサポートしているようです。
答え2
UDPは接続がないため、NAT実装ではUDP通信が実際にどこで終了するのかわからないため、最初に転送されたパケットに変換テーブルエントリを作成するだけです。たとえば、IP 10.0.0.2の隠しホストは、送信元ポート10000と宛先ポート20000を使用して、アドレス1.1.1.1のNATルータを介してホスト2.2.2.2にパケットを送信します。 NAT は、パケットが到着すると次のエントリを生成します。
10.0.0.2 10000 - 1.1.1.1 10000 - 2.2.2.2 20000
2番目のフィールドのポート番号は、他の翻訳エントリですでに使用されている場合は異なる場合があります。このエントリを作成すると、2.2.2.2:20000から1.1.1.1:10000までのすべてのUDPパケットが10.0.0.2:10000にリダイレクトされます。
2番目の質問について:ソースと宛先の間にNATがある場合、リモート側で報告されたリモートアドレスgetpeername(2)
とUDPペイロードで直接報告されたリモートアドレスは異なります。
NATホールパンチングに関する追加情報とリンクウィキペディアで。