Dynamic NAT と PAT

NATを使ってグローバルIPアドレスをプールの中から選んでプライベートIPアドレスを持つホストに割り当てるというのをやってみる。 トポロジは以下の通り。

f:id:Pyons:20200306144930p:plain

まず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)に変換されているのがわかる。 コンマより後ろのポート番号は通知の種類を表している。

f:id:Pyons:20200306152633p:plain
wikipedia より

さらに、別のホストから同様の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)が用いられているのが分かる。