网络技术:NAT 网络地址转换
NAT
网络地址转换(NAT)技术的理论部分可以看博客——网络层——NAT。NAT 的功能大致为:在局域网中组织会为内部主机分配私有地址,当内部主机发送数据包到外部网络时私有地址就会自动转换为公有 IP 地址,公有 IP 地址返回的流量的目的地址也会自动转换为内部私有地址。NAT 通常工作在末节网络的边界。
在 NAT 术语中,NAT 转换后的地址称之为全局地址,NAT 转换前的地址为本地地址。内部本地地址是需要进行 NAT 转换的主机的私有地址,外部本地地址是与 ISP 相连的路由器接口的地址,这会是个公有地址。进行 NAT 转换时,内部本地地址将会转换为内部全局地址,外部全局地址会成为目的地址。
地址类型 | 含义 |
---|---|
内部本地地址 | 转换前的内部源地址 |
外部本地地址 | 转换后的目标地址 |
内部全局地址 | 转换后的源地址 |
外部全局地址 | 转换前的外部目标地址 |
NAT 的优缺点
优点
- 允许内网使用私有地址,从而节省了 ISP 分配的公网地址;
- 增强了与公有网络连接的灵活性;
- 在内网使用私有地址,可以让公有地址的更换提供方便;
- 隐藏内网的 IP 地址的细节。
缺点
- NAT 转换有一定的时间开销,会使性能下降;
- 基于端到端的功能可能无法实现;
- 由于更改了 IP 地址,端到端的 IP 地址因此无法追踪;
- 修改了报头的值,导致数据包的完整性检查失败;
- TCP 连接可能因此中断。
NAT 的类型
静态 NAT
静态 NAT 实现本地地址和全局地址的一对一映射,这些映射由网络管理员进行配置。当配置静态 NAT 的设备向互联网发送流量时,内部本地地址会被转换为已配置的内部全局地址,内部全局地址是共有的 IPv4 地址。很显然,静态 NAT 并不能节省共有 IP 地址的使用。
例如有如图所示拓扑,可用的公网地址有 170.168.2.2、170.168.2.3、170.168.2.4,则 NAT 转换表可能是:
内部本地 IP 地址 | 内部全局 IP 地址 |
---|---|
192.168.1.21 | 170.168.2.2 |
192.168.1.22 | 170.168.2.3 |
192.168.1.23 | 170.168.2.4 |
例如主机 192.168.1.21 向外部网络发送分组,则配置了 NAT 的路由器发现分组的源 IP 地址是内部本地 IP 地址,则就将该地址转换为内部全局 IP 地址并记录在 NAT 表中,例如这里转换为 170.168.2.2。转换后分组会被转发到外部接口,当路由器收到外部主机返回的分组时,路由器会根据 NAT 表把内部全局 IP 地址转换回内部本地 IP 地址。
动态 NAT
动态 NAT 实现本地地址和全局地址之间的多对多映射,将使用公有地址池,以先到先得的原则分配地址的使用。当配置了动态 NAT 的内部设备访问外部网络时,动态 NAT 会分配 NAT 地址池中可用的 IPv4 地址。动态 NAT 的转换也会受到 IP 地址池的 IP 地址数量限制,例如内部网络有 50 个使用私有地址的设备,IP 地址池有 5 个公有地址,则只能将这 50 个私有地址映射到这 5 个公有地址上。
PAT
端口地址转换 PAT实现本地地址和全局地址之间的多对一映射,地址将通过端口号进行重载。由于端口号可以是 0 ~ 65536,所以一个公有 IP 地址可以重载 65536 次。内部本地地址进行转换时,PAT 会将唯一的源端口号添加到内部全局地址上。端口号会用来区分流量,当目的主机返回响应时,端口号会决定路由器将数据包转发到哪个设备上。
在实际情况下端口号可能会被其他会话或者应用占用,此时如果使用的端口号已经被使用了,则 PAT 会从端口号组中分配一个可用的端口号。如果已经没有可用的端口号了,PAT 会进入下一个公网地址进行转换,并且重新分配端口号。
例如有如图所示拓扑,可用的公网地址只有 170.168.2.2,则 NAT 转换表可能是:
内部本地 IP 地址 | 内部全局 IP 地址 |
---|---|
192.168.1.21:12000 | 170.168.2.2:12000 |
192.168.1.22:12000 | 170.168.2.3:12001 |
192.168.1.23:24000 | 170.168.2.4:12002 |
PAT 可以使用端口号对一个公网地址进行重载,例如主机 192.168.1.21 向外部网络发送分组,则配置了 NAT 的路由器发现分组的源 IP 地址是内部本地 IP 地址,则就将该地址转换为内部全局 IP 地址并加上一个可用的端口号记录在 NAT 表中,例如这里转换为 170.168.2.2:12000。当路由器收到外部主机返回的分组时,路由器会根据 NAT 表,根据端口号把内部全局 IP 地址转换回内部本地 IP 地址。
配置静态 NAT
静态 NAT 的配置比较简单,因为只需要将一个内部地址映射到一个外部地址就行。在配置模式使用的命令如下,local-ip 表示进行 NAT 转换的内部地址,global-ip 表示进行 NAT 转换的外部地址,这样就可以建立起地址的映射关系。
Router(config)# ip nat inside source static local-ip global-ip
接着需要将接口配置为相对于 NAT 的内部接口和外部接口,内部接口使用如下命令在接口配置模式下定义:
Router(config-if)# ip nat inside
外部接口使用如下命令在接口配置模式下定义:
Router(config-if)# ip nat outside
配置动态 NAT
动态 NAT 的配置需要先定义用于转换的地址池,并且为这个地址池命名,使用的命令如下。“pool-name” 是地址池名,“start-ip” 是第一个可用 ip,“end-ip” 是最后一个可用的 ip,这 2 个参数将表示 ip 地址的范围。netmask 关键字指示哪些地址位属于网络位。
Router(config)# ip nat pool pool-name start-ip end-ip {netmask netmask | prefix-length prefix-length}
接着需要定义一个 ACL 把需要进行 NAT 转换的流量筛选出来,使用命令如下,使用命名 ACL 也可以:
Router(config)# access-list access-list-number permit source [ source-wildcard ]
接下来要将 ACL 和 NAT 地址池进行绑定,使用的命令如下:
Router(config)# ip nat inside source list access-list-number pool pool-name
最后接着需要将接口配置为相对于 NAT 的内部接口和外部接口,内部接口使用如下命令定义:
Router(config-if)# ip nat inside
外部接口使用如下命令定义:
Router(config-if)# ip nat outside
配置 PAT
实验拓扑
思科 11.2.3.7 Lab 配置 NAT 地址池过载和 PAT 的实验拓扑如下。
地址分配表:
设备 | 接口 | IP 地址 | 子网掩码 | 默认网关 |
---|---|---|---|---|
Gateway | G0/1 | 192.168.1.1 | 255.255.255.0 | N/A |
S0/0/1 | 209.165.201.18 | 255.255.255.252 | N/A | |
ISP | S0/0/0 (DCE) | 209.165.201.17 | 255.255.255.252 | N/A |
Lo0 | 192.31.7.1 | 255.255.255.255 | N/A | |
PC-A | NIC | 192.168.1.20 | 255.255.255.0 | 192.168.1.1 |
PC-B | NIC | 192.168.1.21 | 255.255.255.0 | 192.168.1.1 |
PC-C | NIC | 192.168.1.22 | 255.255.255.0 | 192.168.1.1 |
配置并检验 NAT 地址池过载
配置 NAT 地址池过载
配置网关路由器,将来自 192.168.1.0/24 网络的 IP 地址转换为 209.165.200.224/29 范围内的六个可用地址中的一个。
首先定义与 LAN 私有 IP 地址相匹配的访问控制列表,由于要对 G0/1 接口的网段 192.168.1.0/24 做 NAT,因此定义 ACL 1 用来允许对 192.168.1.0/24 的流量能够被转换。标准 ACL 筛选流量的作用也可以从此处体现。
Gateway(config)# access-list 1 permit 192.168.1.0 0.0.0.255
定义可用的公有 IP 地址池,和动态 NAT 一样,使用的命令为 “ip nat pool pool-name start-ip end-ip { netmask netmask | prefix-length prefix-length }”。“pool-name” 是地址池名,“start-ip” 是第一个可用 ip,“end-ip” 是最后一个可用的 ip,这 2 个参数将表示 ip 地址的范围。netmask 关键字指示哪些地址位属于网络位。
Gateway(config)# ip nat pool public_access 209.165.200.225 209.165.200.230 netmask 255.255.255.248
定义从内部源列表到外部地址池的 NAT,使用 “ip nat inside source list access-list-number pool pool-name overload” 命令绑定 ACL 和地址池。注意到示例命令后面跟了个关键字 overload,该关键字表示过载,用于配置 PAT。
Gateway(config)# ip nat inside source list 1 pool public_access overload
指定接口,对接口使用 “ip nat inside” 配置内部接口,“ip nat outside” 命令配置外部接口。
Gateway(config)# interface g0/1
Gateway(config-if)# ip nat inside
Gateway(config-if)# interface s0/0/1
Gateway(config-if)# ip nat outside
检验 NAT 地址池过载
每台 PC 对 192.31.7.1 地址执行 ping 操作后,显示网关路由器上的 NAT 统计数据。
Gateway# show ip nat statistics
该命令可以显示总转换数,NAT 配置参数、地址池地址数量和已分配地址数量。
显示网关路由器上的 NAT。
Gateway# show ip nat translations
该命令可以显示活动的 NAT 转换。
命令列出了 3 个内部本地 IP 地址,分别是 192.168.1.20、192.168.1.21、192.168.1.22,列出了 1 个内部全局 IP 地址 209.165.200.225。
删除 NAT 配置
删除可用公有 IP 地址池。
Gateway(config)# no ip nat pool public_access 209.165.200.225 209.165.200.230 netmask 255.255.255.248
删除从内部源列表到外部地址池的 NAT 转换
Gateway(config)# no ip nat inside source list 1 pool public_access overload
接口定义外部地址配置并检验 PAT
使用接口定义外部地址
首先定义与 LAN 私有 IP 地址相匹配的访问控制列表,ACL 1 用来允许对 192.168.1.0/24 进行转换。标准 ACL 筛选流量的作用也可以从此处体现。
Gateway(config)# access-list 1 permit 192.168.1.0 0.0.0.255
指定接口,对接口使用 ip nat inside 和 ip nat outside 命令。
Gateway(config)# interface g0/1
Gateway(config-if)# ip nat inside
Gateway(config-if)# interface s0/0/1
Gateway(config-if)# ip nat outside
使用接口而不是地址池来定义外部地址,进而配置 PAT,将源列表与外部接口相关联。
Gateway(config)# ip nat inside source list 1 interface serial 0/0/1 overload
检验 PAT
每台 PC 对 192.31.7.1 地址执行 ping 操作后,显示网关路由器上的 NAT 统计数据。
Gateway# show ip nat statistics
显示网关路由器上的 NAT。
Gateway# show ip nat translations
命令列出了 3 个内部本地 IP 地址,分别是 192.168.1.20、192.168.1.21、192.168.1.22,列出了 1 个内部全局 IP 地址 209.165.201.18。
参考资料
《思科网络技术学院教程(第6版):路由和交换基础》,[加] Bob Vachon,[美] Allan Johnson 著,思科系统公司 译,人民邮电出版社
《CCNA 学习指南(第 7 版)》,[美] Todd Lammle 著,袁国忠 徐宏 译,人民邮电出版社