Dynamic NAT と PAT
NATを使ってグローバルIPアドレスをプールの中から選んでプライベートIPアドレスを持つホストに割り当てるというのをやってみる。 トポロジは以下の通り。
まずNATより先にネットワークが2つ(Point-to-Pointを含めて3つ)あるので各ルータにデフォルトルートを設定しておき、ネットワーク間のルーティングを可能にする。
Router(config)#ip route 0.0.0.0 0.0.0.0 g0/0/1 %Default route without gateway, if not a point-to-point interface, may impact performance Router(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.6 Router(config)#exit
インターフェースの指定だと怒られるので、ここではネクストホップ(接続先のルーターのインターフェースIP)を指定している。 反対側のルータにも同じ設定を行っておく。
次に各ホストへのIPアドレスの指定は固定で行った。両方のホストにプライベートIPアドレス(10.1.1.1 10.1.1.2 /24)を割り当てた。デフォルトゲートウェイは10.1.1.254とした。
ルーターのローカル側のインターフェースにも設定を行い、通常のルーティングを可能にする。
Router(config)#int g0/0/0 Router(config-if)#ip address 10.1.1.254 255.255.255.0
このままだと、ホストに割り当てられたIPアドレスがプライベートのままなので、ルーティングが出来ない。NATを使ってプライベートアドレスに対応するパブリックIPアドレスのプールを作り、そこから自動割り当てを行うようにする。
まずはどちらがプライベートIPアドレスが割り当てられているネット―ワークなのかを確認。
Router(config)#int g0/0/0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)#int g0/0/1 Router(config-if)#ip nat outside Router(config-if)#exit Router(config)#
Router(config)#ip nat pool DNAT 1.1.1.1 1.1.1.1 netmask 255.255.255.255 # 割り当てるグローバルIPアドレスのプールを作成 Router(config)#access-list 1 permit 10.1.1.0 0.0.0.255 # 標準アクセスリストを作成して、ルーターを通れる送信元IPアドレスを指定 Router(config)#ip nat inside source list 1 pool DNAT
最後のコマンドはip nat inside source list <acl-no> pool <pool-name>
までが一つのコマンドとなっている。
今回はDNATという割り当てるIPアドレスのプールに一つしかIPアドレスを指定しなかったため、一度にネットワークの外へパケットを送れるのは一つのホストのみになる。
反対側のルーターにあるPC(1.1.2.2/24)に対してpingに成功する。
C:\>ping 1.1.2.2 Pinging 1.1.2.2 with 32 bytes of data: Reply from 1.1.2.2: bytes=32 time<1ms TTL=126 Reply from 1.1.2.2: bytes=32 time<1ms TTL=126 Reply from 1.1.2.2: bytes=32 time<1ms TTL=126 Reply from 1.1.2.2: bytes=32 time=11ms TTL=126 Ping statistics for 1.1.2.2: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 11ms, Average = 2ms
ここですかさず以下のコマンドでNATの変換状況を確認
Router#show ip nat translations Pro Inside global Inside local Outside local Outside global icmp 1.1.1.1:33 10.1.1.1:33 1.1.2.2:33 1.1.2.2:33 icmp 1.1.1.1:34 10.1.1.1:34 1.1.2.2:34 1.1.2.2:34 icmp 1.1.1.1:35 10.1.1.1:35 1.1.2.2:35 1.1.2.2:35 icmp 1.1.1.1:36 10.1.1.1:36 1.1.2.2:36 1.1.2.2:36
これでローカルIPアドレス(10.1.1.1)がプールに一つだけ指定されたアドレス(1.1.1.1)に変換されているのがわかる。 コンマより後ろのポート番号は通知の種類を表している。
さらに、別のホストから同様のpingを試みるとIPアドレスが足らないため、成功しない。これは以下のコマンドで詳細がわかる。
Router#show ip nat statistics Total translations: 4 (0 static, 4 dynamic, 4 extended) Outside Interfaces: GigabitEthernet0/0/1 Inside Interfaces: GigabitEthernet0/0/0 Hits: 27 Misses: 60 Expired translations: 25 Dynamic mappings: -- Inside Source access-list 1 pool DNAT refCount 4 pool DNAT: netmask 255.255.255.255 start 1.1.1.1 end 1.1.1.1 type generic, total addresses 1 , allocated 1 (100%), misses 4
最後の行から全てのIPアドレスが割り当てられていて、4回のICMPの試行の度NAT変換に失敗していることがわかる。
PAT
更にPATによる接続をおこなってみるが、PATには2つの実装方法が存在し、もっとも簡単なのはNATと同様プールされたIPアドレスを使いつつ、異なるポート番号を持つ複数の通信を一つのIPアドレスで賄う方法である。
Router(config)#ip nat inside source list 1 pool DNAT overload
すると、先ほどまでは失敗していた2台目ホストの一台目との同時通信に成功するようになるのがわかる。
Router#show ip nat statistics Total translations: 8 (0 static, 8 dynamic, 8 extended) Outside Interfaces: GigabitEthernet0/0/1 Inside Interfaces: GigabitEthernet0/0/0 Hits: 309 Misses: 119 Expired translations: 62 Dynamic mappings: -- Inside Source access-list 1 pool DNAT refCount 8 pool DNAT: netmask 255.255.255.255 start 1.1.1.1 end 1.1.1.1 type generic, total addresses 1 , allocated 1 (100%), misses 0
missed 0で、一つのIPアドレスの共有に成功するようになった。
これらの統計情報や、IPアドレスの変換記録に関しては以下のコマンドで削除することが出来る。
Router#clear ip nat translation * Router#clear ip nat statistics
また、NAT変換の様子をリアルタイムで見るために以下のようなコマンドも用意されている
Router#debug ip nat IP NAT debugging is on Router# NAT: s=10.1.1.1->1.1.1.1, d=1.1.2.2 [104] NAT*: s=1.1.2.2, d=1.1.1.1->10.1.1.1 [198] NAT: s=10.1.1.1->1.1.1.1, d=1.1.2.2 [105] NAT*: s=1.1.2.2, d=1.1.1.1->10.1.1.1 [199] NAT: s=10.1.1.1->1.1.1.1, d=1.1.2.2 [106] NAT*: s=1.1.2.2, d=1.1.1.1->10.1.1.1 [200] NAT: s=10.1.1.1->1.1.1.1, d=1.1.2.2 [107] NAT*: s=1.1.2.2, d=1.1.1.1->10.1.1.1 [201]
最後にNAT用IPアドレスのプールを使わず、ルーターの外向きのインターフェース(Point to Point)のアドレスを使って変換する方法を見てみる。
Router(config)#ip nat inside source list 1 interface g0/0/1 overload Router(config)# NAT: s=10.1.1.1->1.1.1.5, d=1.1.2.2 [108] NAT*: s=1.1.2.2, d=1.1.1.5->10.1.1.1 [202] NAT: s=10.1.1.1->1.1.1.5, d=1.1.2.2 [109] NAT*: s=1.1.2.2, d=1.1.1.5->10.1.1.1 [203] NAT: s=10.1.1.1->1.1.1.5, d=1.1.2.2 [110] NAT*: s=1.1.2.2, d=1.1.1.5->10.1.1.1 [204] NAT: s=10.1.1.1->1.1.1.5, d=1.1.2.2 [111] NAT*: s=1.1.2.2, d=1.1.1.5->10.1.1.1 [205]
いままではプールに登録したIPアドレス(1.1.1.1)が変換に用いられていたが、今回はインターフェースに割り当てたIPアドレス(1.1.1.5)が用いられているのが分かる。