NAPT(IPマスカレイド)環境において、内部ネットワークから外部ネットワークに対してpingをしたときの処理の流れを教えてください。
NAPTは、
「ポート番号を用いて、外部ネットワークからの戻りパケットを内部ネットワークのどの端末に返せばよいかを判別している」
と理解しています。
このような場合、ポート番号を利用しないping(ICMP)はどのように処理を行っているのでしょうか?
調べてみたところ、
> ただし、ポート番号の変換が行なわれるため、インターネット側から内部のマシンに接続を開始するような使い方はできず、ICMPも利用できないなどの制限がある。
> 最近のブロードバンドルータなどではこうした制限を緩和するための独自の実装を行なっているものもある。
http://e-words.jp/w/NAPT.html
私の自宅では、PLANEXのブロードバンドルータを使っていて、外部ネットワークにpingができたような気がします。
なので、上記の「独自の実装」の内容を教えてください。
どうぞ、よろしくお願いいたします。
RFC3022(Traditional IP Network Address Translator (Traditional NAT))によりますと、ICMPのqueryについては、ペイロードにある識別子をTCPやUDPのポート番号のように扱うことで、NAPTを実現することが想定されているようです。
RFC792で示されているquery/responseタイプのICMPメッセージは、エコー(ping)、タイムスタンプ、情報リクエストの三種類ありますが、そのいずれもフォーマットの中に識別子を持っており、それを利用することになっているようです。
ただし、RFC792では識別子は"may be zero"なんて書いてありますので、TCPやUDPのように確実に変換できる保証はないです。
ICMPをサポートしているNAPTルータであっても"多分できる"程度と考えておくのがよいと思います。
また、ICMPついでですが、ICMP未到達メッセージなどは、そのペイロードにエラーの発生原因であるパケットを内包しています。そのパケットのIPヘッダについてもNAPTテーブルに基づいて変換しなければならないとあります。
ICMPもインターネットの基本プロトコルとして、NAPTでも一通りのことは考えているようです。
RFC3022
http://www.rfc-editor.org/rfc/rfc3022.txt
http://www5d.biglobe.ne.jp/~stssk/rfc/rfc3022j.html
RFC792
PLANEXのルーターがどのような実装になっているかは知りませんが、CISCOの例では、
ICMP header の identify field を見ています。
機械翻訳のようで訳がだいぶ怪しいですが。
LAN内のあなたのマシンにはグローバルIP振ってないですよね?ソレが答えです。
それともpingの答えはどうやってローカルのマシンを識別して戻ってくるんだ?て話ですか?
別に相手はping打ち返してくるわけじゃないですよ?
えっと、プライベートIPアドレスネットワーク内の送信側(A)と、インターネット内の受信側(B)とブロードバンドルータ(C)がある場合、
AからBに対して、httpアクセスする場合には、
A⇒C⇒B⇒C⇒Aという流れでパケットがやり取りされます。
このとき、
① A⇒Cのパケット:
送信元IPアドレスは、A
送信先IPアドレスは、B
② C⇒Bのパケット:
送信元IPアドレスは、Cのグローバルアドレス(アドレス変換)
送信先IPアドレスは、B
③ B⇒Cのパケット:
送信元IPアドレスは、B
送信先IPアドレスは、Cのグローバルアドレス
④ C⇒Aのパケット:
送信元IPアドレスは、B
送信先IPアドレスは、A(アドレス変換)
これと同様に
AからBに対してpingを送った時の処理が知りたいです。
上記のようにアプリケーション層まである通信の場合であれば、上記の②の処理で送信元IPアドレスをAからCに変換する際のポート番号の情報を使って、④で変換するアドレスが識別されます。
ただ、ICMPの場合には、アプリケーション層がない(ポート番号を利用しない)通信のため、戻りのパケットの送信先を識別する方法がありません。
その場合、どのように④のアドレス変換を行うのかを知りたいです。
ping(icmp echo) に関しては、zzz_1980 さんの言うように、Identifier で識別できそうですが、だとすると「Port Translation」ではないんで、そう考えると、N 対 1 のアドレス変換において、icmp は厳密には「NAPT」の範疇では無い、ということになるのかな?
ping は Identifier で識別できるとしても、Destination Unreachable とか、他の icmp はどうなっているのかも気になったりしますね。
参照:
http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/icmpheaders.html
今まで、漠然と「N 対 1 のアドレス変換は NAPT」と思っていたけど、語源から考えると、そうとばかりは言えないのかもしれませんね。
> また、ICMPついでですが、ICMP未到達メッセージなどは、そのペイロードにエラーの発生原因であるパケットを内包しています。そのパケットのIPヘッダについてもNAPTテーブルに基づいて変換しなければならないとあります。
ICMPエラーメッセージは、ペイロードにエラーの発生原因であるパケット(おそらくはTCPかUDP)を内包しています。NAPTルータは、そのペイロード内パケットのアドレスとポート番号を元に、ICMPメッセージ自身のIPヘッダとペイロード内パケットのIPヘッダおよびTCP/UDPヘッダを書き換えることができます。
これだとペイロードにオリジナルパケットを持っていないICMPエラーは変換することができませんが、そのようなエラーはそもそも受け取る意味が無いので破棄してもかまわないでしょう。
また、リダイレクトだけは内側ホストのパケットが原因であったとしてもNAPTルータ自身でモニタしなければならないとあります。
IPもポート番号もイーサの上で「ごっこ」をしているだけです。
tcpdumpでも使って流れてるフレームを見てみてください。
厳密な言葉の意味で言うと、やはりICMPはNAPTではないですね。
NAIT(Network Address Identify Translation)とか(^^;
ping以外のメッセージのやり取りについては、コメントを読ませていただくまで、
考えていませんでした。
JULY様のコメントを読ませていただいた後で、2の回答のURLを見るとIdentify fieldが存在しないメッセージフォーマットがありますね。
エラーレスポンスがICMPパケット内にエラーパケットそのものを内包しているのは、
WireShark等で見たことがあります。
NAPTがその内包しているエラーパケットまでチェックし、内部ネットワーク宛にアドレスを変換しているというのは驚きました。
でも、確かにそうしないと内部ネットワーク内のコンピュータが不達メッセージを正しく処理できませんね。
NAPTもICMPも仕組み自体は、単純だと思っていたのですが、こんなに奥が深かったんですね。
非常に勉強になりました。
ありがとうございます。