CCNP路由实验之十五 NAT(网络地址转换)
众所周知,要让自己的电脑连上Internet,必须要到运营商(ISP)申请一个上网账号,根据此账号申请自己的宽频业务(拨号上网、商业固定IP等等),当你完成申请后,就可以通过拨号拿到一个全域唯一的公网IP,又或者直接是一个商业宽频的固定IP,(注意,其实ISP是把公网IP租给用户的,当用户不租时他们可以租给其他电脑,以提高公网IP使用率)然后用户通过这个在Internet网络上可被路由的合法IP地址,与Internet上其他的用户或服务进行通信,其实这个公网IP就是实现你可以找到别人,别人也可以找到你的目的,相当于你的网络身份证。显然,一个公网IP只有一台主机能上网,但是全球这么多计算机要上互联网,就要一机一个公网IP,此时就会导致IPv4地址空间的短缺,同时对于家庭和小型办公室来讲申请多个公网IP地址的代价是很高的,也是不现实的。而长远的解决方法是增加地址空间,也就提出了IPv6方案。但是在IPv6开发和普及期间的过渡方法就是NAT 即网络地址转换,也叫做网络掩蔽或者IP掩蔽。NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。在这个IPv4与IPv6长期共存的时期,NAT成为了一种广泛应用的技术。NAT是在IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术,这种技术使得在私有网络中有多台主机但只通过一个或几个公网IP地址访问因特网成为可能。
提示:在平时我们自己组建的局域网中都是使用私有IP地址进行彼此通信的,例如
A类:10.0.0.0-10.255.255.255(长度相当于1个A类IP地址)
B类:172.16.0.0-172.31.255.255(长度相当于16个连续的B类IP地址)
C类:192.168.0.0-192.168.255.255(长度相当于256个连续的C类IP地址)
这些地址是不会被互联网分配使用的,因此它们在互联网上也从来不会被路由的。同时我们可以不必向ISP 或注册中心申请而在公司或企业内部自由使用,虽然这些私有IP地址它们不能直接和互联网连接,但他们却能帮我们组建自己的内部网络,在内部局域网中将这些地址当作公用IP地址一样使用与局域网内部的其他主机设备进行通信。
NAT转换方法
Full cone NAT又叫完全锥形 NAT,一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机都能通过给eAddr:port2发包到达iAddr:port1。其实静态一对一NAT就是Full cone NAT,它的穿透性最好
Address-Restricted cone NAT又叫限制锥形 NAT,它受IP限制,即只接收曾经发送到对端的IP地址来的数据包。一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机(hostAddr:any)都能通过给eAddr:port2发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:any."any"也就是说端口不受限制。其实动态地址转换就是限制锥形 NAT
Port-Restricted cone NAT类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。一个外部主机(hostAddr:port3)能够发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:port3.其实就是端口多路复用NAT
Symmetric NAT(对称NAT)每一个来自相同内部IP与port的请求到一个特定目的地的IP地址和端口,映射到一个独特的外部来源的IP地址和端口。同一个内部主机发出一个信息包到不同的目的端,不同的映射使用外部主机收到了一封包从一个内部主机可以送一封包回来
其实锥形NAT就是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。
NAT的原理
私有内部网络的client端将IP的网关 (gateway )设定指向NAT 设备或路由器,所以当client端要连上 Internet 的时候,该client的请求数据包就会被送到 NAT 主机或路由器上,这个时候的该数据包的source IP(源)依然是客户端的IP;
当数据包穿过这个 NAT 设备或路由器时,它会将 client 的对外请求数据包的 source IP 伪装成 NAT设备或路由器的外部接口IP,而这个外部接口所具有IP必须是的合法的公网 IP 了,此时这个数据包就可以连上 Internet 了,同时 NAT 主机或路由器会记忆这个数据包是由哪一个 内部 client 端传送来的,根据转换关系表转换IP,并将转换关系保存到内存
由 Internet 传送回来的封包,当然由 NAT设备或路由器的外部接口来接收了,这个时候, NAT 主机会去查询原本记录的路由信息和转换记录,并将目标 IP 由的公网 IP 改回原来的内部的client端IP;
最后则由 NAT 设备或路由器将该数据包传送给原先发送封包的 Client
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。NAT将自动修改IP报文的源IP地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据部分嵌入IP地址的应用程序就不能正常工作。
NAT功能
NAT不仅能解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
宽带分享:这是 NAT 主机的最大功能。
安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC 。
端口转发: 当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。
负载平衡: 目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。
失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。
透明代理: NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。
NAT的几个概念
内部本地地址(Inside Local Address) :内部网络中的PC机的私有IP地址,一般都是我们常见的10.0.0.0/172.16.0.0/192.168.0.0
内部全局地址(Inside Global Address) :是用于转换内部网络的公网IP。
外部本地地址(Outside Local Address):是访问NAT设备或路由器的外部主机使用的公网IP 地址
外部全局地址 (outside global address) : 是访问NAT设备或路由器的外部主机使用的公网IP 地址
ip nat inside source:当数据包从内部传输到外部时,先检查目的地的路由表,然后进行转换数据包的源地址 即将inside local地址翻译成为inside global地址;当数据包从外部回包到内部时,先进行转换数据包的目标地址,即将inside global地址翻译成为inside local地址,然后检查目的地的路由表。也就是说将inside source看成inside接口作为源,触发点就是在inside接口
ip nat inside destination : 当数据包从外输到内部时,先转换数据包的目标地址,即将外部全局地址转换为外部局部地址,然后检查目的地的路由;当数据包从内部回包到外部时,先检查目的地的路由表,然后转换数据包的源地址,即将外部局部地址转换为外部全局地址。也就是说inside destination看成inside接口作为目的,那么触发点就是在outside接口
ip nat outside source 当数据包从外部传输到内部时,先转换数据包的源地址,将外部全局地址转换为外部局部地址,然后检查目的地的路由表;当数据包从内部回包到外部时,先检查目的地的路由表,然后转换数据包的目标地址,将外部局部地址转换为外部全局地址;也就是说outside source看成outside接口作为源,那么触发点就是在outside接口 。注意当配置ip nat outside source 时候,从内口到外口时要先检查路由表,也就是一定要将转换的outside local的路由加到外口,cisco中提供了add-route参数。例:ip natoutside source list 1 pool test add-route;
ip nat outside destination当数据包从外部传输到内部时,先转换数据包的目标地址,即将内部全局地址转换为内部局部地址,然后检查路由表;当从内部回包到外部时,先检查目的的路由表,然后转换数据包的目的地址,即将内部局部地址转换为内部全局地址。也就是说outside destination看成outside接口作为目的,那么触发点就是在inside接口
NAT实现方式
静态转换(Static Nat)是指将内部网络的私有IP地址转换为公有IP地址,IP地址是一对一的永久映射,即某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换(Dynamic Nat)是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。实际环境中用的比较少
端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port AddressTranslation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
网络地址端口转换(NAPT)将内部网络指定主机的指定端口映射到全局地址的指定端口上,一般用于把服务器的服务端口放到外网,提供访问
区域无关NAT (DomainlessNAT) Domainless就是说不再区分inside和outside,只是单纯地做NAT,没有用所谓的平衡点,进而两个方向NAT的处理HOOK点也不再基于平衡点对称,所有的NAT操作全部在PREROUTING上做,它用一个叫做NATVirtual Interface(NVI)的虚拟接口来实现,通过路由的方式将带有ipnat enable配置的接口进来的包全部导入这个虚拟接口NVI0中。然后用数据包的源地址和目标地址分别查询SNAT表和DNAT表,根据结果进行NAT操作,随后进入真正的路由查询, 可见,不管方向,不管路由,只要数据包进入了一块带有ip natenable配置的物理网卡,就会先路由再NAT然后再路由(第一个路由只是匹配一下路由,而没有真正的路由行为,第二个路由则是真实的路由行为),不管是SNAT和DNAT都在这里进行。数据包在进入真正的路由查询前,NAT就已经完成了,在路由器看来,NAT操作被藏起来了,就好像数据包本来就是那个样子一样。当然Domainless的NAT也不再和任何其它操作关联,ACL,VPN感兴趣流匹配,policyrouting等都和NAT无关
以下的NAT处理循序依次尝试匹配,直至发现第一个匹配项为止。
NAT免除(使用nat 0 access-list命令)。(防火墙上有)
策略NAT(使用加载了access-list的static命令)。
静态NAT(使用static命令)。
静态PAT(使用static命令)。
策略NAT(使用加载了access-list的nat命令)。
动态NAT(使用nat命令)。
动态PAT(使用nat命令)
NAT的缺点:
NAT违反了IP地址结构模型的设计原则。IP地址结构模型的基础是每个IP地址均标识了一个网络的连接。Internet的软件设计就是建立在这个前提之上,而NAT使得有很多主机可能在使用相同的地址,如10.0.0.1。
NAT使得IP协议从面向无连接变成面向连接。NAT必须维护专用IP地址与公用IP地址以及端口号的映射关系。在TCP/IP协议体系中,如果一个路由器出现故障,不会影响到TCP协议的执行。因为只要几秒收不到应答,发送进程就会进入超时重传处理。而当存在NAT时,最初设计的TCP/IP协议过程将发生变化,Internet可能变得非常脆弱。
NAT违反了基本的网络分层结构模型的设计原则。因为在传统的网络分层结构模型中,第N层是不能修改第N+1层的报头内容的。NAT破坏了这种各层独立的原则。
有些应用是将IP地址插入到正文的内容中,例如标准的FTP协议与IP Phone协议H.323。如果NAT与这一类协议一起工作,那么NAT协议一定要做适当地修正。同时,网络的传输层也可能使用TCP与UDP协议之外的其他协议,那么NAT协议必须知道并且做相应的修改。由于NAT的存在,使得P2P应用实现出现困难,因为P2P的文件共享与语音共享都是建立在IP协议的基础上的。
NAT同时存在对高层协议和安全性的影响问题。RFC对NAT存在的问题进行了讨论。NAT的反对者认为这种临时性的缓解IP地址短缺的方案推迟了Ipv6迁移的进程,而并没有解决深层次的问题,他们认为是不可取的。
在一个具有NAT功能的路由器下的主机并没有建立真正的端对端连接,并且不能参与一些因特网协议。一些需要初始化从外部网络建立的TCP连接,和使用无状态协议(比如UDP)的服务将被中断。除非NAT路由器作一些具体的努力,否则送来的数据包将不能到达正确的目的地址。(一些协议有时可以在应用层网关的辅助下,在参与NAT的主机之间容纳一个NAT的实例,比如FTP。)NAT也会使安全协议变的复杂。
在使用NAT时需要考虑到的问题
使用NAT地址转换会使路由器处理数据包延迟增大。路由器的CPU必须对每个数据包进行检查,对需要改变地址信息的数据包进行操作,因此 会加大运行负载。同时,路由器要使用NAT技术,必须处于处理机交换(process swithing)的工作模式,可能会降低运行性能。
NAT隐藏了端到端的ip地址,使得对数据包路径的跟踪变的比较困难。而且,正是由于这个原因,使得一些内嵌的ip地址在应用中会产生问题,比如ICMP协议,FTP,NBT,SNMP,DNS,VOIP等。
还有,如果使用IPSec进行加密,则只能把NAT放在受保护的VPN内部,或者使用具有NAT功能的IPSec设备。因为IPSec规定ip地址不能被改变。如果改变了ip地址,就会破坏VPN的功能。如果确实需要对已用IPSec加密的数据进行地址改变,那就应该考虑使用RSIP技术作为代替了。
端口回流(NAT loopback),指当内网有服务映射到网关后,内网主机也可以用网关外部地址访问,凡是支持回流功能的路由器,都可以从内网访问网关外部地址上映射的服务,不支持回流技术的当然就不行。路由回流在cisco的防火墙可以做,在路由器中,则有的可以做,有的不行
Cisco没有像Linux那样使用“pre/post路由”这么技术化的术语来定义NAT的行为,而是完全根据Domain来定义,所谓的Domain,即路由器两边一边属于inside,另一边属于outside。那么所有的NAT无外乎就以下4种类型:
1>从inside到outside时转换源地址
2>从inside到outside时转换目标地址
3>从outside到inside时转换源地址
4>从outside到inside时转换目标地址
其中1和4互相隐含,2和3互相隐含
实验一、静态一对一的NAT
PC配置:
PC#conf t
PC(config)#no ip routing
PC(config)#ip default-gateway 192.168.0.1
PC(config)#int fa0/0
PC(config-if)#ip add 192.168.0.100 255.255.255.0
PC(config-if)#no sh
PC(config-if)#exit
Server配置:
Server#conf t
Server(config)#no ip routing
Server(config)#ip default-gateway 192.168.0.1
Server(config)#int fa0/0
Server(config-if)#ip add 192.168.0.80 255.255.255.0
Server(config-if)#no sh
Server(config-if)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside //指定连接内部网络的内部接口,并启用NAT
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside //指定连接外部网络的外部接口,并启用NAT
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip nat inside source static 192.168.0.80202.100.100.80//指定内部源地址192.168.0.80静态一对一转换为202.100.100.80。当然可以设置转换为外部接口的IP:202.100.100.1,但是这样外部网络访问202.100.100.1的时候就全部转向访问Server了,如果内部网络不要求上网或没有其他服务时可以这样做,否则会影响内部网络的使用。所以不推荐
测试检查:
PC#ping 202.100.100.100 //PC没有转换
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
Server#ping 202.100.100.100 //Server直接访问外部Internet
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max= 28/70/124 ms
Internet#ping 202.100.100.80 //Internet直接通过公网IP访问内部Server
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.80, timeoutis 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 28/77/152 ms
PC#ping 202.100.100.80 //PC可以通过公网IP访问内部服务器
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.80, timeoutis 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 8/39/140 ms
R1#debug ip nat //在R1调试转换信息,对于ICMP包,NAT通过更改ICMP的ID,来实现多对少的映射
IP NAT debugging is on
*Mar 100:12:25.683: NAT*: s=192.168.0.80->202.100.100.80, d=202.100.100.100 [0]
*Mar 100:12:26.655: NAT*: s=192.168.0.80->202.100.100.80, d=202.100.100.100 [1]
*Mar 100:12:26.751: NAT*: s=202.100.100.100, d=202.100.100.80->192.168.0.80 [1]
*Mar 100:12:26.815: NAT*: s=192.168.0.80->202.100.100.80, d=202.100.100.100 [2]
R1#sh ip nat translations //查看转换状态
Pro Inside global Inside local Outsidelocal Outside global
icmp 202.100.100.80:1 192.168.0.80:1 202.100.100.100:1 202.100.100.100:1
--- 202.100.100.80 192.168.0.80 --- ---
实验二、动态NAT
PC1配置:
PC1#conf t
PC1(config)#no ip routing
PC1(config)#ip default-gateway 192.168.0.1
PC1(config)#int fa0/0
PC1(config-if)#ip add 192.168.0.100 255.255.255.0
PC1(config-if)#no sh
PC1(config-if)#exit
PC2配置:
PC2#conf t
PC2(config)#no ip routing
PC2(config)#ip default-gateway 192.168.0.1
PC2(config)#int fa0/0
PC2(config-if)#ip add 192.168.0.101 255.255.255.0
PC2(config-if)#no sh
PC2(config-if)#exit
PC3配置:
PC3#conf t
PC3(config)#no ip routing
PC3(config)#ip default-gateway 192.168.0.1
PC3(config)#int fa0/0
PC3(config-if)#ip add 192.168.0.50 255.255.255.0
PC3(config-if)#no sh
PC3(config-if)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list standard nat//定义可以进行转换的内部地址范围
R1(config-std-nacl)#10 permit 192.168.0.0 0.0.0.255
R1(config-std-nacl)#20 deny any
R1(config-std-nacl)#exit
R1(config)#ip nat pool global-pool 202.100.100.2202.100.100.3 netmask 255.255.255.0//创建只有两个公网IP的地址池。
R1(config)#ip nat inside source list nat pool global-pool//创建动态转换将符合ACL的内部地址随机转换成公网IP地址池中的一个。动态NAT是临时映射关系,过一段时间没有用就会删除映射关系,释放公网IP。注意公网IP地址池有几个IP,那么同一时间只能有几台电脑可以上网,其他电脑要上网必须等临时映射关系结束才能使用被释放的公网IP再进行转换
R1(config)#ip nat translation timeout 10 //配置动态NAT的超时时间为10s,默认为24小时,即空闲10s没有用,就删除临时映射关系。方便测试
检查测试:
PC1#ping 202.100.100.100 //PC1是第一个转换的,从公网IP池中可以取得一个公网进行转换,可以上网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
..!!!
Success rate is 60 percent (3/5), round-trip min/avg/max= 28/96/172 ms
PC2#ping 202.100.100.100 //PC2是第二个转换的,从公网IP池中可以取得第二个公网进行转换,可以上网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max= 28/90/148 ms
PC3#ping 202.100.100.100 r 100 //PC3由于公网IP池中地址耗尽,要等到其他内部用户的NAT临时映射关系结束,才能使用被释放出来的公网IP进行上网。
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 0 percent (50/100)
R1#debug ip nat
IP NAT debugging is on
*Mar 100:42:20.671: NAT*: s=192.168.0.100->202.100.100.2, d=202.100.100.100 [1]
*Mar 1 00:42:22.795:NAT*: s=202.100.100.100, d=202.100.100.2->192.168.0.100 [2]
*Mar 100:52:35.259: NAT*: s=192.168.0.101->202.100.100.3, d=202.100.100.100 [5]
*Mar 100:52:35.367: NAT*: s=202.100.100.100, d=202.100.100.3->192.168.0.101 [5]
*Mar 101:07:28.083: NAT: translation failed (A), dropping packet s=192.168.0.50d=202.100.100.100 [158] //拒绝
*Mar 101:07:28.091: NAT: translation failed (A), dropping packet s=192.168.0.50d=202.100.100.100 [159]
*Mar 101:07:59.007: NAT: expiring 202.100.100.2 (192.168.0.100) icmp 3 (3) //过期结束映射关系,释放公网IP
*Mar 101:08:01.059: NAT: expiring 202.100.100.3 (192.168.0.101) icmp 2 (2)
*Mar 101:08:06.463: NAT*: s=192.168.0.50->202.100.100.2, d=202.100.100.100 [160]
*Mar 101:08:06.579: NAT*: s=202.100.100.100, d=202.100.100.2->192.168.0.50 [160]
*Mar 101:08:06.659: NAT*: s=192.168.0.50->202.100.100.2, d=202.100.100.100 [161]
R1#sh access-lists //查看ACL
Standard IP access list nat
10 permit192.168.0.0, wildcard bits 0.0.0.255 (303 matches)
20 deny any
R1#sh ip nat translations //注意10s超时后映射关系清空
Pro Inside global Inside local Outsidelocal Outside global
icmp 202.100.100.2:4 192.168.0.100:4 202.100.100.100:4 202.100.100.100:4
--- 202.100.100.2 192.168.0.100 --- ---
icmp 202.100.100.3:3 192.168.0.101:3 202.100.100.100:3 202.100.100.100:3
--- 202.100.100.3 192.168.0.101 --- ---
实验三、端口多路复用的NAT
PC1配置:
PC1#conf t
PC1(config)#no ip routing
PC1(config)#ip default-gateway 192.168.0.1
PC1(config)#int fa0/0
PC1(config-if)#ip add 192.168.0.100 255.255.255.0
PC1(config-if)#no sh
PC1(config-if)#exit
PC2配置:
PC2#conf t
PC2(config)#no ip routing
PC2(config)#ip default-gateway 192.168.0.1
PC2(config)#int fa0/0
PC2(config-if)#ip add 192.168.0.101 255.255.255.0
PC2(config-if)#no sh
PC2(config-if)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list standard nat //定义可以进行NAT转换的内部IP范围
R1(config-std-nacl)#permit 192.168.0.0 0.0.0.255
R1(config-std-nacl)#deny any
R1(config-std-nacl)#exit
R1(config)#ip nat inside source list nat interface fa0/1overload//在外网接口启用端口复用NAT转换,转换我们的内部IP
检查测试:
PC1#ping 202.100.100.100
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 40/153/372 ms
PC2#ping 202.100.100.100
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 28/124/388 ms
R1#debug ip nat
*Mar 100:15:31.883: NAT*: s=192.168.0.100->202.100.100.1, d=202.100.100.100 [25]
*Mar 100:15:32.107: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.100 [25]
*Mar 100:16:18.395: NAT*: s=192.168.0.101->202.100.100.1, d=202.100.100.100 [45]
*Mar 100:16:18.639: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.101 [45]
R1#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
icmp 202.100.100.1:4 192.168.0.100:4 202.100.100.100:4 202.100.100.100:4
icmp 202.100.100.1:5 192.168.0.101:4 202.100.100.100:4 202.100.100.100:5
R1#sh access-lists
Standard IP access list nat
10 permit192.168.0.0, wildcard bits 0.0.0.255 (4 matches)
20 deny any
实验四、动态NAT端口多路复用
PC1配置:
PC1#conf t
PC1(config)#no ip routing
PC1(config)#ip default-gateway 192.168.0.1
PC1(config)#int fa0/0
PC1(config-if)#ip add 192.168.0.101 255.255.255.0
PC1(config-if)#no sh
PC1(config-if)#exit
PC2配置:
PC2#conf t
PC2(config)#no ip routing
PC2(config)#ip default-gateway 192.168.0.1
PC2(config)#int fa0/0
PC2(config-if)#ip add 192.168.0.102 255.255.255.0
PC2(config-if)#no sh
PC2(config-if)#exit
PC3配置:
PC3#conf t
PC3(config)#no ip routing
PC3(config)#ip default-gateway 192.168.01.
PC3(config)#ip default-gateway 192.168.0.1
PC3(config)#int fa0/0
PC3(config-if)#ip add 192.168.0.103 255.255.255.0
PC3(config-if)#no sh
PC3(config-if)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list standard go-internet
R1(config-std-nacl)#10 permit 192.168.0.0 0.0.0.255
R1(config-std-nacl)#20 deny any
R1(config-std-nacl)#exit
R1(config)# ip nat pool public-ip202.100.100.80 202.100.100.81 prefix-length 24
R1(config)#ip nat inside source list go-internet poolpublic-ip overload //注意overload参数关键,启用复用
检查测试:
PC1#ping 202.100.100.100 r 10
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.!!!!!!!!!
Success rate is 90 percent (9/10), round-trip min/avg/max= 28/46/108 ms
PC2#ping 202.100.100.100 r 10
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.!!!!!!!!!
Success rate is 90 percent (9/10), round-trip min/avg/max= 28/55/80 ms
PC3#ping 202.100.100.100 r 10
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!!!!!!
Success rate is 100 percent (10/10), round-trip min/avg/max= 40/154/1056 ms
R1#debug ip nat //可见三台主机可以同时访问外网,并且只用了公网ip地址池中的其中一个IP
IP NAT debugging is on
*Mar 100:13:27.883: NAT*: s=202.100.100.100, d=202.100.100.80->192.168.0.101[ 9]
*Mar 100:13:27.887: NAT*: ICMP id=0->1
*Mar 100:13:27.887: NAT*: s=192.168.0.102->202.100.100.80, d=202.100.100.100[ 1]
*Mar 100:13:27.895: NAT*: ICMP id=2->0
*Mar 100:13:27.895: NAT*: s=202.100.100.100, d=202.100.100.80->192.168.0.103[ 1]
*Mar 100:13:27.903: NAT*: ICMP id=1->0
*Mar 100:13:27.903: NAT*: s=202.100.100.100, d=202.100.100.80->192.168.0.102[ 1]
*Mar 100:13:27.911: NAT*: ICMP id=0->2
*Mar 100:13:27.911: NAT*: s=192.168.0.103->202.100.100.80, d=202.100.100.100 [
R1#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
icmp 202.100.100.80:1 192.168.0.101:1 202.100.100.100:1 202.100.100.100:1
icmp 202.100.100.80:0 192.168.0.102:1 202.100.100.100:1 202.100.100.100:0
icmp 202.100.100.80:2 192.168.0.103:1 202.100.100.100:1 202.100.100.100:2
实验五、网络地址端口转换(NAPT)
PC1配置:
PC#conf t
PC(config)#no ip routing
PC(config)#ip default-gateway 192.168.0.1
PC(config)#int fa0/0
PC(config-if)#ip add 192.168.0.100 255.255.255.0
PC(config-if)#no sh
PC(config-if)#exit
Server配置:
Server#conf t
Server(config)#no ip routing
Server(config)#ip default-gateway 192.168.0.1
Server(config)#int fa0/0
Server(config-if)#ip add 192.168.0.80 255.255.255.0
Server(config-if)#no sh
Server(config-if)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
Internet(config)#ip http server
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list standard nat //定义可以进行NAT转换的内部IP范围
R1(config-std-nacl)#permit 192.168.0.0 0.0.0.255
R1(config-std-nacl)#deny any
R1(config-std-nacl)#exit
R1(config)#ip nat inside source list nat interface fa0/1overload//开启端口多路复用让内网用户上网
R1(config)#ip nat inside source static tcp 192.168.0.8080 202.100.100.1 80//把server的web端口80放出来,跟我们的外网IP的80建立映射。
检查测试:
PC#ping 202.100.100.100 //PC可以访问外网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max= 44/130/216 ms
PC#telnet 202.100.100.1 80 //PC不可以通过外网IP访问局域网内的服务器 (注意),传说的回流问题
Trying 202.100.100.1, 80 ...
% Connection refused by remote host
Internet#telnet 202.100.100.1 80 //外网可以访问内网服务器的80
Trying 202.100.100.1, 80 ... Open
HTTP/1.1 400 Bad Request
Date: Fri, 01 Mar 2002 00:15:36 GMT
Server: cisco-IOS
Accept-Ranges: none
400 Bad Request
[Connection to 202.100.100.1 closed by foreign host]
Server#ping 202.100.100.100 //服务器可以上网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 36/108/324 ms
R1#debug ip nat
IP NAT debugging is on
*Mar 100:13:40.583: NAT: s=192.168.0.100->202.100.100.1, d=202.100.100.100 [0]
*Mar 100:13:41.559: NAT*: s=192.168.0.100->202.100.100.1, d=202.100.100.100 [1]
*Mar 100:14:43.879: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [59621]
*Mar 100:14:44.039: NAT*: s=192.168.0.80->202.100.100.1, d=202.100.100.100 [5521]
*Mar 100:14:44.299: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [59622]
*Mar 100:14:44.367: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [59623]
*Mar 100:25:08.591: NAT*: s=192.168.0.80->202.100.100.1, d=202.100.100.100 [4]
*Mar 100:25:08.611: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [4]
R1#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
icmp 202.100.100.1:1 192.168.0.80:1 202.100.100.100:1 202.100.100.100:1
tcp 202.100.100.1:80 192.168.0.80:80 202.100.100.100:35356 202.100.100.100:35356
tcp 202.100.100.1:80 192.168.0.80:80 --- ---
icmp 202.100.100.1:2 192.168.0.100:2 202.100.100.100:2 202.100.100.100:2
R1#sh access-lists
Standard IP access list nat
10 permit192.168.0.0, wildcard bits 0.0.0.255 (6 matches)
20 deny any 20 deny any
实验六、区域无关NAT(Domainless NAT)(推荐使用)
PC配置:
PC#conf t
PC(config)#no ip routing
PC(config)#ip default-gateway 192.168.0.1
PC(config)#int fa0/0
PC(config-if)#ip add 192.168.0.100 255.255.255.0
PC(config-if)#no sh
PC(config-if)#exit
Server配置:
Server#conf t
Server(config)#no ip routing
Server(config)#ip default-gateway 192.168.0.1
Server(config)#int fa0/0
Server(config-if)#ip add 192.168.0.80 255.255.255.0
Server(config-if)#no sh
Server(config-if)#exit
Server(config)#ip http server
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat enable //开启nat支持,注意没有区域之分
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat enable //开启nat支持,注意没有区域之分
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list standard Internet
R1(config-std-nacl)#10 permit 192.168.0.0 0.0.0.255
R1(config-std-nacl)#20 deny any
R1(config-std-nacl)#exit
R1(config)#ip nat source list Internet int fa0/1 overload//注意没有区域之分
R1(config)#ip nat source static tcp 192.168.0.80 80202.100.100.1 80//注意没有区域之分
检查测试:
PC#ping 202.100.100.100 //PC可以上网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 88/120/192 ms
Server#ping 202.100.100.100 //Server可以上网
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 202.100.100.100,timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 80/310/1160 ms
Internet#telnet 202.100.100.1 80 //外网可以访问Server的80服务
Trying 202.100.100.1, 80 ... Open
HTTP/1.1 400 Bad Request
Date: Fri, 01 Mar 2002 00:21:03 GMT
Server: cisco-IOS
Accept-Ranges: none
400 Bad Request
[Connection to 202.100.100.1 closed by foreign host]
PC#telnet 202.100.100.1 80 //PC可以通过外网IP访问Server的80服务
Trying 202.100.100.1, 80 ... Open
HTTP/1.1 400 Bad Request
Date: Fri, 01 Mar 2002 00:26:32 GMT
Server: cisco-IOS
Accept-Ranges: none
400 Bad Request
[Connection to 202.100.100.1 closed by foreign host]
R1#debug ip nat //调试NAT
*Mar 100:19:15.107: NAT*: s=192.168.0.100->202.100.100.1, d=202.100.100.100 [19]
*Mar 100:19:15.211: NAT: s=202.100.100.100, d=202.100.100.1->192.168.0.100 [19]
*Mar 100:19:32.875: NAT*: s=192.168.0.80->202.100.100.1, d=202.100.100.100 [0]
*Mar 100:19:32.963: NAT: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [0]
*Mar 100:20:19.479: NAT: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [11992]
*Mar 100:20:19.595: NAT*: s=192.168.0.80->202.100.100.1, d=202.100.100.100 [4167]
*Mar 100:20:19.659: NAT: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [11993]
*Mar 100:20:19.667: NAT: s=202.100.100.100, d=202.100.100.1->192.168.0.80 [11994]
*Mar 100:22:25.551: NAT: s=192.168.0.100->202.100.100.1, d=202.100.100.1 [2180]
*Mar 100:22:25.555: NAT: s=202.100.100.1, d=202.100.100.1->192.168.0.80 [2180]
*Mar 100:22:25.663: NAT: s=192.168.0.80->202.100.100.1, d=202.100.100.1 [908]
*Mar 100:22:25.667: NAT: s=202.100.100.1, d=202.100.100.1->192.168.0.100 [908]
R1#sh ip nat nvi translations //查看NVI转换
Pro Source global Source local Destin local Destin global
icmp 202.100.100.1:1 192.168.0.80:1 202.100.100.100:1 202.100.100.100:1
tcp 202.100.100.1:80 192.168.0.80:80 --- ---
icmp 202.100.100.1:4 192.168.0.100:4 202.100.100.100:4 202.100.100.100:4
tcp 202.100.100.1:40023 192.168.0.100:40023 202.100.100.1:80192.168.0.80:80
tcp 202.100.100.100:63747 202.100.100.100:63747202.100.100.1:80 192.168.0.80:80
R1#sh access-lists //查看ACL
Standard IP access list Internet
10 permit192.168.0.0, wildcard bits 0.0.0.255 (8 matches)
20 deny any (2 matches)
ip nat inside source 数据包由inside 接口outside接口发包时,是先路由再NAT转换;而数据包由outside 接口向inside接口发包时是先NAT转换再路由,数据包的发送方向不同,则处理过程也不同
ip nat source做NAT转换时,在需要NAT转换接口上使用的命令为ip nat enable,数据包在由一个接口向另一个接口发包时,顺序是先路由再NAT然后再路由(第一个路由只是匹配一下路由,而没有真正的路由行为,第二个路由则是真实的路由行为),不管数据包从哪个接口发向哪个接口,处理过程都是一样的。
实验七、NAT解决网络地址重叠
PC1配置:
PC1#conf t
PC1(config)#no ip routing
PC1(config)#ip default-gateway 192.168.0.1
PC1(config)#int fa0/0
PC1(config-if)#ip add 192.168.0.101 255.255.255.0
PC1(config-if)#no sh
PC1(config-if)#exit
PC2配置:
PC2#conf t
PC2(config)#no ip routing
PC2(config)#ip default-gateway 192.168.0.1
PC2(config)#int fa0/0
PC2(config-if)#ip add 192.168.0.101 255.255.255.0
PC2(config-if)#no sh
PC2(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.1 255.255.255.0
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip route 172.168.20.0 255.255.255.0202.100.100.2 //注意添加去往对端内部全局地址路由
R1(config)#ip nat inside source static 192.168.0.101172.168.10.101
R2配置:
R2#conf t
R2(config)#int fa0/0
R2(config-if)#ip add 192.168.0.1 255.255.255.0
R2(config-if)#ip nat inside
R2(config-if)#no sh
R2(config-if)#exit
R2(config)#int fa0/1
R2(config-if)#ip add 202.100.100.2 255.255.255.0
R2(config-if)#ip nat outside
R2(config-if)#no sh
R2(config-if)#exit
R2(config)#ip route 172.168.10.0 255.255.255.0 202.100.100.1//注意添加去往对端内部全局地址路由
R2(config)#ip nat inside source static 192.168.0.101 172.168.20.101
检查测试:
PC1#ping 172.168.20.101
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.168.20.101, timeoutis 2 seconds:
..!!!
Success rate is 60 percent (3/5), round-trip min/avg/max= 40/40/40 ms
PC2#ping 172.168.10.101
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.168.10.101, timeoutis 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max= 40/258/1100 ms
R1#debug ip nat
IP NAT debugging is on
*Mar 100:14:49.599: NAT*: s=192.168.0.101->172.168.10.101, d=172.168.20.101 [1]
*Mar 100:14:51.103: NAT*: s=172.168.20.101, d=172.168.10.101->192.168.0.101 [0]
*Mar 100:14:51.151: NAT*: s=192.168.0.101->172.168.10.101, d=172.168.20.101 [0]
*Mar 100:14:51.203: NAT*: s=172.168.20.101, d=172.168.10.101->192.168.0.101 [1]
R2#debug ip nat
IP NAT debugging is on
*Mar 100:14:48.267: NAT*: s=172.168.10.101, d=172.168.20.101->192.168.0.101 [1]
*Mar 100:14:49.723: NAT*: s=192.168.0.101->172.168.20.101, d=172.168.10.101 [0]
*Mar 100:14:49.795: NAT*: s=172.168.10.101, d=172.168.20.101->192.168.0.101 [0]
*Mar 100:14:49.843: NAT*: s=192.168.0.101->172.168.20.101, d=172.168.10.101 [1]
R1#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
icmp 172.168.10.101:1 192.168.0.101:1 172.168.20.101:1 172.168.20.101:1
--- 172.168.10.101 192.168.0.101 --- ---
R2#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
icmp 172.168.20.101:1 192.168.0.101:1 172.168.10.101:1 172.168.10.101:1
--- 172.168.20.101 192.168.0.101 --- ---
实验八、NAT的Extendable参数使用
Server配置:
Server#conf t
Server(config)#noip routing
Server(config)#ipdefault-gateway 192.168.0.1
Server(config)#intfa0/0
Server(config-if)#ipadd 192.168.0.80 255.255.255.0
Server(config-if)#nosh
Server(config-if)#exit
Server(config)#usernamecisco password cisco
Server(config)#linevty 0 4
Server(config-line)#loginlocal
Server(config-line)#end
ISP1配置:
ISP1#conf t
ISP1(config)#intfa0/0
ISP1(config-if)#ipadd 11.11.11.11 255.255.255.0
ISP1(config-if)#nosh
ISP1(config-if)#exit
ISP2配置
ISP2#conf t
ISP2(config)#intfa0/0
ISP2(config-if)#ipadd 22.22.22.22 255.255.255.0
ISP2(config-if)#nosh
ISP2(config-if)#exit
R1配置:
R1#conf t
R1(config)#intfa0/0
R1(config-if)#ipadd 192.168.0.1 255.255.255.0
R1(config-if)#ipnat inside
R1(config-if)#nosh
R1(config-if)#exit
R1(config)#intfa0/1
R1(config-if)#ipadd 11.11.11.1 255.255.255.0
R1(config-if)#ipnat outside
R1(config-if)#nosh
R1(config-if)#exit
R1(config)#intfa1/0
R1(config-if)#ipadd 22.22.22.1 255.255.255.0
R1(config-if)#ipnat outside
R1(config-if)#nosh
R1(config-if)#exit
R1(config)# ip nat inside sourcestatic tcp 192.168.0.80 23 11.11.11.80 23 extendable
R1(config)# ip nat inside sourcestatic tcp 192.168.0.80 23 22.22.22.80 23 extendable
检查测试:
ISP1#telnet11.11.11.80
Trying11.11.11.80 ... Open
User AccessVerification
Username: cisco
Password:
Server>
ISP2#telnet22.22.22.80
Trying22.22.22.80 ... Open
User AccessVerification
Username: cisco
Password:
Server>
R1#debug ip nat
*Mar 1 01:28:56.271: NAT*: s=11.11.11.11,d=11.11.11.80->192.168.0.80 [33886]
*Mar 1 01:28:56.311: NAT*:s=192.168.0.80->11.11.11.80, d=11.11.11.11 [2465]
*Mar 1 01:28:56.379: NAT*: s=11.11.11.11,d=11.11.11.80->192.168.0.80 [33887]
*Mar 1 01:28:56.471: NAT*: s=11.11.11.11,d=11.11.11.80->192.168.0.80 [33888]
*Mar 1 01:29:26.407: NAT*: s=22.22.22.22,d=22.22.22.80->192.168.0.80 [44393]
*Mar 1 01:29:26.491: NAT*:s=192.168.0.80->22.22.22.80, d=22.22.22.22 [36105]
*Mar 1 01:29:26.547: NAT*: s=22.22.22.22,d=22.22.22.80->192.168.0.80 [44394]
*Mar 1 01:29:26.587: NAT*: s=22.22.22.22,d=22.22.22.80->192.168.0.80 [44395]
R1#sh ip nattranslations
Pro Insideglobal Inside local Outside local Outside global
tcp11.11.11.80:23 192.168.0.80:23 11.11.11.11:14462 11.11.11.11:14462
tcp22.22.22.80:23 192.168.0.80:23 22.22.22.22:62983 22.22.22.22:62983
tcp11.11.11.80:23 192.168.0.80:23 --- ---
tcp22.22.22.80:23 192.168.0.80:23 --- ---
用户可以使用Extendable参数配置多个静态转换,其中每一个转换都可以使用用相同的本地或全局地址转换。
Server1配置:
Server1#conf t
Server1(config)#no ip routing
Server1(config)#ip default-gateway 192.168.0.1
Server1(config)#int fa0/0
Server1(config-if)#ip add 192.168.0.101 255.255.255.0
Server1(config-if)#no sh
Server1(config-if)#exit
Server1(config)#line vty 0 4
Server1(config-line)#password cisco
Server1(config-line)#login
Server1(config-line)#exit
Server2配置:
Server2#conf t
Server2(config)#no ip routing
Server2(config)#ip default-gateway 192.168.0.1
Server2(config)#int fa0/0
Server2(config-if)#ip add 192.168.0.102 255.255.255.0
Server2(config-if)#no sh
Server2(config-if)#exit
Server2(config)#line vty 0 4
Server2(config-line)#password cisco
Server2(config-line)#login
Server2(config-line)#exit
Server3配置:
Server3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Server3(config)#no ip routing
Server3(config)#ip default-gateway 192.168.0.1
Server3(config)#int fa0/0
Server3(config-if)#ip add 192.168.0.103 255.255.255.0
Server3(config-if)#no sh
Server3(config-if)#exit
Server3(config)#line vty 0 4
Server3(config-line)#password cisco
Server3(config-line)#login
Server3(config-line)#exit
Internet配置:
Internet#conf t
Internet(config)#int fa0/0
Internet(config-if)#ip add 202.100.100.100 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#exit
R1配置:
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip add 192.168.0.1 255.255.255.0
R1(config-if)#ip nat inside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#int fa0/1
R1(config-if)#ip add 202.100.100.80 255.255.255.0 //主ip
R1(config-if)#ip add 202.100.100.1 255.255.255.0 secondary//副ip
R1(config-if)#ip nat outside
R1(config-if)#no sh
R1(config-if)#exit
R1(config)#ip access-list extended VIP //标识用来转换的公网IP
R1(config-ext-nacl)#permit ip any host 202.100.100.1
R1(config-ext-nacl)#deny ip any any
R1(config-ext-nacl)#exit
R1(config)#ip nat poolserverfarm 192.168.0.101 192.168.0.103 netmask 255.255.255.0 type rotary//定义NAT地址池来标识内部服务器的本地地址,注意要用到关键字rotary,表明我们要使用轮循的方式从NAT地址池中取出相应IP地址来转换合法IP报文。最后,把目标地址为访问表中IP的报文转换成地址池中定义的IP地址。
R1(config)#ip nat inside destination list VIP poolserverfarm
检查测试:
Internet#telnet 202.100.100.1 //第一次telnet 进入server3
Trying 202.100.100.1 ... Open
User Access Verification
Password:
Server3>q
[Connection to 202.100.100.1 closed by foreign host]
Internet#telnet 202.100.100.1 //第二次telnet进入server2
Trying 202.100.100.1 ... Open
User Access Verification
Password:
Server1>q
[Connection to 202.100.100.1 closed by foreign host]
Internet#telnet 202.100.100.1//第三次telnet进入server1
Trying 202.100.100.1 ... Open
User Access Verification
Password:
Server2>q
[Connection to 202.100.100.1 closed by foreign host]
R1#debug ip nat
*Mar 101:05:35.271: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.103[32504]
*Mar 101:05:35.303: NAT*: s=192.168.0.103->202.100.100.1, d=202.100.100.100[62175]
*Mar 101:05:36.047: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.101 [60711]
*Mar 101:05:36.147: NAT*: s=192.168.0.101->202.100.100.1, d=202.100.100.100[26348]
*Mar 101:06:42.691: NAT*: s=202.100.100.100, d=202.100.100.1->192.168.0.102 [6985]
*Mar 101:06:42.751: NAT*: s=192.168.0.102->202.100.100.1, d=202.100.100.100 [35992]
R1#sh ip nat translations
Pro Inside global Inside local Outsidelocal Outside global
tcp 202.100.100.1:23 192.168.0.101:23 202.100.100.100:61090 202.100.100.100:61090
tcp 202.100.100.1:23 192.168.0.102:23 202.100.100.100:47549 202.100.100.100:47549
tcp 202.100.100.1:23 192.168.0.103:23 202.100.100.100:61337 202.100.100.100:61337
R1#sh access-list
Extended IP access list VIP
10 permit ip any host 202.100.100.1 (26 matches)
20 deny ip any any
通过目的地址循环轮询转换实现服务器的TCP负载均衡,可以把一个虚拟主机映射到多个真实的主机(如Web服务器)上。虚拟主上每次发起的新TCP会话将与一个不同的真实主机进行。通过NAT,你可以在你的内部网络建立多个真实主机,以分担众多用户对一个虚拟主机访问的负荷。每次从外部网络发起的新会话所对应的真实主机的循环是通过对目的地址以地址池的方式进行轮回转换实现的。它是一种反向NAT转换,是对目的地址的转换,而不是对源地址的转换. TCP负载转换原理
a.外部网络用户主机发起与虚拟主机(内部全局地址)的连接。此时数据包中的源地址为外部本地地址,目的地址为虚拟主机地址。
b.当路由器接收到连接请求数据包时,创建一个内部网络中真实主机(如1.1.1.1)进行关联的新的NAT转换条目。
c.NAT路由器把连接请求的数据包中的目的地址用真实主机的本地地址进行替换(源地址不变),然后继续发送连接请求数据包。
d.内部网络中真实主机1.1.1.1接收到这个连接请求数据包,并发出一个应答数据包。应答数据包中的源地址是内部真实主机本地地址(1.1.1.1),目的地址为外部网络主机的IP地址
e.当NAT路由器接收到这个应答数据包后,使用内部本地地址和端口号,以及外部地址和端口号作为关键字在NAT表中进行查找。找到后把应答包中的源地址转换成虚拟主机地址(内部全局地址)进行替换(目的地址不变),继续转发应答数据包。直接外部网络用户收到应答数据包。
f.之后的转换过程就是不断重复,但每一次转换时虚拟主机所对应的内部主机本地地址不再是1.1.1.1,可能是1.1.1.2,或者1.1.1.3。这是一个动态NAT转换,不是静态的。
注意:这种反向的NAT只支持TCP,而且这种技术不会自动检查后端的多台服务器是否在线,直接就会将数据包转发过去,如果后端服务器中的其中一台出现问题,而此时刚好NAT转换后将数据发给它,就会导致不能正确的提供服务给客户。企业不推荐使用
实验十、ServerLoad balance(NATSERVER)
Cisco IOS SLB(服务器负载分担)可以在多台服务器之间智能地为TCP/IP流量提供负载分担。它是一个基于Cisco IOS的第4层或第7层交换(实质为:服务器负载均衡)解决方案。Cisco IOS SLB 会为发出请求的客户端呈现出一个单独的虚拟服务器IP地址。举例来说,多个客户端向这个虚拟IP地址发出IP 请求,比如HTTP Get 请求。交换机会把这些请求分发(负载分担)到多台服务器上。然后交换机根据多种因素来实施负载分担,比如TCP和UDP协议、负载和其他负载分担参数。除此之外,有必要的话,交换机还会把客户端发来的请求转发给同一台服务器,比如在使用FTP时,一个客户端必须在整个回话或数据流过程中,与相同的服务器进行通信。通常情况下,客户端设备会使用DNS来解析虚拟服务器IP地址。使用Cisco IOS SLB 来提供冗余性、可扩展性和高性能(负载分担),可以获得以下好处。
通过把客户端请求分布到服务器集群中,获得了更高的性能。
服务器应用管理员的工作更为轻松。客户端只知道虚拟服务器,因此真实服务器发生变化时无需对客户端进行管理,从而使Cisco IOS SLB 具有可扩展性。
为真实服务器提供了安全保障,因为真实服务器的地址永远不需要通告给外部网络。而用户只需要知道虚拟的IP地址。管理员还可以根据IP地址和IP端口号来过滤不必要的流量。
零停运时间,易于维护,在替换物理(真实)服务器时其他服务器负责处理客户端的请求。
交换机可以检测到无法进行响应的服务器,然后不再向这些服务器转发请求,直到这些服务器可以回应交换机的测试为止。
SLB 的运作模式
分派模式(Dispatched Mode):每个真实服务器都要把虚拟服务器地址配置为环回地址或辅助IP地址。Cisco IOS SLB 会在MAC层把数据包重定向到真实服务器。由于分派模式不会对虚拟IP地址进行修改,因此真实服务器为了实现Cisco IOS SLB 必须建立二层邻接关系,或者使接入的路由器无需通过路由就可以找到所选的真实服务器。在分派模式中,SLB路由器、真实服务器地址和虚拟服务器地址不需要在同一子网中。采用分派模式时,服务器必须选择下面的一种做法,否则丢弃数据包:
1>在真实服务器上添加环回口地址,并把地址设置为虚拟服务器的IP地址
2>添加第二个IP地址为虚拟服务器的IP地址:因为SLB服务器)会把目的IP为虚拟IP的数据包分派到真实
的服务器上,在接口下增加一个“secondary”地址即可;采用这种方式时,会报“IP地址重复”
的错误,但是这不影响使用。
定向模式(Directed mode):所有的真实服务器都无需知道虚拟服务器的IP地址。Cisco IOS SLB 会对客户端和真实服务器之间交换的数据包进行转换,也就是通过NAT把虚拟服务器IP地址转换为真实服务器地址。在定向模式中,路由器会更改客户计算机发来的数据包,把目的IP地址改为真实服务器的IP地址
WWW1配置:
WWW1#conf t
WWW1(config)#noip routing
WWW1(config)#ipdefault-gateway 192.168.0.1
WWW1(config)#intfa0/0
WWW1(config-if)#ipadd 192.168.0.81 255.255.255.0
WWW1(config-if)#nosh
WWW1(config-if)#exit
WWW1(config)#iphttp server
WWW2配置:
WWW2#conf t
WWW2 (config)#noip routing
WWW2 (config)#ipdefault-gateway 192.168.0.1
WWW2 (config)#intfa0/0
WWW2 (config-if)#ipadd 192.168.0.82 255.255.255.0
WWW2 (config-if)#nosh
WWW2 (config-if)#exit
WWW2 (config)#iphttp server
WWW3配置:
WWW3#conf t
WWW3 (config)#noip routing
WWW3 (config)#ipdefault-gateway 192.168.0.1
WWW3 (config)#intfa0/0
WWW3 (config-if)#ipadd 192.168.0.83 255.255.255.0
WWW3 (config-if)#nosh
WWW3 (config-if)#exit
WWW3 (config)#iphttp server
Client1配置:
Client1#conf t
Client1(config)#intfa0/0
Client1(config-if)#ipadd 200.200.200.200 255.255.255.0
Client1(config-if)#nosh
Client1(config-if)#exit
Client2配置:
Client2#conf t
Client2(config)#intfa0/0
Client2(config-if)#ipadd 200.200.200.100 255.255.255.0
Client2(config-if)#nosh
Client2(config-if)#exit
R1配置:
R1#conf t
R1(config)#intfa0/0
R1(config-if)#ipadd 192.168.0.1 255.255.255.0
R1(config-if)#nosh
R1(config-if)#exit
R1(config)#intfa0/1
R1(config-if)#ipadd 200.200.200.1 255.255.255.0
R1(config-if)#nosh
R1(config-if)#exit
R1(config)#ipslb serverfarm webserver //创建服务器组
R1(config-slb-sfarm)#natserver //开启NAT,即定向模式
R1(config-slb-sfarm)#predictorroundrobin//配置采用负载平衡的方式为轮询,即为默认方式
R1(config-slb-sfarm)#real192.168.0.81 //添加真实服务器到组中
R1(config-slb-real)#faildetect//配置检测服务器的可用状态,如果服务器发生故障,SLB将不会把流量转发到该服务器
R1(config-slb-real)#inservice//让服务器生效
R1(config-slb-real)#exit
R1(config-slb-sfarm)#real192.168.0.82
R1(config-slb-real)#faildetect
R1(config-slb-real)#inservice
R1(config-slb-real)#exit
R1(config-slb-sfarm)#real192.168.0.83
R1(config-slb-real)#faildetect
R1(config-slb-real)#inservice
R1(config-slb-real)#exit
R1(config-slb-sfarm)#exit
R1(config)#ipslb vserver VIP //创建服务器虚拟IP
R1(config-slb-vserver)#virtual200.200.200.80 tcp www//设置IP和对应服务
R1(config-slb-vserver)#serverfarmwebserver //把IP关联到服务器组
R1(config-slb-vserver)#inservice//启用虚拟服务器
R1(config-slb-vserver)#exit
检查测试:
Client1#telnet200.200.200.80 80
Trying200.200.200.80, 80 ... Open
HTTP/1.1 400 BadRequest
Date: Fri, 01Mar 2002 00:34:50 GMT
Server:cisco-IOS
Accept-Ranges:none
400 Bad Request
[Connection to200.200.200.80 closed by foreign host]
Client2#telnet200.200.200.80 80
Trying200.200.200.80, 80 ... Open
HTTP/1.1 400 BadRequest
Date: Fri, 01Mar 2002 00:50:49 GMT
Server:cisco-IOS
Accept-Ranges:none
400 Bad Request
[Connection to200.200.200.80 closed by foreign host]
R1#sh ip slbconns
vserver prot client real state nat
-------------------------------------------------------------------------------
VIP TCP 200.200.200.200:59073 192.168.0.82 ESTAB S
VIP TCP 200.200.200.100:16259 192.168.0.83 SYNCLIENT S
VIP TCP 200.200.200.100:47978 192.168.0.83 ESTAB S
R1#sh ip slbstats
Pkts via normalswitching: 156
Pkts via specialswitching: 0
ConnectionsCreated: 12
ConnectionsEstablished: 10
ConnectionsDestroyed: 9
ConnectionsReassigned: 0
ZombieCount: 0
R1#sh ip slbvservers
slb vserver prot virtual state conns
-------------------------------------------------------------------
VIP TCP 200.200.200.80:80 INSERVICE 3
R1#sh ip slbreals
real server farm weight state conns
-------------------------------------------------------------------
192.168.0.81 WEBSERVER 8 OPERATIONAL 0
192.168.0.82 WEBSERVER 8 OPERATIONAL 1
192.168.0.83 WEBSERVER 8 FAILED 1