例えばNATに対応していない機器(L3SW等)があったとして, それでもNATしなくてはならない場合。
図のようにワンアームでルータをつないでNATボックスとする構成が取れる。
図ではルータのアイコンになっているけれど, R1がNATに対応していないとき |
ヘアピンNATやNAT on a Stick と呼ぶらしい。
Ciscoサイトを参照して検証する。
参照URL:スティック上のネットワーク アドレス変換
構成概要
- 172.16.10.0/24 を172.20.10.0/24 へネットワークNATする。
- NATポイントはR2。
- VPC2は172.20.10.0/24のアドレスでアクセスする。
そのため, R1では必然的にPBRを利用してVPC1の通信をR2へ転送する。
Config
※ 抜粋
R1 Config
!
interface Ethernet0/0
description to R3
ip address 192.168.2.1 255.255.255.0
!
interface Ethernet0/1
description to R2
ip address 10.10.10.1 255.255.255.0
!
interface Ethernet0/2
description to R4
ip address 192.168.1.1 255.255.255.0
ip policy route-map PBR
!
ip route 172.16.10.0 255.255.255.0 192.168.1.2
ip route 172.16.20.0 255.255.255.0 192.168.2.2
ip route 172.20.10.0 255.255.255.0 10.10.10.2
!
ip access-list extended PBR
permit ip 172.16.10.0 0.0.0.255 any
!
!
route-map PBR permit 10
match ip address PBR
set ip next-hop 10.10.10.2
!
!
R2 Config
!
interface Loopback0
ip address 1.1.1.1 255.255.255.255
ip nat outside
ip virtual-reassembly in
!
interface Ethernet0/0
description to R1
ip address 10.10.10.2 255.255.255.0
ip nat inside
ip virtual-reassembly in
ip policy route-map NAT
!
!
ip nat inside source static network 172.16.10.0 172.20.10.0 /24 no-alias
ip route 0.0.0.0 0.0.0.0 10.10.10.1
ip route 172.20.10.0 255.255.255.0 Ethernet0/0
!
ip access-list extended PBR
permit ip 172.16.10.0 0.0.0.255 any
permit ip any 172.20.10.0 0.0.0.255
!
!
route-map NAT permit 10
match ip address PBR
set interface Loopback0
!
パケットフロー
CiscoルータにおけるNATの処理は公式ページにあるとおり。
参考:NATの処理順序
今回関係する箇所を太文字で。
|
|
プチ解説
@R1
NAT変換後のアドレスをR2へ向けます。
ip route 172.16.20.0 255.255.255.0 192.168.2.2
VPC1からのトラフィックをR2(NATボックス)へ捻じ曲げます。
interface Ethernet0/2
description to R4
ip address 192.168.1.1 255.255.255.0
ip policy route-map PBR
!
!
ip access-list extended PBR
permit ip 172.16.10.0 0.0.0.255 any
!
!
route-map PBR permit 10
match ip address PBR
set ip next-hop 10.10.10.2
@R2
物理IFをinsideに指定します。
interface Ethernet0/0
description to R1
ip address 10.10.10.2 255.255.255.0
ip nat inside
ip virtual-reassembly in
Loopbackをoutsideに指定します。
interface Loopback0
ip address 1.1.1.1 255.255.255.255
ip nat outside
ip virtual-reassembly in
NAT設定。IOS15以降はno-aliasが必要です。
ip nat inside source static network 172.16.10.0 172.20.10.0 /24 no-alias
global insideのアドレスを自身に持たせるためStatic Routeを物理IFへ指定します。
が, この構成ではなくてもいけました。(NATの処理フロー見ると不要な気がするんですが未だ理解できず。)
ip route 172.20.10.0 255.255.255.0 Ethernet0/0
NAT対象となる通信をPBRでLoopbackインタフェース(outside IF)へ送り込みます。これでinside-outsideに偽装します。
interface Ethernet0/0
description to R1
ip address 10.10.10.2 255.255.255.0
ip nat inside
no ip virtual-reassembly in
ip policy route-map NAT
!
!
ip access-list extended PBR
permit ip 172.16.10.0 0.0.0.255 any
permit ip any 172.20.10.0 0.0.0.255
!
!
route-map NAT permit 10
match ip address PBR
set interface Loopback0
!
通信確認。
VPCS> ping 172.16.20.1
84 bytes from 172.16.20.1 icmp_seq=1 ttl=251 time=1.802 ms
84 bytes from 172.16.20.1 icmp_seq=2 ttl=251 time=3.606 ms
84 bytes from 172.16.20.1 icmp_seq=3 ttl=251 time=4.168 ms
84 bytes from 172.16.20.1 icmp_seq=4 ttl=251 time=3.517 ms
84 bytes from 172.16.20.1 icmp_seq=5 ttl=251 time=3.150 ms
R2#sh ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 172.20.10.10:28052 172.16.10.10:28052 172.16.20.1:28052 172.16.20.1:28052
icmp 172.20.10.10:28308 172.16.10.10:28308 172.16.20.1:28308 172.16.20.1:28308
icmp 172.20.10.10:28564 172.16.10.10:28564 172.16.20.1:28564 172.16.20.1:28564
icmp 172.20.10.10:28820 172.16.10.10:28820 172.16.20.1:28820 172.16.20.1:28820
icmp 172.20.10.10:29076 172.16.10.10:29076 172.16.20.1:29076 172.16.20.1:29076
--- 172.20.10.10 172.16.10.10 --- ---
--- 172.20.10.0 172.16.10.0 --- ---
R2#
VPCS> ping 172.20.10.10
84 bytes from 172.20.10.10 icmp_seq=1 ttl=59 time=2.539 ms
84 bytes from 172.20.10.10 icmp_seq=2 ttl=59 time=4.796 ms
84 bytes from 172.20.10.10 icmp_seq=3 ttl=59 time=5.276 ms
84 bytes from 172.20.10.10 icmp_seq=4 ttl=59 time=4.397 ms
84 bytes from 172.20.10.10 icmp_seq=5 ttl=59 time=6.855 ms
VPCS>
注意点
Loopback IFへトラフィックを投げるのでCPU処理に落ちます。
スループットが気になる場合は物理的に(もしくはトランク等して)2本インタフェースを用意したほうがベター。
IOS12台と15台でコマンドが若干違うので古いバージョンを使うときは確認しましょう。