対称NATは怖いですか?

NATの背後にあるマシンを直接接続するタスクは、世界と同じくらい古いものであり、UDPホールパンチングについて多くの人が聞いたことがあると思います。 私がこの問題に興味を持ち始めたとき、対称natを突破することは不可能であり、試してみる価値さえないという意見に固執しました。 しかし、ごく最近、対称ナットは文ではないと述べられた記事に出会いました。



それを理解しましょう。



NATタイプ



従来、インターネット上の多くの記事では、すべてのNATは4つのタイプに分類されています。



これは実際には正しくありません。 より正確には、まったく正しくありません。 NATには2つの主な特徴があります。



1)着信パケットをフィルタリングします。

2)ポートマッピングルール。



最初の特性はほとんどの記事で説明されており、NATの背後にあるマシンに送信する着信パケットを意味します:すべて(フィルターなし-フルコーン)、特定のアドレス(アドレス制限)、または特定のアドレスとポート(ポート制限)から。



最初の3つのタイプは1対1でリフレクションを試みるため、2番目の特性は対称NATにのみ固有です。 たとえば、クライアントが内部アドレス192.168.10.24:62145からパケットを送信する場合、パケットはアドレス1.2.3.4:62145のルーターから送信されます。 さらに、受信者のアドレスに関係なく。



対称NAT



次に、対称NATについてさらに詳しく説明します。 すぐに着信パケットのフィルターも任意にできるように予約します(フィルターなし、アドレス制限またはポート制限)。 このタイプのNATと以前のNATの唯一の違いは、正確にはルーターの発信ポートの選択にあり、クライアントの元のポートとはほぼ確実に異なります。 前の例に戻ると、反射は次のようになります:192.168.10.24:62145-> 1.2.3.4:1274。



同じポートがランダムに選択されます(または偶然ではなく、順番に選択されますが、外部からの選択に影響を与えることができないため、これは重要ではありません)。 ただし、特定のルールがあり、着信パケットのフィルターに似ています。







次のポートを選択するためのルールもあります。

何らかのデルタ(+ 1 / -1または+ 10 / -10)であるか、一般的には偶然です。

さらに、1つのNATで、後続の各ポートが乱数によって常に前のポートと分離されていましたが、常に4096の倍数でした。



結論の代わりに



したがって、ポートの割り当てとデルタのルールを知っていれば、どのポートから発信パケットが送信されるかを推測でき、それに応じて非常に対称的なNATを突破できることは明らかです。 もちろん、誤ってポートを選択した場合、このトリックは機能しません。



さて、記事の本質と目的に到達しました。 質問に答える



「NAT'omの背後にあるポートとデルタの割り当てルールを定義することは可能ですか?」



もちろん、このSTUNで役立ちます。 私たちのタスクは、1つのソケット(1つのローカルポート)を使用して異なるアドレスとポートに4つの要求を行い、結果を評価することです。

発信ポートの割り当て方法(アドレスまたはポート)を理解し、同じデルタを計算しようとすることができます。



そして、統計学で私を助けるためにhabrasocietyを促します。 インターネット上で、単純なスタンクライアントが見つかりました。スレッジハンマーで少しドップドされ、これが発生しました。



ソースコード



Linuxユーザーは、これをコンパイルする方法を知っています。

このように
gcc -lpthread -o stun stun.c




Windowsでは、スタジオで完全にコンパイルされます。スタジオが手元にない場合のバイナリは次のとおりです。



habr効果のためにstun.counterpath.netを許してください:)



ここに私の結果がありますが、私は対称NATを持っていないので、面白くありません:



結果

テスト:1010

NAT存在:1

最初に保持されるポート:1

ポートを保持します:0

タイプ:ポート制限NAT

マッピングされたポート:55907 55907 55907 55907



ご協力ありがとうございます!



udp:NATが対称的でない場合でも、コメントに結果を残してください。 実際、いずれの場合でも、タイプごとのピン配置を知ることが重要です。



All Articles