一、原理回顾
网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
虽然NAT可以借助于某些代理服务器来实现,但考虑到运算成本和网络性能,很多时候都是在路由器上来实现的。
随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘。事实上,除了中国教育和科研计算机网(CERNET)外,一般用户几乎申请不到整段的C类IP地址。在其他ISP那里,即使是拥有几百台计算机的大型局域网用户,当他们申请IP地址时,所分配的地址也不过只有几个或十几个IP地址。显然,这样少的IP地址根本无法满足网络用户的需求,于是也就产生了NAT技术。
l.NAT简介
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。
NAT将自动修改IP报文的源IP地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成(对于ICMP,NAT也自动完成地址转换)。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据都分别嵌入IP地址的应用程序就不能正常工作。
2.NAT实现方式
NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat 和端口多路复用OverLoad。
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换
Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自interne t的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
受到NAT影响的应用程序
一些高层协议(比如FTP,Quake,SIP,VPN)是在IP包的有效数据内发送网络层(第三层)信息的。比如,主动模式的FTP使用单独的端口分别来控制命令传输和数据传输。当请求一个文件传输时,主机在发送请求的同时也通知对方自己想要在哪个端口接受数据。但是,如果主机是在一个简单的NAT防火墙后发送的请求,那么由于端口的映射将会使对方接收到的信息无效。
一个应用层网关(Application Layer Gateway或ALG)可以修正这个问题。运行在NAT防火墙设备上的ALG软件模块可以更新任何由地址转换而导致无效的信息。显然,ALG需要明白它所要修正的上层协议,所以每个有这种问题的协议都需要有一个单独的ALG。
但是,除FTP外的大多数传统的客户机-服务器协议不需要发送网络层(第三层)信息,也就不需要ALG。
这个问题的另一个可能的解决方法是使用象STUN这样的技术,但是这只针对建立在UDP上的高层协议,并且需要它内建这种技术。这种技术对对称NAT也是无效的。还有一种可能的方案是UPnP,但它需要和NAT设备配合起来使用.
工作原理
当一台小型商务企业的内部网计算机用户连接到 Internet 资源时,该用户的 TCP/IP 协议产生一个 IP 数据包,该数据包包含以下值,这些值位于 IP 和 TCP 或 UDP 标头中:(粗体内容表示受 NAT 影响的项目):
?目标 IP 地址:Internet 资源 IP 地址
?源 IP 地址:私有 IP 地址
?目标端口:Internet 资源 TCP 或 UDP 端口
?源端口: 源应用程序 TCP 或 UDP 端口
请求源主机或者其它路由器将此 IP 数据包发送给 NAT, 然后由 NAT 将向外发送的数据包的地址解析如下:
?目标IP地址:Internet 资源 IP 地址
?源IP 地址:ISP 分配的公用地址
?目标端口:Internet 资源 TCP 或 UDP 端口
?源端口:重新映射的源应用程序TCP 或 UDP 端口
NAT 将重新映射的 IP 数据包发送到 Internet 。响应计算机将向 NAT 返回一个响应。当 NAT 接收到此响应时,该数据包将包含以下地址信息:
?目标IP 地址:ISP 分配的公用地址
?源IP地址:Internet 资源 IP 地址
?目标端口:重新映射的源应用程序 TCP 或 UDP 端口
?源端口:Internet 资源的 TCP 或者 UDP 端口
当 NAT 完成映射和解析地址后,将向 Internet 客户端发送数据包,此数据包包含以下地址信息:
?目标 IP 地址:私有 IP 地址
?源 IP 地址:Internet 资源 IP 地址
?目标端口:源应用程序TCP 或者 UDP 端口
?源端口:Internet 资源 TCP 或 UDP 端口
对于向外发送的数据包,源 IP 地址和 TCP/UDP 端口号将被映射到一个公用源 IP 地址和一个可能变化的 TCP/UDP 端口号。对于接收的数据包,目标 IP 地址和 TCP/UDP 端口号将被映射到私有 IP 地址和初始 TCP/UDP 端口号。
那么,NAT转换表何时进行初始化呢,一般有三种方式:手工初始化,外发数据报时,传入名字查找。大多数NAT实现方式都使用外发数据报时初始化转换表,当内部主机通过NAT向外发送数据报时,NAT此时在转换表中创建一个表项
二、实验分析
一:拓扑图
二:使用dynamips完成实验
2:R6路由器S1/0端口ip地址:220.171.1.2 ,Fa2/0端口ip地址:192.168.1.1/24
3:模拟公网实际环境:R6实现ACL来阻止192.168.1.0网络从Fa2/0到达PC5的S1/1 4:在R6上使用NAT来实现192.168.1.0到PC5的访问
5:真实PC(ip:192.168.1.2/24 网关:192.168.1.1)
三:实验步骤
1:在R5上
Router>en
Router# configure terminal
Router(config)#hostname PC5
PC5 (config)#no ip domain-lookup /告诉Router不要对它不知道的字符串做DNS解析
PC5 (config)#line console 0
PC5 (config-line)#exec-timeout 0 0
PC5 (config-line)#logging synchronous
PC5 (config-line)#exit
PC5 (config)#no ip routing /去除路由器的路由功能来模拟成pc
PC5 (config)#interface s1/1
PC5 (config-if)#ip address 220.171.1.1 255.255.255.0 /配置ip地址
PC5 (config-if)#no shutdown
PC5 (config-if)#exit
PC5 (config)#ip default-gateway 220.171.1.2 /配置默认网关
PC5(config)#end
PC5#
2:在R6上:
使用ACL
Router>enable
Router#configure terminal
Router(config)#hostname R6
R6(config)#no ip domain-lookup
R6(config)#line console 0
R6(config-line)#exec-timeout 0 0
R6(config-line)#logging synchronous
R6(config-line)#exit
R6(config)#inter fa2/0
R6(config-if)#ip address 192.168.1.1 255.255.255.0
R6(config-if)#no shutdown
R6(config-if)#interface s1/0
R6(config-if)#ip address 220.171.1.2 255.255.255.0
R6(config-if)#no shutdown
R6(config-if)#ip access-group 1 out /加载ACL到s1/0的出口上以192.168.1.0的源包R6(config-if)#exit
R6(config)#access-list 1 deny 192.168.1.0 0.0.0.255 /标准ACL,阻止192.168.1.0来的包R6(config)#access-list 1 permit any /标准ACL,允许任何来包
R6(config)#
测试:PC(IP:192.168.1.2/24 网关:192.168.1.1)ping 220.171.1.1 不通
由于ACL阻止了192.168.1.0来的包,要实现内外访问,必须使用NAT转换
A:使用静态NAT:在内部本地地址和内部全局地址之间建立一对一的映射关系
R6#
R6#conf t
R6(config)#ip nat inside source static 192.168.1.2 220.171.1.3 /配置静态nat,内部本地地址和内部全局
地址做一对一对应
R6(config)#interface fa2/0
R6(config-if)#ip nat inside /设置fa2/0接口为内部网络
R6(config-if)#interface s1/0
R6(config-if)#ip nat outside /设置s1/0网络为外部网络
R6(config-if)#end
R6#
测试:PC(IP:192.168.1.2/24 网关:192.168.1.1)ping 220.171.1.1通
B:使用动态地址转换NAT:在内部本地地址和内部全局地址之间建立动态的映射关系。这是通过指定要转换的本地地址和全局地址池,并将它们之间关联起来来实现的。路由器在需要时创建转换条目
R6#
R6#conf t
R6(config)#access-list 2 permit 192.168.1.0 0.0.0.255 /设置ACL来设置可以被NAT的流量
R6(config)#ip nat pool cisco 220.171.1.3 220.171.1.5 netmask 255.255.255.0
/设置NAT地址池220.171.1.3-5,名称为cisco
R6(config)#ip nat inside source list 2 pool cisco /设置NAT:只有符合ACL2的流量才可以被NAT,并使用地址池cisco的地址进行转换,后可以跟overload
R6(config)#interface fa2/0
R6(config-if)#ip nat inside /设置fa2/0接口为内部网络
R6(config-if)#interface s1/0
R6(config-if)#ip nat outside /设置s1/0网络为外部网络
R6(config-if)#end
R6#
测试:PC(IP:192.168.1.2/24 网关:192.168.1.1)ping 220.171.1.1通
C:使用地址重载(overload):通过转换TCP连接或UDP连接的端口号,可以节省内部全局地址池中的地址。将不同的内部本地地址映射到同一个内部全局地址,使用内部主机的tcp/upd端口号来区分它们R6#
R6#conf t
R6(config)#access-list 2 permit 192.168.1.0 0.0.0.255 /设置ACL来设置可以被NAT的流量
R6(config)#ip nat inside source list 2 interface s1/0 overload /使用接口的接口s1/0的地址220.171.1.2来做地址重载,内部pc地址使用共有的这个地址
R6(config)#interface fa2/0
R6(config-if)#ip nat inside /设置fa2/0接口为内部网络
R6(config-if)#interface s1/0
R6(config-if)#ip nat outside /设置s1/0网络为外部网络
R6(config-if)#end
R6#
测试:PC(IP:192.168.1.2/24 网关:192.168.1.1)ping 220.171.1.1通
D:实现端口映射
说明:用R4(pc4)模拟外网ip:220.171.1.2/24 网关:220.171.1.1
用R6(pc6)模拟内网ip:192.168.1.2/24 网关:192.168.1.1
Pc6开启telnet功能
目的:R5启用ACL不让内网访问外网,内外网访问用NAT端口映射
配置:
在R4上:
Router>enable
Router#conf t
Router(config)#hostname PC4
PC4 (config)#no ip domain-lookup
PC4 (config)#line console 0
PC4 (config-line)#exec-timeout 0 0
PC4 (config-line)#logging synchronous
PC4 (config-line)#exit
PC4(config)#no ip routing /去除路由器的路由功能
PC4 (config)#interface s1/1
PC4 (config-if)#ip address 220.171.1.2 255.255.255.0 /配置ip地址
PC4 (config-if)#no shutdown
PC4 (config-if)#exit
PC4 (config)#ip default-gateway 220.171.1.1 /配置默认网关
PC4(config)#end
PC4#
在R6上:
Router#conf t
Router(config)#interface s1/0
Router(config-if)#ip address 192.168.1.2 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#hostname PC6
PC6(config)#no ip rouring
PC6(config)#no ip domain-lookup
PC6(config)#ip default-gateway 192.168.1.1
PC6(config)#enable password cisco
PC6(config)#line console 0
PC6(config-line)# logging synchronous
PC6(config-line)#exec-timeout 0 0
PC6(config-line)#exit
PC6(config)#line vty o 4
PC6(config-line)#password cisco
PC6(config-line)#login
PC6(config-line)#exit
PC6(config)#exit
PC6#
在R5上:
Router>enable
Router#conf t
Router(config)#hostname R5
R5(config)#interface s1/0
R5(config-if)#ip address 220.171.1.1 255.255.255.0
R5(config-if)#no shut
R5(config-if)#interface s1/1
R5(config-if)#ip address 192.168.1.1 255.255.255.0
R5(config-if)#no shutdown
R5(config-if)#end
R5#conf t
R5(config)#no ip domain-lookup
R5(config)#line con 0
R5(config-line)#logg sy
R5(config-line)#exec-timeout 0 0
R5(config-line)#exit
R5(config)#access-list 1 deny 192.168.1.0 0.0.0.255 /建立ACL不让内外网通讯R5(config)#access-list 1 permit any
R5(config)#interface s1/0
R5(config-if)#ip access-group 1 out
R5(config-if)#end
R5#conf t
R5(config)#ip nat inside source static tcp 192.168.1.2 23 interface s1/0 23 /实现端口映射,外网用户在访问220.171.1.1的23端口,即映射到内网中的192.168.1.2的23号端口
R5(config)#interface s1/0
R5(config-if)#ip nat outside
R5(config-if)#interface s1/1
R5(config-if)#ip nat inside
R5(config-if)#end
R5#
实现测试:
在pc4上telnet 220.171.1.1,则转向到192.168.1.2的23号端口