NAT alg 和 ASPF
NAT alg 和 ASPF
参考:https://handbye.cn/719.html
来源:https://www.jianshu.com/p/8a8eb36eef7d
NAT的部署已经在企业网中必不可少,当防火墙作为网络的出口或者在网络中充当安全网关时,内网用户访问外网或者外网用户访问内网的服务器都要经过NAT穿越。
由于防火墙的特殊性,出于安全的考虑,需要建立相应的安全策略。当防火墙检测到这个数据包是一个首包时,就会根据相应的安全策略进行检查,符合安全策略就给通过并生成对应的会话表项。后续数据包到达是就无须在进行安全策略的检查,直接匹配会话表进行转发,这样就大大提高了转发效率。
先上一张防火墙转发数据的流程图:

可以看到在生成会话表之前是先查NAT策略的,也就是查找玩NAT策略以后,再根据NAT生成会话表。
比如下方的会话表:
SIP VPN: public --> public 192.168.2.5:5060[1.1.1.1:2327] +-> 221.181.108.137:5060
[] 中的就是NAT过后的IP地址
通常情况下,NAT只对报文中IP头部的地址信息和TCP/UDP头部的端口信息进行转换,不关注报文载荷的信息。但是对于一些特殊的协议(如FTP协议),其报文载荷中也携带了地址或端口信息,而报文载荷中的地址或端口信息往往是由通信的双方动态协商生产的,管理员并不能为其提前配置好相应的NAT规则。如果提供NAT功能的设备不能识别并转换这些信息,将会影响到这些协议的正常使用。
下面以FTP报文为例说下为什么要启用NAT alg 或者 ASPF
FTP控制层面的连接报文,使用TCP端口号21

控制层面的TCP连接端口号是携带在头部的,是可以被NAT转换的。控制层面在有NAT的环境下是可以进行连接的。
控制层面连接完成之后,进行文件传送之前要建立数据层面的连接,这时会由client侧向server侧发送port消息,携带自己开放的数据层面连接端口号(主动模式下是这样的,FTP还有被动模式,这里就以主动模式来说)。报文如下:

问题来了,数据层面的端口号是携带在报文载荷部分的,NAT只能转换头部信息,无法转换载荷信息。在存在NAT穿越的场景下,数据连接就无法建立,这时看到的情况就是能够登陆成功,但是无法显示服务器文件列表也不能上传和下载文件。
这时就需要用到NAT alg功能来识别载荷部分的端口信息,来做对应的NAT转换。
FTP协议包括两种工作模式:主动模式和被动模式。主动模式中,FTP Server主动向FTP Client发起数据连接;被动模式中,FTP Server被动接收FTP Client发起的数据连接。无论是主动模式还是被动模式,在控制连接交互报文的载荷中,都包含用于建立数据连接的IP地址和端口号信息。
如果在FTP Client和FTP Server之间部署了NAT设备,这就要求NAT设备必须能够识别出控制连接中包含的IP地址和端口号并进行处理,否则数据连接无法成功建立,FTP协议不能正常工作。
下面以FTP协议工作在主动模式为例,介绍NAT ALG功能对FTP协议的处理过程。
如图1所示,FTP Client位于私有网络,FTP Server位于公共网络。NGFW对FTP协议的报文处理过程如下:
1.FTP Client通过源NAT地址转换后可以访问FTP Server,与FTP Server完成FTP控制连接的TCP三次握手,并交付用户名和密码信息。
2.NGFW收到FTP Client发送的PORT命令报文后,将报文载荷字段中携带的私网地址和端口替换为公网地址和新的端口,然后发送至FTP Server。
3.NGFW收到FTP Server请求建立数据连接的报文后,替换报文的目的地址和目的端口为原始的地址和端口,然后发送至FTP Client。由此保证数据连接可以成功建立,FTP协议正常工作。

