NAT-PT原理与配置

来源:互联网 发布:python 图片隐藏水印 编辑:程序博客网 时间:2024/05/01 10:53

NAT-PT使用通俗的方法理解:

IPV6要访问IPV4,必须要知道IPV4映射所形成的VIP6地址是多少,根据NAT-PT规定使用前缀为96的IPV6地址池来表示IPV4,这样每个IPV4就“存在”于IPV6中了。

IPV4要访问IPV6,必须要知道IPV6映射所形成的IPV4地址是多少,根据NAT-PT规定可以使用任意未占用的IPV4地址池来表示IPV6,这样每个IPV6也就“存在”于IPV4中了。(为了说明原理不必在意夸张的说法。)

根据上述理解知道,在NAT-PT路由器中必须存在两个地址池,一个为前缀96的IPV6地址池用于IPV4地址映射,另一个为IPV4地址池用于IPV6地址映射。明白了这个转换结构就容易配置各种NAT-PT类型了(如静态NAT-PT、动态NAT-PT等)。

以下二种NAT-PT的转换原理都从上面细变而来的,所以不再多介绍。

静态NAT-PT
静态模式提供一对一的IPv6地址和IPv4地址的映射。
动态NAT-PT
动态NAT-PT只能单向访问到一边的协议栈,但不能反过来访问。是多对多(指从映射池中取一个空闲的IP地址,当映射池IP用完,就不能再映射即其他内部没有得到映射的IP就无法访问外部)配置。

NAPT-PT

NAPT-PT也叫做重载,指多对一源地址转换,是v6向v4的单向访问,不能反过来访问v6。


实验目录:

1)静态NAT-PT,理解数据流的源IP和目的IP转换过程。

2)动态NAT-PT,通过多对多配置加深对NAT-PT的理解。

3)NAPT-PT,多对一转换,指多个源v6地址的转换仅一个v4地址,重要参数overload。natp-pt配合v4-mapped的使用。

实验拓扑:


实验配置:

1)静态NAT-PT

各接口配置如上图,在R2与R5之间配ripng,在R3与R5之间配置RIP。

R5(config)#do sh run

!
interface Serial1/0
 no ip address
 ipv6 address FE80:1::10 link-local
 ipv6 address 10::1/64
 ipv6 nat            \\指明做NAT-PT的接口。

 ipv6 rip rng_1 enable
 serial restart-delay 0
!
interface Serial1/1
 ip address 1.1.1.1 255.255.255.0
 ipv6 nat
 serial restart-delay 0
!

ipv6 router rip rng_1
 redistribute connected metric 3   \\将NVI0接口重分发到ripng中,使前缀1000::/96在IPV6中可达 。
  no split-horizon
!
ipv6 nat v4v6 source 1.1.1.2 1000::2     \\将v4映射成v6,从而能在ipv6网络中可以访问到ipv4主机。
ipv6 nat v6v4 source 21::1 100.1.1.2     \\同理。
ipv6 nat prefix 1000::/96    \\用于ipv4映射的地址池即NVI0接口的地址

!

R5(config)#

1.1、查看nat-pt静态映射表

R5#sh ipv nat tr   
Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
---   ---                      ---
      1.1.1.2                  1000::2


---   100.1.1.2                21::1
      ---                      ---

R5#


1.2、查看ipv4到ipv6的转换过程

R3#ping 100.1.1.2 sou 1.1.1.2 re 1     \\从IPV4访问IPV6,单个ping包
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.2 
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 36/36/36 ms

R3#


R5#debug ipv nat detailed 

IPv6 NAT-PT detailed debugging is on

R5#
*Mar  1 02:22:49.771: IPv6 NAT: Found prefix 1000::/96    \\发现匹配地址转换的数据包。
*Mar  1 02:22:49.771: IPv6 NAT: IPv4->IPv6:    \\指明为ipv4访问到ipv6
                 src (1.1.1.2 -> 1000::2)    \\将ipv4源地址转换成ipv6
                 dst (0.0.0.0 -> ::)          \\不知道这里为什么会这样了!!!!!!  在IPV6访问IPV4时源IP、目的IP都在同一个包显示出转换,但这里没有???
                 ref_count = 1, usecount = 0, flags = 513,
                 rt_flags = 0, more_flags = 0
*Mar  1 02:22:49.775: IPv6 NAT: IPv4->IPv6:
                 src (0.0.0.0 -> ::)
                 dst (100.1.1.2 -> 21::1)       \\将ipv4目的地址转换成ipv6
                 ref_count = 1, usecount = 0, flags = 257,
                 rt_flags = 0, more_flags = 0
R5#

1.3、查看ipv6到ipv4的转换过程

R2#ping 1000::2 sou 21::1 re 1
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 1000::2, timeout is 2 seconds:
Packet sent with a source address of 21::1
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 68/68/68 ms
R2#


R5#clear ipv nat translation *

R5#
*Mar  1 02:43:55.347: IPv6 NAT: IPv6->IPv4:
                 src (21::1 -> 100.1.1.2)                         
                 dst (1000::2 -> 1.1.1.2)               \\同时显示转换地址,与上面v4访问v6结果不一样?????

                 ref_count = 1, usecount = 0, flags = 64,
                 rt_flags = 0, more_flags = 0


