【NAT】ポートアドレス変換(PAT)

LAN にたくさんのコンピュータがあるのに、ISP からはグローバル IP アドレスが1つしか払い出されない、ということはよくあります。このようなときに使うのが、ポートアドレス変換(PAT:Port Address Translation)です。PAT では、変換後の IP アドレスは1つに固定し、送信元のポート番号で通信を区別します。この記事では、Cisco ルータで PAT を設定し、NAT テーブルで動作を確認します。

この記事でわかること
  1. PAT(NAT オーバーロード)で、複数の内部アドレスを1つのアドレスに変換するしくみ
  2. ip nat inside source list … interface … overload の設定
  3. show ip nat translations の読み方

ポートアドレス変換(PAT)とは

通常の NAT は、内部のアドレス1つを、外部のアドレス1つに変換します(1対1)。そのため、同時に通信できる内部の機器の数は、外部のアドレスの数までです。

PAT は、複数の内部のアドレスを、1つの外部のアドレスに変換します(多対1)。変換後の IP アドレスが同じでも、送信元のポート番号が違えば、戻ってきたパケットをどの内部の機器に返すか区別できます。Cisco では、この変換を「オーバーロード(overload)」と呼びます。家庭用のブロードバンドルータなどで使われている、いわゆる NAPT(IP マスカレード)と同じしくみです。

検証構成

R2 から R4 への通信を、R3 で PAT します。R3 の FastEthernet0/0.23 が内部(Inside)、FastEthernet0/0.34 が外部(Outside)です。送信元アドレスは、R3 の外部インターフェースのアドレス 192.168.34.3 に変換します。

R2 には 192.168.23.2 のほかに、セカンダリアドレスとして 192.168.23.22 と 192.168.23.222 を設定し、内部に3台の機器がある状態を作ります。

Inside Outside R2 R3 R4 192.168.23.0/24 192.168.34.0/24 .2 .22 .222 .3 .3 .4 Fa0/0.23 Fa0/0.34 ip nat inside ip nat outside 送信元192.168.23.2:34556宛先192.168.34.4:80 送信元192.168.34.3:34556宛先192.168.34.4:80 R3 が送信元アドレスを Fa0/0.34 のアドレスに変換する
図1 検証構成と、R3 での変換

設定

NAT の内部と外部を決める

まず、R3 のインターフェースで、NAT の内部と外部を決めます。

R3

R3(config)#interface FastEthernet0/0.23
R3(config-subif)# ip nat inside
R3(config-subif)#exit
R3(config)#interface FastEthernet0/0.34
R3(config-subif)# ip nat outside
コマンド意味
ip nat insideこのインターフェースを NAT の内部(変換される側)にする
ip nat outsideこのインターフェースを NAT の外部にする

変換する送信元をアクセスリストで決める

次に、変換の対象にする内部の送信元アドレスを、アクセスリストで決めます。今回はアクセスリスト 1 で、192.168.23.0/24 を指定します。

R3

R3(config)# access-list 1 permit 192.168.23.0 0.0.0.255

アクセスリストと変換後のアドレスを結びつける

最後に、アクセスリストと、変換後のアドレスに使うインターフェースを結びつけます。

R3

R3(config)# ip nat inside source list 1 interface FastEthernet0/0.34 overload

前から順に読むと、「ip nat で、inside で受信したパケットの source(送信元)のアドレスのうち、list 1 に一致するものを、FastEthernet0/0.34 のアドレスにポート変換(overload)する」という意味です。

部分意味
ip nat inside source内部から来たパケットの送信元アドレスを変換する
list 1アクセスリスト 1 に一致する送信元を変換の対象にする
interface FastEthernet0/0.34変換後のアドレスに、このインターフェースのアドレスを使う
overload1つのアドレスを複数の送信元で共有し、ポート番号で区別する(PAT)

変換後のアドレスにインターフェースのアドレスを使うので、ISP から DHCP などでアドレスが払い出されて変わる場合でも、設定を変えずに済みます。

確認

R2 に複数のアドレスを設定する

R2 に、複数の IP アドレスとデフォルトルートを設定します。

R2