NAT ALG与ASPF的关系
差异点:
开启ASPF功能的目的是识别多通道协议,并自动为其开放相应的安全策略。
开启NAT ALG功能的目的是识别多通道协议,并自动转换报文载荷中的IP地址和端口信息。
共同点:
二者使用相同的配置。开启其中一个功能,另一功能同时生效。
其实在防火墙上二者的配置命令是同一个,对于防火墙来说对二者是没区别的。因为NAT alg自动转换报文载荷中的ip地址和端口信息后,防火墙没有将其对应的安全策略放行,数据也是不能转发的。这一安全策略是基于防火墙的server-map表实现的。
关于server-map表的详解可以百度搜索serve-map表来了解一下。
=============== End
NAT alg 和 ASPF的更多相关文章
- NAT ALG原理
1 NAT ALG简介 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323.SIP等).F ...
- NAT ALG原理与应用
1 NAT ALG简介 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323.SIP等).FTP.S ...
- H3C NAT ALG
- 配置NAT回流导致外网解析到了内网IP
单位有3个域名,用量很大,2014年开始本人研究部署了Bind+DLZ +Mysql的三机智能多链路DNS,非常好用,优点是: 1.使用Mysql管理记录,配置.管理.查询方便. 2.自动判断运营商, ...
- 华为eNSP上的NAT地址转换配置
NAT是将IP数据报文报头中的IP地址转换为另一个IP地址的过程,主要用于实现内部网络(私有IP地址)访问外部网络(公有IP地址)的功能. 1.实验拓扑 地址表: 1.完成各个接口基本配置之后使用pi ...
- eNSP上NAT的配置
NAT介绍: 早在20世纪90年代初,有关RFC文档就提出了IP地址耗尽的可能性.IPv6技术的提出虽然可以从根本上解决地址短缺的问题,但是也无法立刻替换现有成熟且广泛应用的IPv4网络.既然不能 立 ...
- 华为路由器NAT基本配置命令
NAT地址转换 静态 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]nat static global 202.169.10.5 inside 172.16.1.1 ...
- 5、IMS网元
1.会话管理和路由类(call session control function,呼叫会话控制功能) (1)代理呼叫会话控制功能P-CSCF 是IMS中与用户的第一个连接点,提供”代理(proxy)“ ...
- 华为AR-111S路由器GRE协议设置
一.GRE的定义: gre(generic routing encapsulation,通用路由封装)协议是对某些网络层协议(如ip 和ipx)的数据报进行封装,使这些被封装的数据报能够在另一个网络层 ...
随机推荐
- 如何fork比特币的源码并同步更新到本地
一.首先在Github上fork比特币源码,就会在自己的项目库里创建一份比特币代码的拷贝. 打开https://github.com/bitcoin/bitcoin,点击右上角的“Fok”图标,稍 ...
- GIT问题(一)——push冲突
- Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第3节: recycler的使用和创建
Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第三节: recycler的使用和创建 这一小节开始学习recycler相关的知识, recycler是n ...
- MariaDB远程连接问题
MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...
- python的Socket网络编程 使用模板
本文给出的是TCP协议的Socket编程. 其中用了一个dbmanager数据库操作模块,这个模块是我自己定义的,可以在我的另一个文章中找到这个模块的分享.python操作mysql数据库的精美实用模 ...
- Python参数传递,既不是传值也不是传引用
面试的时候,有没有被问到Python传参是传引用还是传值这种问题?有没有听到过Python传参既不是传值也不是传引用这种说法?一个小小的参数默认值也可能让代码出现难以查找的bug? 如果你也遇到过上面 ...
- (第十周)新NABCD
项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 新的NABCD模型: Need:可以辅助教师课堂讲授食物链相关的知识.软件的界面要漂亮,操作要简单,要给出软件 ...
- vue-router组件状态刷新消失的问题
场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})跳转到主页,并在 ...
- Daily Scrum (2015/11/1)
今天晚上我们照例召开了每周末的小组例会,主要总结本周的工作和讨论下一周的工作. 首先是本周的一些主要工作: 1.进行了代码的修改和完善. 2.开始进行服务器配置和UI. 3.学习借鉴了nutch爬虫的 ...
- iOS自学-监听按钮点击、提醒框
//事件监听的问题 CGRect btn2Frame = CGRectMake(100.0, 150.0, 60.0, 44.0); //两种不同的方式创建 UIButton *btn2 = [UIB ...