*Mar  1 02:43:55.351: IPv6 NAT: icmp src (21::1) -> (100.1.1.2), dst (1000::2) -> (1.1.1.2)
*Mar  1 02:43:55.395: IPv6 NAT: Found prefix 1000::/96
*Mar  1 02:43:55.395: IPv6 NAT: IPv4->IPv6:
                 src (1.1.1.2 -> 1000::2)
                 dst (100.1.1.2 -> 21::1)
                 ref_count = 1, usecount = 0, flags = 64,
                 rt_flags = 0, more_flags = 0


*Mar  1 02:43:55.399: IPv6 NAT: icmp src (1.1.1.2) -> (1000::2), dst (100.1.1.2) -> (21::1)
R5#


2)动态NAT-PT

R5#

!
ip access-list extended nat4
 permit ip any 100.1.1.0 0.0.0.255
!
!
!
ipv6 router rip rng_1
 redistribute connected metric 3
  no split-horizon
!
ipv6 nat v4v6 source list nat4 pool pre_1000       \\从v4映射到v6没有overload选项,因为v6地址数量足够让每个v4地址“存在”于v6中。
ipv6 nat v4v6 pool pre_1000 1000::100 1000::101 prefix-length 96        \\将V4映射成V6的映射池设置为有2个。
ipv6 nat v6v4 source 20::1 100.1.1.3      \\静态映射使v6地址“存在”于v4中,让v4知道目标地址。
ipv6 nat v6v4 source 21::1 100.1.1.2
ipv6 nat v6v4 source 22::1 100.1.1.4
ipv6 nat prefix 1000::/96


从R3#访问到V6

R3#ping 100.1.1.2    \\同源IP访问多个目标地址转换后仅占映射池一个地址。
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/30/48 ms
R3#ping 100.1.1.3      
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/26/36 ms
R3#ping 100.1.1.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/28/52 ms
R3#ping 100.1.1.2 sou 30.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 30.1.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/28/40 ms
R3#ping 100.1.1.2 sou 31.1.1.1                    \\当前面使用完映射池地址后,第三个源地址31.1.1.1无法转换,
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 31.1.1.1 
.....
Success rate is 0 percent (0/5)
R3#

将R5映射表清空,结果再次证明,映射池IP数量决定转换地址数量。

R3#ping 100.1.1.2 sou 31.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 31.1.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/26/36 ms
R3#ping 100.1.1.2 sou 30.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 30.1.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/23/32 ms
R3#ping 100.1.1.2 sou 1.1.1.2 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.1.1.2, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.2 
.....
Success rate is 0 percent (0/5)
R3#


3)NAPT-PT

3.1、配置napt-pt

R5#

!
ipv6 nat v4v6 source 30.1.1.1 1000::30
ipv6 nat v4v6 source 31.1.1.1 1000::31
ipv6 nat v6v4 source list napt6 pool v4_100 overload   \\关键字
ipv6 nat v6v4 pool v4_100 100.1.1.100 100.1.1.100 prefix-length 24    \\注意映射池中只用一个IPV4。
ipv6 nat prefix 1000::/96
!
ipv6 access-list napt6
 permit ipv6 any 1000::/96

3.1、验证V6访问V4,源地址转换只占用v4一个。v6任意源地址访问已做映射的v4地址。最后查看R5映射表。

R5(config)#do sh ipv nat tr
Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
---   ---                      ---
      30.1.1.1                 1000::30
---   ---                      ---

      31.1.1.1                 1000::31
icmp  100.1.1.100,8815         21::1,8815         \\可看到使用参数overload后,任何v6访问v4,只用一个ipv4地址,并使用端口号来区分ipv6地址的访问。           
      30.1.1.1,8815            1000::30,8815

icmp  100.1.1.100,6869         22::1,6869
      30.1.1.1,6869            1000::30,6869

icmp  100.1.1.100,8552         22::1,8552
      30.1.1.1,8552            1000::30,8552

icmp  100.1.1.100,7697         22::1,7697
      31.1.1.1,7697            1000::31,769
R5(config)#

可以看到v6转换的源地址只占用一个4地址,表示overload成功。这样子就可以有效的节省ipv4。


3.3、v6要访问到v4,那么必须手动配置每个IVP4地址的静态映射,这样子工作量会比较大,而且难免有错漏。所以下面将介绍一种自动V4映射方法——v4_mapped。

R5#

ipv6 nat v6v4 source list napt6 pool v4_100 overload
ipv6 nat v6v4 pool v4_100 100.1.1.100 100.1.1.100 prefix-length 24
ipv6 nat prefix 1000::/96 v4-mapped nat4all     \\启动v4-mapped功能,使用nat4all标识匹配的地址,将从此地址中提取出ipv4并做为转换的目标地址。
!
ipv6 access-list napt6
 permit ipv6 any 1000::/96
!
ipv6 access-list nat4all
 permit ipv6 1000::/96 1000::/96  
      \\nat4all要求匹配的地址范围。

