DynagenでCCIEを目指す
NAT
最終更新:
it_certification
-
view
1. 目的
- NATを設定する方法を確認します。
2. 構成
2.1. 設定概要
- 初期設定はIPアドレスのみです。
2.2. 構成図

2.3. netファイル
model = 3620 [localhost] [[3620]] image = C:\Program Files\Dynamips\images\c3620-j1s3-mz.123-18.bin ram = 128 [[ROUTER R1]] f0/0 = NIO_gen_eth:\Device\NPF_{Host OS Loopback} f1/0 = NIO_gen_eth:\Device\NPF_{Guest OS eth 1}
2.4. 初期設定
- R1
! version 12.4 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption ! hostname R1 ! boot-start-marker boot-end-marker ! ! no aaa new-model ! resource policy ! memory-size iomem 5 ! ! ip cef no ip domain lookup ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! interface FastEthernet0/0 ip address 192.168.200.1 255.255.255.0 duplex auto speed auto ! interface FastEthernet0/1 ip address 200.200.200.1 255.255.255.0 duplex auto speed auto ! ip http server no ip http secure-server ! ! ! no cdp run ! ! ! control-plane ! ! ! ! ! ! ! ! ! line con 0 line aux 0 line vty 0 4 ! ! end
2.5. Apache 設定
ホストOSにApacheをインストールし、ポートベースのバーチャルホストを定義します。構築方法はトップページ/手順書 サーバ系/Apache HTTP Server バーチャルホストの設定を参考にして下さい。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
Listen 10880 Listen 10881 Listen 10882 NameVirtualHost *:10880 NameVirtualHost *:10881 NameVirtualHost *:10882 <VirtualHost *:10880> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" </VirtualHost> <VirtualHost *:10881> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10881" </VirtualHost> <VirtualHost *:10882> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10882" </VirtualHost>
3. [検証] static NAT
3.1. 設定投入
内部I/Fと外部I/Fを定義します。
R1(config)#interface FastEthernet 0/0 R1(config-if)#ip nat inside *Mar 1 00:07:05.871: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up R1(config-if)#exit R1(config)# R1(config)# R1(config)#interface FastEthernet 0/1 R1(config-if)#ip nat outside
変換するアドレスを定義します。
R1(config)#ip nat source static 192.168.200.100 200.200.200.100
3.2. 疎通確認
Host OS側でstatic routeを定義した後に、Guest OS宛てにping疎通確認を行います。
(NATで変換された結果、Guest OS側からは同一セグメントからのpingのように見えるので、Guest OS側にstatic routeの設定は不要です。)
(NATで変換された結果、Guest OS側からは同一セグメントからのpingのように見えるので、Guest OS側にstatic routeの設定は不要です。)
C:\>route add 200.200.200.0 mask 255.255.255.0 192.168.200.1 C:\>ping 200.200.200.101 Pinging 200.200.200.101 with 32 bytes of data: Request timed out. Reply from 200.200.200.101: bytes=32 time=91ms TTL=63 Reply from 200.200.200.101: bytes=32 time=47ms TTL=63 Reply from 200.200.200.101: bytes=32 time=47ms TTL=63 Ping statistics for 200.200.200.101: Packets: Sent = 4, Received = 3, Lost = 1 (25% loss), Approximate round trip times in milli-seconds: Minimum = 47ms, Maximum = 91ms, Average = 61ms C:\>
3.3. 設定確認
showコマンドにより、どのようにIPアドレスが変換されたのかを確認します。
R1#show ip nat translations Pro Inside global Inside local Outside local Outside global --- 200.200.200.100 192.168.200.100 --- --- R1#
debugを有効にし、上記のpingが変換される様子を観察します。
R1#debug ip nat IP NAT debugging is on R1# *Mar 1 00:04:48.163: NAT*: s=192.168.200.100->200.200.200.100, d=200.200.200.101 [63427] *Mar 1 00:04:48.167: NAT*: s=200.200.200.101, d=200.200.200.100->192.168.200.100 [41840] *Mar 1 00:04:49.163: NAT*: s=192.168.200.100->200.200.200.100, d=200.200.200.101 [63450] *Mar 1 00:04:49.187: NAT*: s=200.200.200.101, d=200.200.200.100->192.168.200.100 [41841] *Mar 1 00:04:50.163: NAT*: s=192.168.200.100->200.200.200.100, d=200.200.200.101 [63473] *Mar 1 00:04:50.187: NAT*: s=200.200.200.101, d=200.200.200.100->192.168.200.100 [41842] *Mar 1 00:04:51.163: NAT*: s=192.168.200.100->200.200.200.100, d=200.200.200.101 [63497] *Mar 1 00:04:51.183: NAT*: s=200.200.200.101, d=200.200.200.100->192.168.200.100 [41843] R1#
Guest OS側のarpテーブルを確認し、確かにIPアドレスが変換されて届いている事を確認します。
[root@localhost ~]# arp Address HWtype HWaddress Flags Mask Iface 10.0.2.3 ether 52:54:00:12:35:03 C eth0 200.200.200.100 ether cc:00:08:d8:00:10 C eth1 <- 192.168.200.100が200.200.200.100に変換された事を確認 10.0.2.2 ether 52:54:00:12:35:02 C eth0 [root@localhost ~]#
4. [検証] dynamic NAT
4.1. 設定投入
上記検証で投入したstatic NATの設定を削除し、Dynamic NATの設定を投入します。192.168.200.0/24のアドレスを192.168.200.128から192.168.200.253に変換する設定を投入します。
R1(config)#no ip nat inside source static 192.168.200.100 200.200.200.100 R1(config)# R1(config)# R1(config)#ip nat pool N-Dynamic 200.200.200.128 200.200.200.253 netmask 255.255.255.0 R1(config)#ip nat inside source list N-List pool N-Dynamic R1(config)# *Mar 1 00:24:51.547: ipnat_add_dynamic_cfg_common: id 2, flag 5, range 1 *Mar 1 00:24:51.551: id 2, flags 0, domain 0, lookup 0, aclnum 0, aclname N-List, mapname idb 0x00000000 *Mar 1 00:24:51.551: poolstart 200.200.200.128 poolend 200.200.200.253 R1(config)# R1(config)#ip access-list standard N-List R1(config-std-nacl)#permit 192.168.200.0 0.0.0.255
4.2. 疎通確認
Host OSからGuest OSへのpingによる疎通確認を行います。
C:\>ping 200.200.200.101 Pinging 200.200.200.101 with 32 bytes of data: Reply from 200.200.200.101: bytes=32 time=180ms TTL=63 Reply from 200.200.200.101: bytes=32 time=47ms TTL=63 Reply from 200.200.200.101: bytes=32 time=47ms TTL=63 Reply from 200.200.200.101: bytes=32 time=47ms TTL=63 Ping statistics for 200.200.200.101: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 47ms, Maximum = 180ms, Average = 80ms C:\>
4.3. 設定確認
showコマンドにより、どのようにIPアドレスが変換されたのかを確認します。
R1#show ip nat translations Pro Inside global Inside local Outside local Outside global --- 200.200.200.128 192.168.200.100 --- --- R1#
debugを有効にし、上記のpingが変換される様子を観察します。
R1#debug ip nat IP NAT debugging is on R1# *Mar 1 00:27:04.427: NAT: s=192.168.200.100->200.200.200.128, d=200.200.200.101 [31522] *Mar 1 00:27:04.535: NAT*: s=200.200.200.101, d=200.200.200.128->192.168.200.100 [36956] *Mar 1 00:27:05.383: NAT*: s=192.168.200.100->200.200.200.128, d=200.200.200.101 [31543] *Mar 1 00:27:05.411: NAT*: s=200.200.200.101, d=200.200.200.128->192.168.200.100 [36957] *Mar 1 00:27:06.391: NAT*: s=192.168.200.100->200.200.200.128, d=200.200.200.101 [31566] *Mar 1 00:27:06.411: NAT*: s=200.200.200.101, d=200.200.200.128->192.168.200.100 [36958] *Mar 1 00:27:07.387: NAT*: s=192.168.200.100->200.200.200.128, d=200.200.200.101 [31587] *Mar 1 00:27:07.411: NAT*: s=200.200.200.101, d=200.200.200.128->192.168.200.100 [36959] R1#
5. [検証] port static NAT
5.1. 設定投入
上記検証で投入した設定を削除し、tcp NATの設定を投入します。
R1(config)#no ip nat inside source list N-List pool N-Dynamic R1(config)#no ip nat pool N-Dynamic 200.200.200.128 200.200.200.253 netmask 255.255.255.0 R1(config)# R1(config)# R1(config)#ip nat inside source static tcp 192.168.200.100 10880 200.200.200.100 20880
5.2. 疎通確認
上記設定では、192.168.200.100の10880番ポートが200.200.200.100の20880番ポートに変換されます。Host OSのApacheは10880番ポートで待ち受けている設定になっているので、Guest OSからは20880番ポート宛てにアクセスすればApacheにリクエストを送信する事ができるはずです。
Guest OSからHost OSへのHTTPによる疎通確認を行います。ステータスコードが200である事を確認して下さい。
Guest OSからHost OSへのHTTPによる疎通確認を行います。ステータスコードが200である事を確認して下さい。
[root@localhost ~]# wget -O /dev/null http://200.200.200.100:20880/ --2010-09-24 10:15:21-- http://200.200.200.100:20880/ Connecting to 200.200.200.100:20880... connected. HTTP request sent, awaiting response... 200 OK <- ステータスコードが200である事を確認します。 Length: 44 [text/html] Saving to: `/dev/null' 100%[================================================>] 44 --.-K/s in 0s 2010-09-24 10:15:21 (8.59 KB/s) - `/dev/null' saved [44/44] [root@localhost ~]#
6. [検証] outside NAT
6.1. 設定投入
outside NATの設定および挙動を確認します。以下の設定を投入し、outside側でNATされるように設定します。
R1(config)#no ip nat inside source static tcp 192.168.200.100 10880 200.200.200.100 20880 R1(config)#no ip access-list standard N-List R1(config)# R1(config)# R1(config)#ip nat outside source static 200.200.200.101 192.168.200.101
6.2. 疎通確認
Guest OS側でstatic routeを定義した後に、Host OSへの疎通確認を行います。pingがなぜか届かない事を確認します。
[root@localhost ~]# route add -net 192.168.200.0/24 gw 200.200.200.1 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# ping 192.168.200.100 PING 192.168.200.100 (192.168.200.100) 56(84) bytes of data. ^C --- 192.168.200.100 ping statistics --- 8 packets transmitted, 0 received, 100% packet loss, time 8021ms [root@localhost ~]#
6.3. 原因調査
デバッグメッセージを確認すると、Host OSからGuest OSへの戻りのパケットがNAT変換されていない事が確認できます。
これは「NATの処理順序」に起因します。Inside(local address)からOutside(global address)に変換しようとする際の順序は、ルーティングを行ってからNAT変換を行います。つまり、戻りのパケットは宛先が192.168.200.101であるため、NAT変換される前にパケットがルータに目的地に到達してしまい処理が終了してしまいます。
(詳細は、「NATの処理順序」で検索して下さい。また、「ネットワークエンジニアとして」のWebサイトもかなり参考になると思います。)
これは「NATの処理順序」に起因します。Inside(local address)からOutside(global address)に変換しようとする際の順序は、ルーティングを行ってからNAT変換を行います。つまり、戻りのパケットは宛先が192.168.200.101であるため、NAT変換される前にパケットがルータに目的地に到達してしまい処理が終了してしまいます。
(詳細は、「NATの処理順序」で検索して下さい。また、「ネットワークエンジニアとして」のWebサイトもかなり参考になると思います。)
R1#debug ip *Mar 1 00:03:49.755: %SYS-5-CONFIG_I: Configured from console by consolenat IP NAT debugging is on R1# *Mar 1 00:04:33.915: NAT: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:34.911: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:35.911: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:36.911: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:37.911: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:38.911: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:39.907: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] *Mar 1 00:04:40.907: NAT*: s=200.200.200.101->192.168.200.101, d=192.168.200.100 [0] R1#
6.4. 強引な回避方法
「ネットワークエンジニアとして」のWebサイトを参考にした回避方法です。ルータ上に存在しないIPアドレスに変換し、そのアドレスのルーティングを設定する事で、上記トラブルを回避する事ができます。設定例は以下の通りです。
R1(config)#no ip nat outside source static 200.200.200.101 192.168.200.101 Static entry in use, do you want to delete child entries? [no]: yes R1(config)# R1(config)#ip nat outside source static 200.200.200.101 100.100.100.101 R1(config)# *Mar 1 00:22:07.231: ipnat_add_static_cfg: id 2, flag 6 *Mar 1 00:22:07.235: id 2, flags 0, domain 1, lookup 1, from_addr 64646465, from_mask FFFFFFFF, from_port 0, to_addr C0A8C865, to_port 0 to_mask FFFFFFFF, proto 0 R1(config)# R1(config)#ip route 100.100.100.0 255.255.255.0 FastEthernet 1/0
Host OS側で戻りパケットをルーティングできるようstatic routeを定義します。
C:\>route add 100.100.100.0 mask 255.255.255.0 192.168.200.1 C:\>
Guest OSからHost OSへの疎通可能な事を確認します。
[root@localhost ~]# ping 192.168.200.100 PING 192.168.200.100 (192.168.200.100) 56(84) bytes of data. 64 bytes from 192.168.200.100: icmp_seq=1 ttl=127 time=59.9 ms 64 bytes from 192.168.200.100: icmp_seq=4 ttl=127 time=30.0 ms ^C --- 192.168.200.100 ping statistics --- 4 packets transmitted, 2 received, 50% packet loss, time 3629ms rtt min/avg/max/mdev = 30.000/44.999/59.999/15.000 ms [root@localhost ~]#
デバッグメッセージを見て想定通りのNATがされている事を確認します。
R1# *Mar 1 00:26:47.451: NAT: s=200.200.200.101->100.100.100.101, d=192.168.200.100 [0] *Mar 1 00:26:47.503: NAT: s=192.168.200.100, d=100.100.100.101->200.200.200.101 [45191] *Mar 1 00:26:48.475: NAT*: s=200.200.200.101->100.100.100.101, d=192.168.200.100 [0] *Mar 1 00:26:49.471: NAT*: s=200.200.200.101->100.100.100.101, d=192.168.200.100 [0] *Mar 1 00:26:50.471: NAT*: s=200.200.200.101->100.100.100.101, d=192.168.200.100 [0] *Mar 1 00:26:50.491: NAT*: s=192.168.200.100, d=100.100.100.101->200.200.200.101 [45268] R1#
7. [補足] 対応していないIOS
7.1. 現象
以下の通り、NATの設定が反映されない事もあります。
R1(config)#interface FastEthernet 0/0 R1(config-if)#ip nat inside *Mar 1 00:07:05.871: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up R1(config-if)#exit R1(config)# R1(config)# R1(config)#interface FastEthernet 0/1 R1(config-if)#ip nat outside R1(config-if)#exit R1(config)# R1(config)# R1(config)#ip nat source static 192.168.200.100 200.200.200.100 R1(config)# R1(config)# R1(config)#do show ip nat translations Pro Inside global Inside local Outside local Outside global R1(config)#
7.2. IOSのバージョン
この現象が発生したIOSは以下の通りです。
R1#show version Cisco IOS Software, 3600 Software (C3660-IK9O3S-M), Version 12.4(6)T, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2006 by Cisco Systems, Inc. Compiled Thu 23-Feb-06 00:08 by ccai ROM: ROMMON Emulation Microcode ROM: 3600 Software (C3660-IK9O3S-M), Version 12.4(6)T, RELEASE SOFTWARE (fc1) R1 uptime is 23 minutes System returned to ROM by unknown reload cause - suspect boot_data[BOOT_COUNT] 0x0, BOOT_COUNT 0, BOOTDATA 19 System image file is "tftp://255.255.255.255/unknown"
添付ファイル