总结NAT.docx
《总结NAT.docx》由会员分享,可在线阅读,更多相关《总结NAT.docx(21页珍藏版)》请在冰豆网上搜索。
总结NAT
NAT总结
为什么要使用NAT?
RFC1631中对NAT进行了描述。
NAT最初的目的是通过允许使用较少的公有IP地址代表多数专用的IP地址,以减缓可用IP地址的枯竭速度。
私网IP地址是不能够在公共网络里进行路由的。
NAT技术让使用私有IP的私有网络能够连接到公共网络,如INTERNET。
通常在位于末节区域(内网)和公共网络(外网)之间的路由器上配置NAT。
将分组发送给外网之前,NAT将内部本地地址转换为全局唯一的IP地址。
几对NAT的重要概念和术语:
1.insidedevice/outsidedevice:
内部设备/外部设备
2.local/global:
私网/公网
3.ipnatinside/ipnatoutside:
内口/外口
下图便于大家理解这些概念:
Ipnatoutside
Ipnatinside
4.IL,insidelocal:
分配给内部设备的地址,这些地址不会向外公布。
5.IG,insideglobal:
通过这个地址,让外部设备可以知道内部设备。
6.OL,outsidelocal:
通过这个地址,让内部设备可以知道外部设备。
7.OG,outsideglobal:
分配给外部设备的地址,这些地址不会对内公布。
NAT的原理:
(以动态转换内部源地址为例:
ipnatinsidesourcelist1poolDY)
当从内部发起一个向外部的连接时,NAT路由器通过查看路由表,知道这是一个以内部为源去往外部的连接,并发现源地址符合访问列表的设定,于是NAT从pool中取出一个IG地址,对该IL地址进行翻译,将分组的源IL地址改为IG地址后继续转发,并将翻译条目写入NAT表。
外部目标设备再收到该分组后,以IG地址为目标地址进行应答。
NAT收到应答分组后,查NAT表将应答分组的目标地址(刚刚的IG地址)翻译成IL地址然后转发往发起连接的那个主机。
NAT的基本命令:
1.配置内/外口:
在接口配置模式下:
ipnatinside/ipnatoutside
2.配置动态映射时的地址池:
在全局配置模式下:
ipnatpoolpool-namestart-ipend-ipnetmasknetmask
3.地址映射命令:
静态(转换内部源地址):
ipnatinsidesourcestatic(tcp)IL地址IG地址
动态(转换内部源地址):
ipnatinsidesourcelistlist-namepoolpool-name
动态(转换外部源地址):
ipnatoutsidesourcelistlist-namepoolpool-name
动态(转换内部目的地址):
ipnatinsidedestinationlistlist-namepoolpool-name(多用在虚拟服务器中)
4.查看NAT表:
showipnattranslation
5.显示NAT统计:
showipnatstatistics
6.NAT超时:
ipnattranslationtimeout
7.对NAT条目数目限制和更改:
ipnattranslationmax-entries
8.清除NAT表中的动态条目:
clearipnattranslation*
实验部分:
其中:
1.R1/R2/R3/SW的以太网网段是123.0.0.0/24,R1/R2/R3都是以E0/0连接到SW上,地址分别为:
123.0.0.1/123.0.0.2/123.0.0.3
2.R3/R4之间都以S1/0相连,网段是34.0.0.0/24,地址分别是34.0.0.3/34.0.0.4
3.R3/R5之间都以S1/1相连,网段是35.0.0.0/24,地址分别是35.0.0.3/35.0.0.5
4.R1和R2上有一条默认路由下一跳指向123.0.0.3
5.R4上:
iproute200.1.4.0255.255.255.034.0.0.3
6.R5上:
iproute200.1.5.0255.255.255.035.0.0.3
下面是开始时所有路由器的配置:
(假设给定的IG地址段是POOLR4:
200.1.4.1~200.1.4.3,POOLR5:
200.1.5.1~200.1.5.3)
R1:
interfaceEthernet0/0
ipaddress123.0.0.1255.255.255.0
!
iproute0.0.0.00.0.0.0123.0.0.3
R2:
interfaceEthernet0/0
ipaddress123.0.0.2255.255.255.0
!
iproute0.0.0.00.0.0.0123.0.0.3
R3:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
!
interfaceSerial1/1
ipaddress35.0.0.3255.255.255.0
R4:
interfaceSerial1/0
ipaddress34.0.0.4255.255.255.0
!
iproute200.1.4.0255.255.255.034.0.0.3
R5:
interfaceSerial1/1
ipaddress35.0.0.5255.255.255.0
!
iproute200.1.5.0255.255.255.035.0.0.3
第一:
静态的NAT:
使用R1,R3,R4
在NAT路由器R3上进行配置:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
interfaceSerial1/1
ipaddress35.0.0.3255.255.255.0
!
ipnatinsidesourcestatic123.0.0.1200.1.4.1
查看R3的NAT表:
R3(config)#doshowipnattranslation
ProInsideglobalInsidelocalOutsidelocalOutsideglobal
---200.1.4.1123.0.0.1------
此时,从R1的123.0.0.1去pingR4的34.0.0.4或者从R4的34.0.0.4去ping200.1.4.1都是可以通的,这是因为NAT表中有翻译条目:
200.1.4.1(IG)--------123.0.0.1(IL)
第二:
动态的NAT:
使用R1,R3,R4
在NAT路由器R3上进行配置:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
interfaceSerial1/1
ipaddress35.0.0.3255.255.255.0
!
!
ipnatpoolDY200.1.4.1200.1.4.3netmask255.255.255.0
ipnatinsidesourcelist1poolDY
!
access-list1permit123.0.0.1
在第一次连接发起之前showipnattranslation可以发现NAT表是空的,然后用R1的123.0.0.1去pingR4的34.0.0.4,可以PING通,此时NAT表有200.1.4.1到123.0.0.1的映射了。
然后我们使用命令doclearipnattranslation*清楚表中的动态映射,再从R4去PING200.1.4.1,可以发现:
R4(config)#doping200.1.4.1
Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto200.1.4.1,timeoutis2seconds:
U.U.U
Successrateis0percent(0/5)
这是因为NAT表中已经没有了200.1.4.1这个地址的翻译条目,并在R3的路由表中也没有有关于200.1.4.1的路由,所以显示路由不可达。
第三:
RoutingloopwhenuseingdynamicNAT:
使用R1,R3,R4
从上面的例子中我们可以大概看出NAT的一个执行步骤:
1.从inside到outside:
先查找路由表,发现这是一个以内部地址为源到外部的连接,并且源符合list1圈定的范围,于是NAT将地址翻译,把翻译条目保存进NAT表中。
2.从outside到inside:
先查NAT表,将IG地址翻译成IL地址,再查路由表。
所以上个例子中,NAT表中没有翻译条目,无法将IG翻译IL,因为R3的路由表中没有200路由(IG),只有123路由(IL),所以显示不可达了。
如果说R3有能力为200去路由又会发生什么呢?
我们在R3上多配置一条指向R4的默认路由:
iproute0.0.0.00.0.0.034.0.0.4,然后打开debugippacket,debugipnat后在R4上PING200.1.4.1,以下是R3的显示:
*Mar101:
02:
13.779:
IP:
tableid=0,s=34.0.0.4(Serial1/0),d=200.1.4.1(Serial1/0),routedviaFIB
*Mar101:
02:
13.779:
IP:
s=34.0.0.4(Serial1/0),d=200.1.4.1(Serial1/0),len100,redirected
*Mar101:
02:
13.783:
IP:
tableid=0,s=34.0.0.3(local),d=34.0.0.4(Serial1/0),routedviaFIB
*Mar101:
02:
13.783:
IP:
s=34.0.0.3(local),d=34.0.0.4(Serial1/0),len56,sending
*Mar101:
02:
13.787:
IP:
s=34.0.0.4(Serial1/0),d=200.1.4.1(Serial1/0),g=34.0.0.4,len100,forward
我们可以比较清楚的看到,从s=34.0.0.4,d=200.1.4.1在做了一个路由重定向后又以s=34.0.0.3,d=34.0.0.4发回了R4,网络在这里出现了打环的现象。
第四:
PAT:
使用R1,R2,R3,R4(在R3上noiproute0.0.0.00.0.0.034.0.0.4)
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
!
!
ipnatinsidesourcelist1interfaceSerial1/0overload
access-list1permit123.0.0.00.0.0.3
在R1,R2上用PING和telnet对R4发起连接,然后查看NAT表如下:
icmp34.0.0.3:
6123.0.0.1:
634.0.0.4:
634.0.0.4:
6
tcp34.0.0.3:
39855123.0.0.1:
3985534.0.0.4:
2334.0.0.4:
23
icmp34.0.0.3:
0123.0.0.2:
034.0.0.4:
034.0.0.4:
0
tcp34.0.0.3:
48670123.0.0.2:
4867034.0.0.4:
2334.0.0.4:
23
可以看到,两个不同的IL地址被映射到同一个IG地址上,但是所用的端口号是不同的,以标识不同的IL地址。
NAT试图保留BSD的语法,在可能的情况下将IL的端口号映射到同样的IG端口号,不同的IG端口号只在与IL相关的端口号在另一个映射中被占用时使用。
第五:
NAT的TCP负载分配:
使用R1,R2,R3,R4
外部看来有一个IG地址的单独的服务器,实际上R3将R1和R2两个IL地址轮流翻译。
为了方便实验结果的观察,我们先在R1/R2上做如下配置:
R1(config)#linevty04
R1(config-line)#passwordR1
R1(config-line)#login
R2(config)#linevty04
R2(config-line)#passwordR2
R2(config-line)#login
在R3上做的配置如下:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
ipnatpoolVS123.0.0.1123.0.0.2prefix-length24typerotary
ipnatinsidedestinationlist1poolVS
!
access-list1permit200.1.4.1
做完以后我们在R4上telnet200.1.4.1:
R4(config)#dotel200.1.4.1
Trying200.1.4.1...Open
UserAccessVerification
Password:
R1>
R1>
R4(config)#dodisc1
Closingconnectionto200.1.4.1[confirm]
==============================================
R4(config)#dotel200.1.4.1
Trying200.1.4.1...Open
UserAccessVerification
Password:
R2>
R2>
R4(config)#dodisc1
Closingconnectionto200.1.4.1[confirm]
==============================================
R4(config)#dotel200.1.4.1
Trying200.1.4.1...Open
UserAccessVerification
Password:
R1>
R1>
R4(config)#dodisc1
Closingconnectionto200.1.4.1[confirm]
==============================================
R4(config)#dotel200.1.4.1
Trying200.1.4.1...Open
UserAccessVerification
Password:
R2>
R2>
我们只是TELNET了200.1.4.1这个地址,却被轮流的连接到R1和R2上。
另外要提及的两点就是当POOL中的地址不连续怎么办,前面的例子中我们的POOL中的地址都是连续的
R3(config)#ipnatpoolVS?
A.B.C.DStartIPaddress
netmaskSpecifythenetworkmask
prefix-lengthSpecifytheprefixlength
此时如果打A.B.C.D就表示接下来的地址段是连续的,如果选后两个,就可以圈出不连续的地址段,比如200.1.4.1到200.1.4.100中的34和69必须拿出来做DNS的静态地址映射而不能进入地址池。
那么我们可以这样去定义POOL:
R3(config)#ipnatpoolVSprefix-length24
R3(config-ipnat-pool)#address200.1.4.1200.1.4.33
R3(config-ipnat-pool)#address200.1.4.35200.1.4.68
R3(config-ipnat-pool)#address200.1.4.70200.1.4.100
还有一个就是:
R3(config)#ipnatpoolVS2123.0.0.1123.0.0.2prefix-length24type?
match-hostKeephostnumbersthesameaftertranslation
rotaryRotaryaddresspool
rotary这个关键字我们已经知道了,就是让POOL中的地址轮流的被翻译;而match-host这个关键字和rotary是不能共存的,后一个打上去的会把前面的覆盖掉,match-host的意思是让IL的主机位与IG的主机位相同,如123.0.0.2/24的IL就翻译成200.1.4.2/24的IG。
rotary需要轮流翻译而match-host将IL和IG主机位对应起来。
第六:
NAT的服务分配:
使用R1,R2,R3,R4
假设R3来为R4提供服务,80端口提供WWW服务,而21端口提供FTP服务(R4看来),而实际上WWW服务是由R1来提供的,FTP服务由R2提供。
为了便于观察,我们用R1的TELNET来模拟WWW,用R2的TELNET来模拟FTP。
R3上的配置如下:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
ipnatinsidesourcestatictcp123.0.0.223interfaceSerial1/021
ipnatinsidesourcestatictcp123.0.0.123interfaceSerial1/080
在R4上进行演示:
R4(config)#dotelnet34.0.0.380
Trying34.0.0.3,80...Open
UserAccessVerification
Password:
R1>
R1>
R1>
R4(config)#dodisc1
Closingconnectionto34.0.0.3[confirm]
=============================================
R4(config)#dotelnet34.0.0.321
Trying34.0.0.3,21...Open
UserAccessVerification
Password:
R2>
R2>
R2>
第七:
用ROUTE-MAP实现双出口的NAT:
使用R1,R3,R4,R5
1.我们先看看如果使用的是扩展列表时的情况:
interfaceEthernet0/0
ipaddress123.0.0.3255.255.255.0
ipnatinside
!
interfaceSerial1/0
ipaddress34.0.0.3255.255.255.0
ipnatoutside
!
interfaceSerial1/1
ipaddress35.0.0.3255.255.255.0
ipnatoutside
!
ipnatpoolR4200.1.4.1200.1.4.3netmask255.255.255.0
ipnatpoolR5200.1.5.1200.1.5.3prefix-length24
ipnatinsidesourcelist101poolR4
ipnatinsidesourcelist102poolR5
!
access-list101permitiphost123.0.0.1host34.0.0.4
access-list102permitiphost123.0.0.1host35.0.0.5
下面我们从R1上先PINGR4再PINGR5:
R1(config)#doping34.0.0.4
Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto34.0.0.4,timeoutis2seconds:
!
!
!
!
!
Successrateis100percent(5/5),round-tripmin/avg/max=24/63/104ms
R1(config)#doping35.0.0.5
Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto35.0.0.5,timeoutis2seconds:
.....
Successrateis0percent(0/5)
发现R4可以通而R5不通
在R3上打开DEBUGIPNAT:
R3#
*Mar102:
22:
29.527:
NAT*:
s=123.0.0.1->200.1.4.1,d=35.0.0.5[45]
R3#
*Mar102:
22:
31.535:
NAT*:
s=123.0.0.1->200.1.4.1,d=35.0.0.5[46]
R3#
*Mar102:
22:
33.559:
NAT*:
s=123.0.0.1->200.1.4.1,d=35.0.0.5[47]
R3#
*Mar102: