当前位置: 首页 > news >正文

华为Basic NAT和NAPT实现原理

NAT是路由器的一项非常重要,且应用非常广泛的技术,但许多读者对NAT的各种实现方式的工作原理一直没有搞清楚,其实很简单。本篇先介绍两种NAT实现方式的工作原理,下篇再介绍另两种实现方式的工作原理。

6.1.2 Basic NAT实现原理

Basic NAT方式属于一对一的地址转换,但要注意它不是静态的一对一转换,而是动态的。

在这种转换方式下,在内网用户向公网发起连起请求时,请求报文中的私网IP地址就会通过事先准备好的公网IP地址池动态地建立私网IP地址与公网IP地址的NAT映射表项,并利用所映射的公网IP地址将报文中的源IP地址(也就是内网用户主机的私网IP地址)进行替换(但只转换IP地址,而不处理TCP/UDP协议的端口号,且一个公网IP地址不能同时被多个私网IP地址映射),然后再送达给外网的目的主机。而当外网主机收到请求报文后进行响应时,响应报文到达NAT设备后,又将依据前面请求报文所建立的私网IP地址与公网IP地址的映射关系反向将报文中的目的IP地址(为内部主机私网IP地址映射后的公网IP地址)替换成对应的私网IP地址,然后再送达给内部源主机。

图6-1描述了Basic NAT的基本原理,实现过程如下(需先要在Router上创建公网地址池):

(1)当内网侧Host主机要访问公网侧Server服务器时,向Router发送请求报文(即Outbound方向),此时报文中的源IP地址为Host自己的10.1.1.100,目的IP地址为Server的IP地址211.100.7.34。

(2)Router在收到来自Host主机的请求报文后,会从事先配置好的公网地址池中选取一个空闲的公网IP地址,建立与内网侧报文源IP地址间的NAT转换映射表项,包括正(Outbound)、反(Inbound)两个方向,然后依据查找正向NAT表项的结果将报文中的源IP地址转换成对应的公网IP地址后向公网侧发送。此时发送的报文的源IP地址已是转换后的公网IP地址162.105.178.65(不再是原来的Host主机IP地址10.1.1.100),目的IP地址不变,仍为Server服务器的IP地址211.100.7.34。

(3)当Server服务器收到请求报文后,需要向Router发送响应报文(即Inbound方向),此时只需要将收到的请求报文中的源IP地址和目的IP地址对调即可,即报文的源IP地址就是Server服务器自己的IP地址211.100.7.34,目的IP地址是Host主机私网IP地址转换后的公网IP地址162.105.178.65。

(4)当Router收到来自公网侧Server服务器发送的响应报文后,会根据报文中的目的IP地址查找反向NAT映射表项,并根据查找结果将报文中的目的IP地址转换成Host主机对应的私网IP地址(源地址不变)后向私网侧发送,即此时报文中的源IP地址仍是Server服务器的IP地址211.100.7.34,目的IP地址已转换成了Host主机的私网IP地址10.1.1.100。

【经验之谈】从以上Basic NAT实现原理分析可以看出,Basic NAT中的请求报文转换的仅是其中的源IP地址(目的IP地址不变),即仅需关心源IP地址;而响应报文转换的仅是其中的目的IP地址(源IP地址不变),即仅需关心目的IP地址。两个方向所转换的IP地址是相反的。

6.1.3 NAPT实现原理

由于Basic NAT这种一对一的转换方式并未实现公网地址的复用,不能有效解决IP地址短缺的问题,因此在实际应用中并不常用。而这里要介绍的NAPT可以实现并发的地址转换,允许多个内部地址映射到同一个公有地址上,因此也可以称为“多对一地址转换”或地址复用。

NAPT使用“IP地址+端口号”的形式进行转换,相当于增加了一个变量,最终可以实现使多个私网用户可共用一个公网IP地址访问外网。图6-2描述了NAPT的实现原理,具体过程如下(需先在Router上创建好公网地址池):

(1)假设先是私网侧HostA主机要访问公网侧Server服务器,向Router发送请求报文(即Outbound方向),此时报文中的源地址是HostA主机的IP地址10.1.1.100,源端口号1025。

(2)Router在收到来自HostA发来的请求报文后,从事先配置好的公网地址池中选取一对空闲的“公网IP地址:端口号”,建立与内网侧HostA主机发送的请求报文中的“源IP地址:源端口号”间的NAPT转换表项(同样包括正、反两个方向),然后依据正向NAPT表项查找结果将请求报文中的“源IP地址:源端口号”(10.1.1.100:1025)转换成对应的“公网IP地址:端口号”(162.105.178.65:16384)后向公网侧发送。即此时经过Router的NAPT转换后,发送的请求报文中的源IP地址为162.105.178.65,源端口号16384,目的IP地址和目的端口号不变。

