LAN にたくさんのコンピュータがあるのに、ISP からはグローバル IP アドレスが1つしか払い出されない、ということはよくあります。このようなときに使うのが、ポートアドレス変換(PAT:Port Address Translation)です。PAT では、変換後の IP アドレスは1つに固定し、送信元のポート番号で通信を区別します。この記事では、Cisco ルータで PAT を設定し、NAT テーブルで動作を確認します。
- PAT(NAT オーバーロード)で、複数の内部アドレスを1つのアドレスに変換するしくみ
ip nat inside source list … interface … overloadの設定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台の機器がある状態を作ります。
設定
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 | 変換後のアドレスに、このインターフェースのアドレスを使う |
| overload | 1つのアドレスを複数の送信元で共有し、ポート番号で区別する(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 は同じです。
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つでも、番号で通信を区別している |
コメント