B17【公网私网地址转换】NAT、NAPT
前言
跨区域跨网段进行网络通信依赖于IP地址,早年设定的IPv4地址未考虑到未来的联网设备数目庞大,在19世纪90年代人们就开始为了解决IPv4地址耗尽的问题提出了许多解决方案。
在整体的互联网上也是需要避免IP冲突的,因此IP地址是有限的。
1996年,互联网标准组织IETF(Internet Engineering Task Force)为了配合缓解IPv4地址耗尽的问题,在RFC1918文档中定义了专门用于私有网络的IP地址范围。
被定义的私有IP地址范围:
- 10.0.0.0 到 10.255.255.255 (10/8 前缀)
- 172.16.0.0 到 172.31.255.255 (172.16/12 前缀)
- 192.168.0.0 到 192.168.255.255 (192.168/16 前缀)
允许组织内部使用这些地址,而不需要为每个内部设备申请公网IP,这在一定程度上减少了对公网IP地址的需求,尽管效果有限。
在RFC 1918发布之前,许多组织已经在使用非注册的IP地址进行内部网络构建。
RFC 1918是在私网概念已经存在的基础上,对其进行了规范化和标准化。
这个文档的重要性不在于引入新概念,而在于为已有的实践提供了全球认可的标准,从而大大促进了私网的有效使用和互联网的整体发展,为后续的NAT技术应用奠定基础。
值得注意的是NAT的概念在1994年就已经提出(RFC 1631),当私网地址和NAT技术结合使用时,才真正开始有效地缓解IPv4地址耗尽的问题。
NAT介绍
网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程。
NAT主要用于实现内部网络(简称内网/私网,使用私有IP地址)访问外部网络(简称外网/公网,使用公有IP地址)的功能。
当私网的主机要访问外网时,通过NAT技术可以将其私网地址转换为公网地址;
实现多个私网用户共用一个公网地址来访问外部网络,这样既可保证网络互通,又节省了公网地址。
NAT技术按照原理可以分为两类:
- 基础NAT:传统的将IP数据报文中的IP地址转换为另一个IP地址,只能实现一个私网IP地址映射到一个公网IP地址。
- NAPT:增加了对TCP/UDP报文端口的转换,可以实现多个私网IP地址映射到同一个公网IP地址上。
NAT技术按照实现方式可以分为两类:
- 静态NAT:在配置时静态绑定一个IP地址/端口到另一个IP地址/端口。
- 动态NAT:类似于DHCP,在内部主机访问外部网络时,NAT自动分配IP/端口用于转换。
基本NAT
以图示拓扑为例子,R1配置了NAT,当PC1要访问服务器时:
- 其发送的报文内[ 源地址:192.168.1.1:X 目的地址:1.1.1.1:80 ]
- 路由器收到该报文,检查源地址与自身配置的NAT转换信息,假设确认要进行转换;
- 路由器转发该报文时,修改报文[ 源地址:1.1.1.2:X 目的地址:1.1.1.1:80 ]
当服务器收到报文,进行回复:
- 服务器根据收到报文的源目地址信息,回的报文[ 源地址:1.1.1.1:80 目的地址:1.1.1.2:X ]
- 路由器收到该报文,检查源地址与NAT信息,确定要进行转换;
- 路由器转发该报文时,修改报文[ 源地址:1.1.1.1:80 目的地址:192.168.1.1:X ]
IP地址后为端口号,这里的X表示PC1随机使用的一个端口号。
对于PC来说,其视角是它一直是在与服务器进行通信。
对于服务器来说,其视角是它一直在与1.1.1.2进行通信(也就是路由器)。
NAPT
以图示拓扑为例子,R1配置了NAT,当PC1要访问服务器时:
- 其发送的报文内[ 源地址:192.168.1.1:X 目的地址:1.1.1.1:80 ]
- 路由器收到该报文,检查源地址与自身配置的NAT转换信息,假设确认要进行转换;
- 路由器转发该报文时,修改报文[ 源地址:1.1.1.2:Y 目的地址:1.1.1.1:80 ]
当服务器收到报文,进行回复:
- 服务器根据收到报文的源目地址信息,回的报文[ 源地址:1.1.1.1:80 目的地址:1.1.1.2:Y ]
- 路由器收到该报文,检查源地址与NAT信息,确定要进行转换;
- 路由器转发该报文时,修改报文[ 源地址:1.1.1.1:80 目的地址:192.168.1.1:X]
IP地址后为端口号,Y表示路由器上随机使用的端口号,注意Y与X不需要相等。
在此基础上,可以出现PC2、PC3,路由器都可以给它们转换成1.1.1.2,只是使用的端口换成其他不冲突的端口号。
配置
静态NAT配置
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number,进入与外网互联的接口视图。
根据情况选择使用那种类型的NAT方案:
执行命令nat static global global-address inside host-address [ acl acl-number ] [ description description ],配置基本NAT映射关系,可选ACL匹配原则与自定义描述。
nat static protocol { tcp | udp } global global-address global-port inside host-address [ host-port ] [ acl acl-number ] [ description description ],配置NAPT映射关系,可选ACL匹配原则与自定义描述。
动态NAT配置
执行命令system-view,进入系统视图。
创建一个基本/高级ACL,用于匹配要进行地址转换的私网主机报文。
配置出接口的地址关联,用户根据实际情况选择其中一种配置方法。
配置带地址池的NAT Outbound:
执行命令nat address-group group-index start-address end-address,配置公网地址池。
执行命令interface interface-type interface-number ,进入与外网互联的接口视图。
执行命令nat outbound acl-number address-group group-index [ no-pat ],配置让匹配中ACL规则的报文,按照地址池空闲IP地址进行NAT/NAPT转换。
默认为NAPT模式,如果公网地址充足,可加配参数no-pat配置为基本NAT模式。
配置不带地址池的Easy IP:
- 执行命令interface interface-type interface-number,进入与外网互联的接口视图。
- 执行命令nat outbound acl-number,配置让匹配中ACL规则的报文,按照该接口IP地址进行NAPT转换。
案例
静态NAT
如图所示,企业内部使用192.168.1.0 /24网段进行内部通信,企业内部存在一服务器S1,ip为192.168.1.250。
当前假设企业网络的出接口ip为12.1.1.1,对端的运营商ip为12.1.1.2;
同时企业向运营商额外申请了一个公网ip:12.1.1.3,计划用做服务器的公网ip。
R1的左侧为g0/0/0接口,右侧为g0/0/1接口。
在R1上进行基础配置:
1 | <Huawei>system-view |
在R1上配置静态NAT,绑定空闲的公网ip:12.1.1.3对应私网服务器的ip:192.168.1.250
1 | [magiku]interface g0/0/1 |
这时我们在R2上ping12.1.1.3就能发现通信:
1 | [R2]ping 12.1.1.3 |
动态NAPT
继续使用前面静态案例的拓扑,R1的基础配置就不重复了。
现在假设企业额外购买了两个个公网IP:12.1.1.4与12.1.1.5,打算用作其他内网主机访问外网用的公网ip。
1 | #创建基本acl匹配所有主机 |
配置完后,使用PC1进行测试,可以发现能够访问运营商,使用的12.1.1.4的公网ip。
注意事项
使用静态NAT/NAPT的话,外网才可以主动访问内网主机。
使用动态模式的话,因为存在路由器动态创建生成映射的过程,所以外网不可以主动访问内网主机。