NAT全面解析
     ip地址是用来唯一标识资源所属的主机,每个ip地址都是全球唯一的,当初的ipv4是用32位2进制数来标识ip地址的,当时谁也没预料到ip地址会短缺的问题。网络的迅猛发展,直到当今ip地址的短缺问题是网络设计者们不可回避的问题。
     于是nat出来了,ipv6出来了,它们就是用以解决ip地址不足的问题的。ipv6用128位2进制ilai标识ip地址,据说全球的每粒沙子都可以分配到一个ip地址,想想应该是足够了,至少短期内是足够的。但是ipv6至今并没有实际的应用或普及应用,在一些实验室可能会看到ipv6的身影,原因之一就是nat应用的如此的完好,以致ipv6在短期内似乎没有应用的必要,或许等到nat不能再解决问题的时候,ipv6会拔地而起,称霸网络世界。
     什么是nat,nat到底如何解决ip地址短缺的问题?下面详细讲解下nat:
     nat(network address traslation)即网络地址转换,是为了解决IP地址不够问题而出现的一种将内部私有地址转换为外部公网IP的技术。因为IP地址短缺,因而,相关组织将IP地址分为私有地址和公有地址两中类型。私有地址,在企业内部应用,不同的企业相对独立,也就是说,这些IP是不对外公开的,各个企业都可以使用,但是企业内部必须要保持地址的唯一性,即不能重复使用某一IP。公有地址,是全球唯一的地址,在internet上不能有2个相同的IP公有地址。由于私有地址可以在不同企业内重复使用,因此说,这样做节约了IP地址,但internet内不可能用一个地址来表示2个目标主机,因此重复使用的私有IP必须隐藏起来-----不对外呈现,呈现出去的是转换后的共网IP,这样就不会有地址冲突,因为公有IP是全球唯一的。也就是说NAT为私有IP上公网提供了一种可能。否则私有IP的概念是没有意义的,那么IP地址节约了也就没有意义了。私有IP范围:10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。
    一般地,企业内部的主机用的是私有ip地址,网络的边界与互联网连接的部分才使用共有ip,而只有共有ip才能上互联网,于是问题就出现了:内部主机如何上网?"使用公有ip" 当然可以,但这是痴人说梦话,哪儿来那么多的公网ip?能否用少量的公网IP代替内部私有IP主机上网?可以!!这正是NAT的思想——NAT将内部私有IP在出网络之前转换为已经申请的公有IP,回来时再将目标改为原来的IP,NAT设备就好象起了一个代理的作用,帮助内部网络与外部通讯。NAT的思想就是这样,那么如何实现呢?
    NAT可以在路由器上和防火墙上实现:
    一,首先谈谈路由器上做NAT:
    1,nat的分类:静态NAT,非复用动态NAT,复用动态NAT(PAT)。不同类型应用与不同的场景。静态NAT,是一一对应的关系且是固定的对应关系,用在外网主动访问内部服务器。静态NAT是用手工的方式创建一个静态转换表。非复用动态NAT,也是一一对应关系,但是对应关系是动态的变化的。复用动态NAT,也叫PAT,是一对多的关系,即一个公有IP可以转换多个私有IP,用端口号区分。非复用动态NAT和PAT是有数据经过NAT设备时,再动态的创建转换表。
    2,NAT的配置:
   1)非复用动态NAT的配置——有一个公有地址池的场景:
           (1)定义里外口:
                    R(config)#int s0
                    R(config-if)#ip nat inside
                    R(config)#int s1
                    R(config-if)#ip nat outside
           (2)定义可转换的用户列表:
                    R(config)#access-list 1 permit 192.168.1.0 0.0.0.255
           (3)定义公有地址池:
                    R(config)#ip nat pool t25 开始IP 结束IP netmask 子网掩码      (注意:开始IP<结束IP)
           (4)定义如何转换(内到外基于源还是目标,外到内基于源还是目标):
                    R(config)#ip nat inside source list 1 pool t25   
   2)非复用动态NAT的配置——只有一个公有地址在接口上的场景:
           (1)定义里外口:
                    R(config)#int s0
                    R(config-if)#ip nat inside
                    R(config)#int s1
                    R(config-if)#ip nat outside
           (2)定义可转换的用户列表:
                    R(config)#access-list 1 permit 192.168.1.0 0.0.0.255
           (3)定义公有地址池:
                    R(config)#ip nat pool t25 开始IP 结束IP netmask 子网掩码     (注意:开始IP=结束IP)
           (4)定义如何转换(内到外基于源还是目标,外到内基于源还是目标):
                    R(config)#ip nat inside source list 1 pool t25  
     2)也可以以如下方法做:
           (1)定义里外口:
                    R(config)#int s0
                    R(config-if)#ip nat inside
                    R(config)#int s1
                    R(config-if)#ip nat outside
           (2)定义可转换的用户列表:
                    R(config)#access-list 1 permit 192.168.1.0 0.0.0.255
           (3)定义如何转换:
                    R(config)#ip nat inside source list 1 interface s1    (注意: pool t25 由出口代替)  
   3)复用动态NAT的配置:
           与非复用动态NAT的配置完全一样,只是在“定义如何转换”后加上一个单词:overload,如:
           (1)定义里外口:
                    R(config)#int s0
                    R(config-if)#ip nat inside
                    R(config)#int s1
                    R(config-if)#ip nat outside
           (2)定义可转换的用户列表:
                    R(config)#access-list 1 permit 192.168.1.0 0.0.0.255
           (3)定义公有地址池:
                    R(config)#ip nat pool t25 开始IP 结束IP netmask 子网掩码      (注意:开始IP<结束IP)
           (4)定义如何转换(内到外基于源还是目标,外到内基于源还是目标):
                    R(config)#ip nat inside source list 1 pool t25 overload        (注意:加了overload)
    
     4)静态NAT:
           (1)定义里外口:
                    R(config)#int s0
                    R(config-if)#ip nat inside
                    R(config)#int s1
                    R(config-if)#ip nat outside
           (2)定义静态映射关系:
                    R(config)#ip nat inside source static tcp 私有IP 80 公有IP 80
     3,使用场景说明:内网访问外网时,一般使用PAT而不是非复用动态NAT,因为只有PAT才会实现节约公有IP的作用,因为PAT一个公有IP可以对应多个私有IP。而内部提供对外服务场景中则使用静态NAT,因为服务器不会主动发起连接,所以不会激发路由器产生一个转发表,所以必须用静态NAT进行手工创建。
     二,上面讲了在路由器上做NAT,下面再谈谈在防火墙上做NAT:
     其实在大型企业里一般都用防火墙做NAT。因为防火墙的拿权特性更高,能做的NAT类型更灵活。原理相同,配置命令不同。
          1,nat的分类:静态nat,动态NAT ,PAT ,策略nat ,一致性nat,排除nat。前面3个上面已经讲过。策略nat其实就是ACL+NAT,一致性nat就是把源IP转换为自己,就相当没转换,但有抓换表的存在。排除nat,就是将其排除在nat之外,是真正的不转换。
          2,nat的配置:
             1)静态nat:
              pix(config)#static (inside,outside) tcp 200.1.1.5 ftp 192.168.1.5 ftp netmask 255.255.255.255
              pix(config)#static (inside,outside) tcp 200.1.1.5 http 192.168.1.5 http netmask 255.255.255.255
              pix(config)#static (inside,outside) tcp 200.1.1.5 smtp 192.168.1.5 smtp netmask 255.255.255.255
             2)动态nat:
                    (1)定义要转换的IP:
                         pix(config)#nat (inside) 1 192.168.2.0 255.255.255.0
                    (2)定义地址池:
                         pix(config)#global (outside) 1 200.1.1.5-200.1.1.100
             3)PAT:
                    (1)定义要转换的IP:
                         pix(config)#nat (inside) 1 192.168.2.0 255.255.255.0
                    (2)定义公有地址:
                         pix(config)#global (outside) 1 200.1.1.5 netmask 255.255.255.255
                      或 pix(config)#global (outside) 1 interface
                    (3)定义公有地址:(可选)  
                         pix(config)#global (outside) 1 200.1.1.6 netmask 255.255.255.255
            4)策略nat:(基于不同应用)
                    (1)定义要转换的源IP的的不同流量:
                          pix(config)#access-list wu permit tcp 192.168.2.0 255.255.255.0 10.1.1.1 255.255.255.255 eq 80
                          pix(config)#access-list lu permit tcp 192.168.2.0 255.255.255.0 10.1.1.1 255.255.255.255 eq 23
                    (2)调用ACL定义要转换的IP:
                          pix(config)#nat (inside) 1 access-list wu
                          pix(config)#nat (inside) 2 access-list lu
                    (3)定义公有IP:
                          pix(config)#globle (outside) 1 200.1.1.5
                          pix(config)#globle (outside) 2 200.1.1.6
            5)策略nat:(基于不同目标主机)
                    (1)定义要转换的源IP的的不同流量:
                          pix(config)#access-list wu permit ip 192.168.2.0 255.255.255.0 10.1.1.1 255.255.255.255
                          pix(config)#access-list lu permit ip 192.168.2.0 255.255.255.0 10.1.1.2 255.255.255.255
                    (2)调用ACL定义要转换的IP:
                          pix(config)#nat (inside) 1 access-list wu
                          pix(config)#nat (inside) 2 access-list lu
                    (3)定义公有IP:
                          pix(config)#globle (outside) 1 200.1.1.5
                          pix(config)#globle (outside) 2 200.1.1.6
             6)策略nat:(基于静态)
                    (1)定义要转换的源IP的的不同流量:
                          pix(config)#access-list wu permit ip 192.168.2.0 255.255.255.0 10.1.1.1 255.255.255.255
                    (2)调用ACL定义静态映射:
                          pix(config)#static(inside,outside) 200.1.1.5 access-list wu
                  
              7)一致性nat: 
                          pix(config)#nat (inside)  0 192.168.2.0 255.255.255.0
              8)排除nat:
                     (1)定义要排除的流量:
                          pix(config)#access-list wu permit ip 192.168.2.0 255.255.255.0 10.1.1.1 255.255.255.255
                          pix(config)#access-list wu permit ip 192.168.2.0 255.255.255.0 10.1.1.2 255.255.255.255
                     (2)执行排除任务: 
                          pix(config)#nat (inside) 0 access-list wu
           3,当使用nat-control时,其实inside--dmz(dmz私有IP时用:排除或一致性),dmz--outsode(下载补丁)也可以要用nat。
       
        总的来说nat有如下优点:1缓解了IP地址的不足问题。2对外部隐藏了内网——安全性。也有缺点:每个数据包查nat表,导致了延迟。无法实现端到端的跟踪,一些引用回受到限制。但优点还是大于缺点