若手部員 貴子さん |
社内ではプライベートIPアドレスを使うのが普通よね。そうすると,会社が違うと,同じIPアドレスが割り当てられた機器が存在することになるけど,通信できるのかしら。 | ||
若手部員 宇田くん |
それは社内ネットとインターネットの間に設置したルーターがアドレスを変換してくれるから大丈夫だよ。でも,どう変換されるかはよくわからないな。実験で調べてみよう。 |
宇田:どうしたの? 何か困ったことでも起こったのかな。
貴子:ちょっと考えごとをしていたの。今日,取り引き先の会社に行ったとき,そこにあったパソコンのIPアドレスが192.168.0.1だったのよ。
宇田:それがどうしたの? よくある話じゃない。
貴子:でも,うちの会社の総務部のパソコンのIPアドレスにも,同じ192.168.0.1を割り振っているのよ。
宇田:192.168.0.1のようなアドレスはプライベートIPアドレス*と呼ばれていて,誰でも自由に割り当てられる決まりだよね。そうすると,ほかの会社で同じプライベートIPアドレスを割り当てたパソコンがあるのは当たり前だと思うけど。
貴子:それはわかっているけれど,両社のパソコンともきちんとインターネットへアクセスできるのよ。IPアドレスが重複しているのに,問題なく通信できるのは変じゃないかしら(図1)。
宇田:なぁんだ,そんなことか。アドレス変換機能を使っているんだよ。
貴子:そう言えば,自宅のLANで使っているブロードバンド・ルーターには,アドレス変換機能があるって書いてあったわ。そのことよね。
アドレス変換機能とは
社内ネットや自宅のLANでは192.168.xx.xxのようなプライベートIPアドレスを使うことが多い。この結果,プライベートIPアドレスを使ったネットワークは無数に存在することになり,同じIPアドレスを使った機器も出てくる。では,こうした機器はインターネットと通信できないのだろうか。みなさんも実感しているように,プライベートIPアドレスを使っている機器でもインターネットへアクセスできる。それは,インターネットと社内ネットの境界部分にアドレス変換機能を持った機器があるからだ。家庭向けのブロードバンド・ルーターやファイアウォールは,必ずアドレス変換機能が備えている。この機能があるおかげで,プライベートIPアドレスを使っている社内や家庭の端末も,インターネットへアクセスできる。
もう少し詳しくアドレス変換機能を見ると,NAT*とNAPT*の2種類がある。いずれも,パケットを中継する際に,あて先や送信元IPアドレスを書き換える。例えば,社内のパソコンは自身に割り当てられたプライベートIPアドレスを送信元としてパケットを送出するが,ルーターを経由するとプロバイダなどから割り当てられたグローバルIPアドレス*に書き換わる。違いは,NATが1個のプライベートIPアドレスと1個のグローバルIPアドレスを相互に変換するのに対して,NAPTは複数のプライベートIPアドレスと1個のグローバルIPアドレスを相互に変換する点である。
あて先アドレスはどうなる?
貴子:アドレス変換によってプライベートIPアドレスを使っている会社同士でもインターネットを介してつながることはわかったけれど,納得できないのよね。宇田:まだ,疑問があるの?
貴子:そうなのよ。インターネットから社内のパソコンへパケットを送るときのあて先はどうなっているのかしら。プライベートIPアドレスをあて先にしたら,いろんな会社のパソコンにつながってしまいそうよ。
宇田:そこまで考えたことはなかったな。実験してみようか。
プライベートIPアドレスを使った社内のパソコンからインターネットへアクセスできるということは,インターネット側から応答パケットを受信できなくてはならない。つまり,インターネットに直接つながっているコンピュータから社内のパソコンにパケットが届く必要がある。このとき,インターネットのコンピュータが送るパケットのあて先はどうなるのだろうか。
そこで,パソコン3台とNAT機能がオンになったルーターを2台用意して,図2のようなネットワークを作った。PC1とPC2には同じプライベートIPアドレスである192.168.1.101を割り当て,それぞれが別の社内ネットにつながっているようにした。このとき,インターネットに直接つながる*テストPCからPC1へpingコマンド*でアクセスするには,あて先をどう指定すればよいかを調べてみる。
プライベートあてだと応答なし
宇田:ルーターの設定*も終わったし,実験してみるか。貴子:宇田君どうなると思う?
宇田:その前に,そもそもテストPCからpingコマンドを実行するときのあて先は,どこにすればいいんだろうか。
貴子:とりあえず,PC1とPC2に割り当てたプライベートIPアドレス(192.168.1.101)にしてみましょう。
宇田:それだと,両方から応答があるかも,いやどちらか一つかな。
貴子:私は応答が返って来ないような気がするわ。
宇田:じゃあ,試してみよう。「ping ・・・」と。
貴子:ほら,応答が返って来ないみたいよ(図3)。
宇田:本当だ。でも,これじゃあ,インターネットと通信できないよ。
ルーターあてにしてみると・・・
貴子:もしかしたら,ルーターのグローバルIPアドレスあてにしてみるといいんじゃないかしら。宇田:それだと,ルーターから応答が返ってくるだけだよ。
貴子:そうとも言い切れないわよ。ルーターのアドレス変換機能がpingパケットを社内ネットへ転送してくれるかも知れないわ。
宇田:なかなか鋭い推測だね。試してみよう。でも,ルーターが社内ネット側に転送したかどうかは,pingコマンドの表示結果だけではわからないから,パケットもキャプチャ*しよう。
貴子:テストPC,PC1,PC2の3台のパソコンでパケットをキャプチャしましょう。
宇田:pingコマンドのあて先は社内ネットAとつながるルーターAのグローバルIPアドレス(172.16.1.50)にするよ。「ping 172.16.1.50」と。
貴子:どう?
宇田:今度は応答があったよ(図4)。
ルーターがパケットを内部に転送
貴子:それじゃあ,キャプチャ結果も見てみましょう。宇田:まずはテストPCでキャプチャした結果から見てみよう。最初の2個のパケットは,ARP*のやりとりだね(図5(1),(2))。そのあとにルーターAあてにpingパケット(ICMP*エコー要求パケット)が送信されているよ(3)。でも,そのあとは,ルーターAからpingの応答パケット(ICMPエコー応答パケット)が戻ってきているみたいだ(8)。
貴子:ちょっと待って。PC1でキャプチャした結果も見てよ。こちらは,ルーターAがARPを送って((4),(5)),そのあとでpingパケットが出ているわ(6)。この二つのキャプチャ結果を照合しないとダメよ。
宇田:とすると,まずはテストPCがARPパケットを送信し(1),ルーターAから応答が返ってきたわけだ(2)。そして,pingパケットをテストPCが送出したはずだ(3)。
貴子:このpingパケットを受け取ったルーターAはアドレス部分を書き換えて,PC1へ送ろうとしたんだわ。でも,PC1のMACアドレス*を知らなかったから,最初にARPのやりとりが入ったのよ((4),(5))。そして,そのあとでpingパケットをPC1へ転送したんだわ(6)。
宇田:そうみたいだね。このあとは,PC1がpingの応答パケットを送出し(7),それをルーターAがテストPCへ転送したんだね(8)。
貴子:PC2でもパケットをキャプチャしていたけれど,こちらには何もパケットが記録されていなかったわ。ルーターAのグローバルIPアドレスあてにpingパケットを出したんだから,ルーターBの先にあるPC2には届かなかったわけね。
ヘッダーのアドレスが書き換わる
以上の2人のやりとりにあったように,NAT機能をオンにしたルーターAにインターネット側からpingパケットを送信すると,ルーターAは内部のPC1へパケットを転送する。そして,これを受け取ったPC1が応答パケットをルーターA経由でテストPCへ返信する。パケットの中身をもう少し詳しく見ると,テストPCが送出したパケットは,
送信元:172.16.1.1(テストPC)
あて先:172.16.1.50(ルーターA)
となっている。ルーターAが転送して社内ネットAに流れたパケットは,
送信元:172.16.1.1(テストPC)
あて先:192.168.1.101(PC1)
というように,あて先IPアドレスだけが書き換えられる。
一方,PC1から返信されたpingの応答パケットは,
送信元:192.168.1.101(PC1)
あて先:172.16.1.1(テストPC)
となり,これを受信したルーターAは送信元IPアドレスだけを書き換えて,
送信元:172.16.1.50(ルーターA)
あて先:172.16.1.1(テストPC)
にする。
まとめると,ルーターAはインターネット側から受け取ったパケットに対しては,あて先IPアドレスだけを書き換えて社内ネット側に転送する。また,社内ネット側からインターネットへ送信されたパケットは,送信元IPアドレスだけを書き換える。
NAPTはポート番号も書き換える
貴子:もう一つのアドレス変換のしくみのNAPT(IPマスカレード)でも実験してみない?宇田:そうだね。NATは主にサーバー,NAPTは主にクライアントで利用するみたいだよ。
貴子:それじゃあ,こんな構成はどうかしら(図6)。
貴子:PC1とPC2を同じプライベートIPアドレスにして,PC1をクライアント,PC2をサーバーにするのよ。
宇田:そして,途中に172.16.1.xxというIPアドレスのネットワークを介してつなぐわけだね。
貴子:そうよ。クライアント側のルーターAはNAPT,サーバー側のルーターBはNATをオンにしておくのよ。ところで,サーバー側ではどんなサーバー・ソフトを動かせばいいかしら。
宇田:WindowsXPに標準で付属しているTelnetテルネットサーバーでいいんじゃないかな。
貴子:そうね。それじゃあ,PC1とPC2でパケットをキャプチャしてみましょう。
宇田:ルーターAとルーターBの間にもパソコンをつないで,そこを流れるパケットもキャプチャした方がいいと思うよ。
貴子:そうか。じゃあ,実験しておいてね。私は打ち合わせがあるから,あとで結果を教えてね。
パケットをキャプチャした結果をまとめたものが図6である。これを見ればわかるように,NAPTをオンにしたルーターAではIPアドレスだけでなく,ポート番号*も書き換えていた。
貴子:実験結果はどうだった?
宇田:NAPTはIPアドレスだけでなく,ポート番号も書き換えているよ。
貴子:そうみたいね。解説書で調べたら,ポート番号をほかと重複しないように書き換えることで,ルーターに割り当てられた1個のグローバルIPアドレスを複数のパソコンが共有できるみたいよ。
宇田:NAPTはグローバルIPアドレスを節約できるんだね。
寄稿者:ネットワークエンジニア集団 みずおか組●水岡 祥二 NPOアイタック代表理事●出口 雄一 株式会社タケキ IT教育事業部 ●久保 幸夫 情報・通信エンジニア |