R2(config)#int fa0/0.23
R2(config-subif)#ip address 192.168.23.2 255.255.255.0 
R2(config-subif)#ip address 192.168.23.22 255.255.255.0 secondary 
R2(config-subif)#ip address 192.168.23.222 255.255.255.0 secondary 
R2(config-subif)#exit
R2(config)#ip route 0.0.0.0 0.0.0.0 192.168.23.3

R2 から R4 へ通信する

R2 から R4 へ、送信元アドレスを変えながら ping を実行し、続けて Telnet(TCP 23 番と 80 番)を実行します。

R2

R2#ping 192.168.34.4                      
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 184/209/224 ms
R2#ping 192.168.34.4 source 192.168.23.22 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
Packet sent with a source address of 192.168.23.22 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 92/222/532 ms
R2#ping 192.168.34.4 source 192.168.23.222
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
Packet sent with a source address of 192.168.23.222 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 92/94/100 ms
R2#telnet 192.168.34.4
Trying 192.168.34.4 ... Open

Password required, but none set

[Connection to 192.168.34.4 closed by foreign host]
R2#telnet 192.168.34.4
Trying 192.168.34.4 ... Open

Password required, but none set

[Connection to 192.168.34.4 closed by foreign host]
R2#telnet 192.168.34.4 80
Trying 192.168.34.4, 80 ... 
% Connection refused by remote host

ping はすべて成功しています。Telnet は、R4 にパスワードが設定されていないので接続後すぐに切断され、80 番は R4 が接続を拒否していますが、どちらも R3 の NAT を通って R4 まで届いています。

NAT テーブルを確認する

R3 の NAT テーブルを確認します。

R3

R3# show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 192.168.34.3:10   192.168.23.2:10    192.168.34.4:10    192.168.34.4:10
tcp 192.168.34.3:17776  192.168.23.2:17776 192.168.34.4:23    192.168.34.4:23
tcp 192.168.34.3:22663  192.168.23.2:22663 192.168.34.4:23    192.168.34.4:23
tcp 192.168.34.3:34556  192.168.23.2:34556 192.168.34.4:80    192.168.34.4:80
icmp 192.168.34.3:11    192.168.23.22:11   192.168.34.4:11    192.168.34.4:11
icmp 192.168.34.3:12    192.168.23.222:12  192.168.34.4:12    192.168.34.4:12
列意味
Proプロトコル(icmp、tcp など)
Inside global変換後の内部の機器のアドレス(外部から見えるアドレス)
Inside local変換前の内部の機器のアドレス
Outside local内部から見た外部の機器のアドレス
Outside global外部の機器の本来のアドレス

Inside local が 192.168.23.2、192.168.23.22、192.168.23.222 と3つあるのに、Inside global は 192.168.34.3(R3 の FastEthernet0/0.34 のアドレス)の1つだけです。アドレスのあとの「:」に続く番号で、通信を区別しています。今回は外部側のアドレスを変換していないので、Outside local と Outside global は同じです。

Inside local(変換前) Inside global(変換後) 192.168.23.2:10 192.168.34.3:10 192.168.23.22:11 192.168.34.3:11 192.168.23.222:12 192.168.34.3:12 アドレスは1つでも、番号(ICMP では識別子)が違うので戻りのパケットを区別できる
図2 3つの内部アドレスが、1つのアドレスに変換される

TCP の行では、Inside local の番号が R2 が使った送信元ポート番号、Outside の番号が宛先のポート番号(23 番、80 番)です。Telnet を2回実行したので、送信元ポート番号の違う 23 番宛ての行が2つあります。ICMP にはポート番号がないので、ICMP の行の番号には、ping(Echo)の識別子(Identifier)が使われています。

変換後のポート番号

上の例では、送信元のポート番号は変換前と同じ番号のままです。Cisco の PAT は、できるだけ元のポート番号を変えずに使おうとします。ほかの通信がすでにその番号を使っていて重なるときは、空いている番号に変換します。

まとめ

項目内容
PAT複数の内部アドレスを1つのアドレスに変換し、ポート番号で区別する(多対1)
内部と外部ip nat inside、ip nat outside をインターフェースに設定する
変換の対象アクセスリストで送信元を指定する
PAT の設定ip nat inside source list 1 interface FastEthernet0/0.34 overload
確認show ip nat translations。Inside global が1つでも、番号で通信を区別している

コメント