(3)公网侧Server服务器在收到由Router转发的请求报文后,此时需要向Router发送响应报文(即Inbound方向),只需要将收到的请求报文中的源IP地址、源端口和目的IP地址、目的端口对调即可,即此时报文中的目的IP地址和目的端口号就是收到的请求报文中的源IP地址和源端口(162.105.178.65:16384)。

(4)当Router收到来自Server服务器的响应报文后,根据其中的“目的IP地址:目的端口号”查找反向NAPT表项,并依据查找结果将报文转换后向私网侧发送。此时报文中的目的IP地址和目的端口又将转换成请求报文在到达Router前的源IP地址和源端口,即(10.1.1.100:1025)。

此时,如果HostB主机也要访问公网中的Server服务器,当请求报文到达Router时,报文中的源IP地址和源端口号也将进行转换,且它仍然可以使用HostA主机原来使用过的公网IP地址,但所用的端口号一定要不同,假设由原来的(10.1.1.200:1028)转换为(162.105.178.65:16400)。Server服务器发给HostB的响应报文在Router上目的IP地址和目的端口也要经过转换,利用前面形成的NATP转换映射表进行逆向转换,即由原来的(162.105.178.65:16400)转换为(10.1.1.200:1028)。

【经验之谈】从以上NAPT实现原理分析可以看出,请求报文中转换的仅是源IP地址和源端口号(目的IP地址和目的端口号不变),即仅需关心源IP地址和源端口号;而响应报文中转换的是目的IP地址和目的端口号(源IP地址和源端口号不变),即仅需关心目的IP地址和目的端口号。不同私网主机可以转换成同一个公网IP地址,但转换后的端口号必须不一样。

以上内容摘自笔者刚刚出版上市,在各大书店全面热销的 《华为路由器学习指南》 一书:http://item.jd.com/11513567.html。本书的 配套视频课程 :http://edu.51cto.com/course/course_id-1173.html

相关文章:

  • 华为Easy IP和NAT Server实现原理
  • 实验:华为MUX VLAN配置与管理
  • 【深入理解计算机网络】“数制”视频课程-王达-专题视频课程
  • 累并快乐的2014年
  • 贺CSDN学院上线,新课程低价真情回馈
  • 【深入理解计算机网络】入门计算机网络基础视频课程(上)-王达-专题视频课程...
  • 【深入理解计算机网络】入门计算机网络基础视频课程(下)-王达-专题视频课程...
  • 【深入理解计算机网络】讲师解读计算机网络原理视频课程(上)-王达-专题视频课程...
  • 【直通华为HCNA/HCNP系列S篇1】Sx7系列交换机主要特性及选型-王达-专题视频课程...
  • 【直通华为HCNA/HCNP系列S篇2】VRP系统使用、维护与管理-王达-专题视频课程
  • 【直通华为HCNA/HCNP系列R篇3】路由器接口配置与管理-王达-专题视频课程
  • 【直通华为HCNA/HCNP系列R篇4】WAN接入配置与管理-王达-专题视频课程
  • 华为认证这么热,你不能错过的官方推荐课程
  • VTP中VLAN配置信息不同步故障排除
  • 【直通华为HCNA/HCNP系列R篇5】DHCP服务配置与管理-王达-专题视频课程
  • 【笔记】你不知道的JS读书笔记——Promise
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angular6错误 Service: No provider for Renderer2
  • CSS相对定位
  • Idea+maven+scala构建包并在spark on yarn 运行
  • IOS评论框不贴底(ios12新bug)
  • redis学习笔记(三):列表、集合、有序集合
  • 程序员最讨厌的9句话,你可有补充?
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 浮现式设计
  • 经典排序算法及其 Java 实现
  • 坑!为什么View.startAnimation不起作用?
  • 前端面试之CSS3新特性
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信开源mars源码分析1—上层samples分析
  • 写代码的正确姿势
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 源码安装memcached和php memcache扩展
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • ###C语言程序设计-----C语言学习(6)#
  • #{} 和 ${}区别
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (03)光刻——半导体电路的绘制
  • (1)虚拟机的安装与使用,linux系统安装
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)WCF的Binding模型
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET关于 跳过SSL中遇到的问题