R5#

从上面配置中看出ipv4没有做映射,那么v6怎么知道目标呢?上面已标明v4-mapped能使v6在访问的目标地址中提取出ipv4并做为转换的目标地址。做如下测试

R5#sh ipv nat tr 

Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
R5#

nat-pt路由器的映射表中目前没有任何映射条目,下面从R2上ping

R2#ping 1000::101:102 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1000::101:102, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 32/43/68 ms
R2#ping 1000::1E01:101
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1000::1E01:101, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/51/88 ms
R2#ping 1000::1f01:101
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1000::1F01:101, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/47/84 ms
R2#

都已ping成功。

R5#sh ipv nat tr
Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
icmp  100.1.1.100,6467         20::1,6467
      1.1.1.2,6467             1000::101:102,6467
icmp  100.1.1.100,6963         20::1,6963
      30.1.1.1,6963            1000::1E01:101,6963
icmp  100.1.1.100,7332         20::1,7332
      31.1.1.1,7332            1000::1F01:101,7332
R5#

映射表中出现了转换的条目,说明通过使用v4_mapped功能,在ipv6目标地址就能提取出ipv4地址并作为转换的ipv4目标地址,此表示法将整个ipv4栈地址都“映射”了,从而省去了每个ipv4都配置一条映射命令。

下面再从R2上ping一个v4没有存在的地址2.2.2.2,看看结果

R2#ping 1000::202:202   
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1000::202:202, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
R2#


R5#debug ipv nat de

*Mar  1 06:39:33.610: %SYS-2-BADSHARE: Bad refcount in datagram_done, ptr=665F0260, count=0,  -Traceback= 0x6142DF7C 0x605397D0 0x6197B4A8 0x6317951C 0x631796D8 0x63179820 0x63144CE8 0x63145CA8 0x63145E64 0x631500E0      \\R2上一ping此命令,R5上马上出现一条无效的信息,此信息大概是说明转换成的v4目标地址不可达。

R5# 

R5#
*Mar  1 06:48:16.730: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::202:202 -> 2.2.2.2)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 06:48:16.734: IPv6 NAT: Dropping v6tov4 packet
R5#
*Mar  1 06:48:18.702: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::202:202 -> 2.2.2.2)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 06:48:18.706: IPv6 NAT: Dropping v6tov4 packet
R5#
*Mar  1 06:48:20.138: IPv6 NAT: Found prefix 1000::/96
*Mar  1 06:48:20.142: IPv6 NAT:v4tov6 entry not found


*Mar  1 06:48:20.718: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::202:202 -> 2.2.2.2)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 06:48:20.722: IPv6 NAT: Dropping v6tov4 packet
*Mar  1 06:48:21.078: IPv6 NAT: deleted a NAT entry after timeout
R5#
*Mar  1 06:48:22.730: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::202:202 -> 2.2.2.2)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 06:48:22.734: IPv6 NAT: Dropping v6tov4 packet
R5#
*Mar  1 06:48:36.622: IPv6 NAT: deleted a NAT entry after timeout
R5#


从以上的调试内容可以看到v6到v4的数据流已经成功转换地址,但目标地址没有任何的回应,所以ping不通。

为此在R3上添加虚接口loo 2并在rip通告后,再测试如下结果

R2#ping 1000::202:202
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1000::202:202, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/59/100 ms

R2#


R5#sh ipv nat tr   
Prot  IPv4 source              IPv6 source
      IPv4 destination         IPv6 destination
icmp  100.1.1.100,959          20::1,959
      2.2.2.2,959              1000::202:202,959
R5#

*Mar  1 06:58:02.270: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::202:202 -> 2.2.2.2)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 06:58:02.274: IPv6 NAT: icmp src (20::1) -> (100.1.1.100), dst (1000::202:202) -> (2.2.2.2)
*Mar  1 06:58:02.298: IPv6 NAT: Found prefix 1000::/96
*Mar  1 06:58:02.298: IPv6 NAT: IPv4->IPv6:
                 src (2.2.2.2 -> 1000::202:202)
                 dst (100.1.1.100 -> 20::1)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16

R5#


实验结束


附:

从R2上Ping 1000::101:101(为nat-pt路由器的本身ip),结果是不通的。因为数据流在返回来时,查看路由表发现,目标地址是自己,从而数据流在nat-pt上已匹配,不会返R2数据。这个与nat原理一样。

R2#ping 1000::101:101 re 1
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 1000::101:101, timeout is 2 seconds:.
Success rate is 0 percent (0/1)
R2#


R5#
*Mar  1 07:17:29.070: IPv6 NAT: IPv6->IPv4:
                 src (20::1 -> 100.1.1.100)
                 dst (1000::101:101 -> 1.1.1.1)
                 ref_count = 1, usecount = 0, flags = 2,
                 rt_flags = 0, more_flags = 16


*Mar  1 07:17:29.078: IPv6 NAT: icmp src (20::1) -> (100.1.1.100), dst (1000::101:101) -> (1.1.1.1)









0 0
原创粉丝点击