web-dev-qa-db-ja.com

ネットワークアドレス変換(NAT)を検出する方法

NATがネットワークで使用されているかどうかをどのように検出できますか?

プライベートアドレスがあり、パブリックネットワークまたはインターネットに接続できる場合は、NATが必要です。

しかし、どのようにNATが内部ネットワーク(インターネットに接続されていないがNATを使用している)で使用されている)かどうかを確認できますか

IPパケットから、または他の方法で確認できる方法はありますか?

5
Johan Gelp

この質問は、私が(友達の助けを借りて)ネットワークにNAT=)の存在を検出するための小さなツールを作成したときの思い出をいくつか戻しました。

アイデアは非常にシンプルです( NAT IPSecのトラバーサル手法からインスピレーションを得て盗まれた )):

  • ネットワークセグメントAとネットワークセグメントBがあり、それらの間のNATの存在を検出したいとします。

  • セグメントAのホストからセグメントBのホストに、IPアドレスと送信元ポートのMD5ダイジェストをペイロードに含むTCPパケットを送信します。

  • セグメントBのホストでパケットをリッスンします。受信したら、送信元IPと送信元ポートをMD5で実行し、結果をペイロードのハッシュと比較します。

  • ハッシュが一致-> NATなし。

ツールは2つの小さなA.exeおよびB.exe C++で記述されています。

注:すべてのNAT=そこにある検出手法と同様に、このソリューションはIPポートのペアをクロスチェックすることで機能します。保証する他の方法はありませんNAT検出

6
Adi

多くはあなたのシナリオに依存します。

2つのホストが連携している場合は、2つのうちの1つにIPをもう1つに送信させるだけです。ヘッダーパケットIPだけでなくペイロードもプロトコル書き換えフィルター(ftp-masqなど)が書き換えないように、オプションでハッシュ/暗号化します。次に、2つのアドレスが一致しない場合、NATが機能している必要があります。

たとえば、ホストに接続しているホストが1つだけで、それが「真のIP」であるかNAT化されたIPであるかを知りたい場合、おそらく接続できません。サービスを利用できる場合は、対応するアドレスとポートに接続してみてください。 NATマシンが逆マスカレード/「仮想サーバー」変換も行っていない限り、サービスが要求マシンで開いている(NATがない)か開いていない(NAT)かを確認できるはずです。

複数のホストを使用すると、着信接続のパケットと出口ポートをカウントできる可能性があります。 NATボックスと「通常の」ボックスは、異なるポート割り当てスキームを持っています。異なるソースポートからのトラフィックの非対称性は、NAT(または複数のWebページを保持している誰か)プロキシに開く; thatである可能性の程度はシナリオに依存します。bothを持つ2つのポートペアは通常、大きく異なる種類のインタラクティブトラフィックである可能性が高いため、 2人のユーザー NATの背後など。

別のアプローチは、パケットのタイミングとTTLを検査することです。通常NAT実装はリセットしませんTTLカウンターなので、NATを実行すると1ずつ減少します。NATは少しかかります時間も、これは統計的に調査することができます。

最後に、こっそりと偽造されたパケットで返信して、再びTTLで遊んでみることができます。 NATボックスが再生成している場合TTLそのNATを非表示にするために、outboundパケットに対してのみそうする可能性があります。インバウンドトラフィックは通常のコードに依存します。TTLで作成された「インパクト時に期限切れ」のパケットを送信する場合、NATされていないマシンは引き続きそれを受信します。NATボックスがそれを受信しますdecrement TTL counter、そしてパケットは送信中に元のマシンに到達せずに死にます。ドロップまたはTTLを取得します-超過したICMP応答。

時々、同様の戦略がパケットフラグメンテーションスキームで採用されるかもしれませんが、これはあなたのマシンから想定されるNAT box、- およびこれから実際のマシンへ。

6
LSerni