nat网络地址转换原理及实验,网络技术NAT网络地址转换及原理
nat网络地址转换原理及实验,网络技术NAT网络地址转换及原理内部全局地址转换后的目标地址内部本地地址转换前的内部源地址外部本地地址
NAT网络地址转换(NAT)技术的理论部分可以看博客——网络层——NAT。NAT 的功能大致为:在局域网中组织会为内部主机分配私有地址,当内部主机发送数据包到外部网络时私有地址就会自动转换为公有 IP 地址,公有 IP 地址返回的流量的目的地址也会自动转换为内部私有地址。NAT 通常工作在末节网络的边界。
在 NAT 术语中,NAT 转换后的地址称之为全局地址,NAT 转换前的地址为本地地址。内部本地地址是需要进行 NAT 转换的主机的私有地址,外部本地地址是与 ISP 相连的路由器接口的地址,这会是个公有地址。进行 NAT 转换时,内部本地地址将会转换为内部全局地址,外部全局地址会成为目的地址。
地址类型 |
含义 |
内部本地地址 |
转换前的内部源地址 |
外部本地地址 |
转换后的目标地址 |
内部全局地址 |
转换后的源地址 |
外部全局地址 |
转换前的外部目标地址 |
相关视频讲解:
网络穿透,P2P,打洞的核心原理,NAT,穿透的原理:「链接」
网络穿透,NAT,打洞,了解p2p的秘密:「链接」
- 允许内网使用私有地址,从而节省了 ISP 分配的公网地址;
- 增强了与公有网络连接的灵活性;
- 在内网使用私有地址,可以让公有地址的更换提供方便;
- 隐藏内网的 IP 地址的细节。
- NAT 转换有一定的时间开销,会使性能下降;
- 基于端到端的功能可能无法实现;
- 由于更改了 IP 地址,端到端的 IP 地址因此无法追踪;
- 修改了报头的值,导致数据包的完整性检查失败;
- TCP 连接可能因此中断。
静态 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 地址。
C/C Linux后台服务器开发高级架构师学习视频 点击 正在跳转 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。免费学习地址:C/C Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
静态 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 |
配置网关路由器,将来自 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。