NAT
(仅作为个人笔记,如有雷同,请联系删除。。)
https://baike.baidu.com/item/nat/320024?fr=aladdin
NAT(Network Address Translation),是指网络地址转换
当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
另外,这种通过使用少量的全球IP地址(公网IP地址)代表较多的私有IP地址的方式,将有助于减缓可用的IP地址空间的枯竭。
1. 功能:NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- 宽带分享:这是 NAT 主机的最大功能。
- 安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC 。
2. 实现方式:
- 静态转换[Static Nat]:将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
- 动态转换[Dynamic Nat]:将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
- 端口多路复用[OverLoad]:改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation)/ NAPT(Network Address Port Translation).采用端口多路复用方式,“多对一”的NAT。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,网络中应用最多的就是端口多路复用方式。
主要优势在于,能够使用一个全球有效IP地址获得通用性。主要缺点在于其通信仅限于TCP或UDP。
3. 工作原理:
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。
NAT将自动修改IP报文的源IP地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据部分嵌入IP地址的应用程序就不能正常工作。
- 如右图1这个 client(终端) 的 gateway (网关)设定为 NAT 主机,所以当要连上 Internet 的时候,该封包就会被送到 NAT 主机,这个时候的封包 Header 之 source IP(源IP) 为 192.168.1.100 ;
- 而透过这个 NAT 主机,它会将 client 的对外联机封包的 source IP ( 192.168.1.100 ) 伪装成 ppp0 ( 假设为拨接情况 )这个接口所具有的公共 IP ,因为是公共 IP 了,所以这个封包就可以连上 Internet 了,同时 NAT 主机并且会记忆这个联机的封包是由哪一个 ( 192.168.1.100 ) client 端传送来的;
- 由 Internet 传送回来的封包,当然由 NAT主机来接收了,这个时候, NAT 主机会去查询原本记录的路由信息,并将目标 IP 由 ppp0 上面的公共 IP 改回原来的 192.168.1.100 ;
- 最后则由 NAT 主机将该封包传送给原先发送封包的 Client。
4. 配置方式:
在配置NAT(网络地址转换)之前,首先需要了解内部本地地址和内部全局地址的分配情况。根据不同的需求,执行以下不同的配置任务:
-
内部源地址静态NAT配置:
命令 作用 # ip nat inside source static 内部本地地址 外部合法地址 [permit-inside] [vrf vrf__name_] 定义内部源地址静态转换关系 # interface interface-type interface-number 进入接口配置模式 # ip nat inside 定义该接口连接内部网络 # interface interface-type interface-number 进入接口配置模式 # ip nat outside 定义该接口连接外部网络 interface serial 0 ip address 61.159.62.129 255.255.255.248 ip nat outside // 设置外部端口 interface ethernet 0 ip address 192.168.0.1 255.255.255.0 ip nat inside // 设置内部端口 ip nat inside source static 192.168.0.2 61.159.62.130 //将内部网络地址192.168.0.2转换为合法地址61.159.62.130 ip nat inside source static 192.168.0.3 61.159.62.131 //将内部网络地址192.168.0.3转换为合法地址61.159.62.131
-
内部源地址动态NAT配置:建立内部本地地址和内部全局地址池的临时映射关系,过一段时间没有用就会删除映射关系。
需要注意的是:访问列表的定义,使得只在列表中许可的源地址才可以被转换,必须注意访问列表最后一个规则是否定全部。访问列表不能定义太宽,要尽量准确,否则将出现不可预知的结果。命令 作用 # ip nat pool address-pool start-address end-address{netmask mask / prefix-length prefix-length} 定义全局IP地址池 # access-list access-list-number permit ip-address wildcard 定义访问列表,只有匹配该列表的地址才转换 # ip nat inside source list access-list-number pool address-pool [vrf vrf_name] 定义内部源地址动态转换关系 # interface interface-type interface-number 进入接口配置模式 # ip nat inside 定义接口连接内部网络 # interface interface-type interface-number 进入接口配置模式 # ip nat outside 定义接口连接外部网络 interface serial 0 // 进入串行端口serial 0 ip address 61.159.62.129 255.255.255.192 // 将其IP地址指定为61.159.62.129,子网掩码为255.255.255.192 ip nat outside // 将串行口serial 0设置为外网端口--->【注意,可以定义多个外部端口】 interface ethernet 0 // 进入以太网端口Ethernet 0 ip address 172.16.100.1 255.255.255.0 // 将其IP地址指定为172.16.100.1,子网掩码为255.255.255.0 ip nat inside // 将Ethernet 0 设置为内网端口--->【注意,可以定义多个内部端口。】 ip nat pool chinanet 61.159.62.130 61.159.62.190 netmask 255.255.255.192 // 定义合法IP地址池:指明地址缓冲池的名称为chinanet,IP地址范围为61.159.62.130~61.159.62.190,子网掩码为255.255.255.192。需要注意的是,即使掩码为255.255.255.0,也会由起始IP地址和终止IP地址对IP地址池进行限制。 # ip nat pool test 61.159.62.130 61.159.62.190 prefix-length 26 // 定义合法IP地址池 access-list 1 permit 172.16.100.0 0.0.0.255 //允许访问Internet的网段为172.16.100.0~172.16.100.255,反掩码为0.0.0.255。需要注意的是,在这里采用的是反掩码,而非子网掩码。 ip nat inside source list 1 pool chinanet // 实现网络地址转换
-
内部源地址NAPT配置:可以将多个内部本地地址映射到一个内部全局地址
- 静态NAPT:将内部网指定主机的指定端口映射到全局地址的指定端口上
命令 作用 # ip nat inside source static {UDP / TCP} local-address port global-address port [permit-inside] [vrf vrf_name] 定义内部源地址静态转换关系 # interface interface-type interface-number 进入接口配置模式 # ip nat inside 定义该接口连接内部网络 # interface interface-type interface-number 进入接口配置模式 # ip nat outside 定义接口连接外部网络 - 动态NAPT:NAPT可以使用地址池中的IP地址,也可以直接使用接口的IP地址。一般来说一个地址就可以满足一个网络的地址转换需要,一个地址最多可以提供64512个NAT地址转换。如果地址不够,地址池可以多定义几个地址。
命令 作用 # ip nat pool address-pool start-address end-address{netmask mask / prefix-length prefix-length} 定义全局IP地址池,对于NAPT,一般就定义一个IP地址 # access-list access-list-number permit ip-address wildcard 定义访问列表,只有匹配该列表的地址才转换 # ip nat inside source list access-list-number*{[pool address-pool] / [interface interface-type interface-number]} overload [vrf vrf_name] 定义源地址动态转换关系,overload有和没有是一样的效果,仅是兼容主流厂商的配置。 # interface interface-type interface-number 进入接口配置模式 # ip nat inside 定义接口连接内部网络 # interface interface-type interface-number 进入接口配置模式 # ip nat outside 定义接口连接外部网络 interface serial 0 ip address 202.99.160.1 255.255.255.252 ip nat outside // 设置外部端口 interface ethernet 0 ip address 10.100.100.1 255.255.255.0 ip nat inside // 设置内部端口 ip nat pool onlyone 202.99.160.2 202.99.160.2 netmask 255.255.255.252 // 定义合法IP地址池:指明地址缓冲池的名称为onlyone,IP地址范围为202.99.160.2,子网掩码为255.255.255.252。由于本例只有一个IP地址可用,所以,起始IP地址与终止IP地址均为202.99.160.2。如果有多个IP地址,则应当分别键入起止的IP地址。 access-list 1 permit 10.100.100.0 0.0.0.255 // 定义内部访问列表:允许访问Internetr的网段为10.100.100.0~10.100.100.255,反掩码为255.255.255.0 ip nat inside source list 1 pool onlyone overload //设置复用动态地址转换:以端口复用方式,将访问列表1中的私有IP地址转换为onlyone IP地址池中定义的合法IP地址。 // ip nat inside source list 1 interface serial 0 overload
-
重叠地址NAT配置:两个需要互联的私有网络分配了同样IP地址,或者一个私有网络和公有网络分配了同样的全局IP地址,这种情况称为地址重叠。两个重叠地址的网络主机之间是不可能通信的,因为它们相互认为对方的主机在本地网络。重叠地址NAT就是专门针对重叠地址网络之间通信的问题,配置了重叠地址NAT,外部网络主机地址在内部网络表现为另一个网络主机地址,反之一样。
重叠地址NAT配置,其实分为两个部分内容:
(1) 内部源地址转换配置,如何配置请参见上文;
(2) 外部源地址转换配置,只有与内部网络地址重叠的外部网络需要配置外部源地址转换,外部源地址转换可以采用静态NAT配置或动态NAT配置。
配置外部源地址的静态NAT:
命令 | 作用 |
---|---|
# ip nat outside source static global-address local-address* [vrf vrf_name] | 定义外部源地址静态转换关系 |
# interface interface-type interface-number | 进入接口配置模式 |
# ip nat inside | 定义该接口连接内部网络 |
# interface interface-type interface-number | 进入接口配置模式 |
# ip nat outside | 定义接口连接外部网络 |
-
TCP负载均衡:当内部网络某台主机TCP流量负载过重时,可用多台主机进行TCP业务的均衡负载。这时,可以考虑用NAT来实现TCP流量的负载均衡。NAT创建了一台虚拟主机提供TCP服务,该虚拟主机对应内部多台实际的主机,然后对目标地址进行轮询置换,达到负载分流的目的。
配置目标地址轮询转换:
命令 作用 # ip nat pool address-pool start-address end-address {netmask mask / prefix-length prefix-length} 定义IP地址池,包含所有实际主机地址 # access-list access-list-number permit ip-address wildcard 定义访问列表,只匹配虚拟主机地址。注意应该使用匹配目标IP的扩展ACL。 # ip nat inside destination list access-list-number pool address-pool [vrf vrf_name] 定义内部目标地址动态转换关系 # interface interface-type interface-number 进入接口配置模式 # ip nat inside 定义接口连接内部网络 # interface interface-type interface-number 进入接口配置模式 # ip nat outside 定义接口连接外部网络 -
配置特殊协议网关:默认情况下,特殊协议网关是全部打开的,通过命令可以关闭指定特殊协议网关。除了ftp和dns带有参数,其他每个特殊协议都只是开关命令。
命令 作用 # no ip nat translation ftp 关闭FTP特殊协议网关 # ip nat translation ftp 开启FTP特殊协议网关,默认端口21 # ip nat translation ftp 2121 开启FTP特殊协议网关,指定端口2121