大家好,我是一只“老狼”,曾经也是一名文艺青年。无奈,一入其中,深似海。仅仅一个转身,我就完成了从文艺青年到IT狗的华丽蜕变。
言归正传,今天要和大家分享的是一个真实的端口映射问题案例。我们知道经常会遇到不成功的端口映射问题。这次为了认真、系统地带领大家学习如何排查映射问题,我将引入身边的真实案例对话,一层一层地深入剖析映射问题的症结所在,希望能给大家提供一些启示和帮助。

好了,不多说,开始吧。
1.什么场景将使用端口映射-场景?
为了把问题说清楚,我们有必要提前了解一下什么场景会用到端口映射,以及几个基本概念。
首先,NAT是网络地址转换的全称。详细的概念介绍建议。简单来说就是有私网地址的主机想要和公网地址通信时需要用到的交换公网和私网地址的技术。众所周知,IPv4路由区分公网地址和私网地址,私网地址在公网没有路由。这个时候,拥有私有网络地址的主机想要和公网中的主机进行通信,那么这个技术就必不可少了。
其次,端口映射。
画
如上图所示,PC位于外部网络,服务器位于内部网络。但是,由于IP地址已经耗尽的问题,整个网络只分配了一个外部IP地址。路由器属于内部网络,用于连接外部网络。要访问内部网中的服务器,PC需要打开出口路由器上的NAPT功能,即映射web服务提供的端口。
端口映射实际上是内网服务器对外开放的一种网络地址转换。其实转换的原理是,当一个公有地址的端口被访问时,NAT设备将目的地址转换成要访问的内网服务器的地址,转发给内网服务器。内网服务器消息返回对应接口时,会根据上一个会话转换回上一个消息。
第二,丢失的映射消息
据说前几天五一假期,小王趁着疫情正常化出去散步。他晚上回来很累,早早洗了澡就睡了。结果半夜一点睡得正香的时候被一个用好机油的电话吵醒,于是有了下面的对话...
画
这时候小王已经完全困了,你就直接把苦工砍过来,拖着我一起给你做苦工就是犯罪。我脾气太暴躁了。那时候我就开始喷:你我相守。不客气你使用哪种设备?告诉我细节。
三、失落的映射信息——还原场景
原来现场是用一个EG作为出口,内部是核心的交换-汇聚-接入-服务器,中间连了一个防火墙!但是安全策略全部开放,内网的服务器直接映射接口地址。
画
好机油说这个映射配置肯定没问题。这个配置他匹配过很多次,在内网测试过服务器业务。这很正常。内部服务器也可以直接访问公网,只是无法通过公网地址成功访问内部服务器。
就是这样,不要怕油,这么容易,来吧,让我们一步一步解决!
"从公共网络ping映射的公共网络地址?"
“可以接。”
“好,连接被排除,服务器正常”
"修改映射的外部网络端口测试正常吗?"
“不!还是无法访问”
“好了,运营商端口密封问题可以消除了!”
“核心交换机便于流量统计或镜像。
把包抢过来,看看有没有防火的转换消息。
核心,看问题和防火墙。
没关系?"
“有,有消息!”
“好了,基本上防火墙问题就可以排除了。”
“现场是否有多出口环境?”
“是的。一个联通,一个电信,两个网点。”
哈哈,听到这里,小王放肆地笑了。
“问题应该找到了。是来回路径不一致造成的吗?
能否保证映射的回程数据流将从相应的接口返回?"
“你高兴得太早了,老铁。反向路径在接口下打开。这种情况应该是前后一致的吧?!"
哎哟,我去。这份自信顿时闪到了我的腰上。差点装不出来,没关系,接下来,老纸需要放大招了。
“来,帮我收集一份NAT转换的流量信息。
看着它。我们先来看看NAT。
有什么问题?
首先打开登录软件的记录会话,然后单击cli:
1.显示ip fpm模块| i流-审计
2 .显示ip fpm优先级筛选器x0 x.x.x.x 32 0.0.0.0 32
2 .显示ip fpm流量过滤器0 x.x.x.x 32 0.0.0.0 32
3.同时,EG端和服务器分别捕捉数据包。
“好的,放好,马上给你送过去。”
四、失落的映射信息——破解谜团
我们来详细解读一下收集到的信息,看看它们的作用是什么:
首先稍微解释一下,集合两个命令的功能:
1.首先显示ip fpm模块| I FLOW-AUDIT—-用于查看流量审计的业务号码。
2.show IP fpm pri filter 100 0 x . x . x 32 0 . 0 . 0 32—用于收集数据包的路由路径是否正确?

3.显示IP FPM流量过滤器0X。x . x . x32 0 . 0 . 0 . 32—用于收集包流表信息是否正常。端口转换是否做过,转换后的数据收发是否正常。
好,那我们来看看现场收集的资料:
首先我们可以看到,外网接入的终端的ip接入映射接口的ip时,包转发往返路径确实没有问题,回程的数据流从WAN3口3入,从LAN-Te0/0出也没有问题,如下图所示:
画
当外部网络触发接入时,接入目的地址和设备确实被正确转换,但是这里的数据发送和接收存在一些问题,如下:
画
以上两个测试表明EG的端口映射配置,服务器页面,EG上的数据转发都没有问题,现象有点奇怪。继续看信息:
1.在服务器端抓取数据包,您可以看到发送给服务器的普通http GET消息:
画
但是,在收到get消息后,服务器收到了rst reset连接消息,导致http连接终止。
2.当报文在EG端被捕获时,也可以看出报文正常到达EG,正常转换后转发到内网服务器:
画
从这里开始,rst消息都是终端访问服务器发送的,如果是正常的交互过程,就不会有RST消息。
抓包结果:怀疑是中间运营商设备的压制行为导致了对RST异常报文的响应。
5.丢失的映射消息-解密
为了证明是运营商干的,给了小李一个交代。小王打开电脑,访问本地电脑终端,很快抢到一个包。结果,他发现在计算机发起GET消息之后,他从映射的外部网络服务器接收到另一个RST消息!哈哈,果然就是这个问题。我赶紧给小李说明了整个过程,建议联系接线员协助调查!
抱着怀疑的态度,小李又做了一次操作:电脑模拟运营商环境,配置成外网网关地址,作为外网线路接入,但可以正常接入。至此,基本确认操作者克制了自己的行为。小李赶紧联系运营商换了一个外网地址,试了试,确实不错。他再三感谢小王,说这次不仅解决了问题,还理清了映射问题的排查思路,最后还得请小王吃个烧烤。
不及物动词案例经验总结
除了要注意配置,换端口,确认现场网络环境,很重要的一点就是要明确数据转发路径,多想想数据的走向,以及可能出现的问题。必要时结合抓包和定位分析,一步一步排查,从最基础的开始,绝不遗漏一个可能的原因。
一般故障排除思路如下:
七、背后的技术原理
1.流量表:
-EG/NPE设备底部的一个表,用于存储设备接收和转发的数据流信息。流表可以记录源和目的地址、源和目的端口、发送和接收的字节数、是否做过NAT、NAT前后IP和端口的变化等等。
-流量表是EG/NPE设备中非常重要的一个表格。数据处理时会首先使用该表中已有的数据流信息,数据转发的所有基本信息都会存储在该表中。
命令:
显示ip fpm流过滤器0 SrcAddr掩码DstAddr掩码
显示fpmflow |包含x.x.x-10.x/11.x通用
用例子解释每个字段的含义:
Pr:如果6是TCP,17是UDP;SrcAddr:发起数据包的地址,括号内的地址是NAT后的地址;DstAddr:报文的目的地址,括号内的地址是nat后的地址,SrcPort:始发报文的目的端口信息,括号内nat后的端口是Vrf:例如VRF0中只有一个VRF数据,可以忽略;SendBytes:从内网用户的角度来看,是内网用户从内网发送到EG设备的数据包的总大小,以字节为单位;RecvBytes:从内网用户的角度来看,是EG设备接收到的外网发送给这个内网IP的数据包的总大小,以字节为单位;St:流的状态应该对应于当前的协议。不同的协议有不同的含义。示例如下:例如,协议号:17 udp流
关闭0连接已关闭。
开始1连接启动状态
对方响应后的连接2状态
ESTABLISHED 3在对方响应后,从连接发起方发送消息。
如协议号:1 icmp流
关闭0连接已关闭。
开始1连接启动状态
对方响应后的CONNECTED2状态
Srcif:从哪个接口接收数据。show interface可以看到接口编号对应于该接口,如下所示。例如,在流表中,srcif对应于9。比如show interface可以看到9代表Tenggigabit以太网0/0,10.x没有这个功能。界面显示“fff”表示设备自身发送的数据,或者设备接收并处理的数据或者某个方向没有接收到的报文初始值。
= = = = = = = = = = = = tengibitethernet 0/0 = = = = = = = = = = = = = = = = = = = = = = = = = = Index:9:9 dstif:表示数据是从那个接口转发过来的;Ctrl_flag:没有实际意义。RD和调试说明:界面显示“fff”代表设备本身发送的数据,或者设备接收和处理的数据。例如:
上面红框中的流被设置为流1和流2:
流1:由设备本身发送到114.114.114.114的DNS解析消息。因为设备主动发送这个报文,所以设备认为源端口是自己,显示为“fff”
2: 10.112发送SNMP报文给EG,因为设备接收到这个报文,直接处理,设备直接处理这个数据,不需要通过任何接口转发。目的地端口显示为“fff”
对于流表上的前两个流,属于组播数据,显示为“fff”的界面也表示接收或发送。比如源接口是6,目标接口是fff,说明数据是从6号接口接收的,设备在本地接收;
private空room:-除了流表之外,EG/NPE的底层还开放了一些空room,用于存储数据流处理过程中更详细的信息,如应用识别、流控匹配等。这个空房间其实是存在的,只是对用户透明,所以被称为设备的私有空房间。private 空房间在设备中被分成若干块,每个块记录不同的数据处理内容,并通过private 空房间的ID来区分;
-在EG/NPE 10.x平台上,由于产品限制,private 空之间的ID与实际存储的数据内容不是一一对应的,需要根据版本进行区分;在EG 11.x平台上,所有private空id都是固定的。
命令:
Show IP FPM Muduleshow IP FP pri筛选器x0srcaddr掩码DstAddr掩码
示例1:查看数据路由模式
命令:show ip fp pri 1 | include x.x.x.x或show IP fpm pri filter 1 0x . x . x 32y . y . y . y 32-10 . x/11 . x是通用的,检查路由模式需要注意的字段含义如下:
Ref_ip/rpl表示数据的路由模式。比如ref_ip代表普通路由,rpl代表源入源出,pbr代表策略路由,mllb代表多链路负载均衡,dns_proxy代表转发dns代理,app_route代表应用路由等。未知表示不匹配的路由,通常是本地的或被丢弃的;Ref_ip/rpl:前面是代表出方向的正向流,后面是代表入方向的反向流,括号中的数字代表对应的代码,只是顺序。这里7代表选中路由的路由,1代表到内网的路由,比如1:ref/4:RPL/5:DNS/6:app _ route 25/3747,前面是数据出网方向的接口索引id。下面是数据流入方向的接口索引id。实际的流出和流入接口可以通过命令show ip ref adj或show ip ref route来确定。如上图所示,流出接口为Te0/1,流入接口为Gi0/0。示例2:确定路由转发路径匹配情况

命令:show ip fpm module查找对应的索引id和名称,然后使用命令show ip fpm priv xx| include x.x.x.x或show IP fpm pri filter 100 0 x . x . x 32y . y . y . y32说明:需要注意的是,这里的moduleid是动态的,以实际显示结果为准。
每个需要注意的字段的含义如下:
Ori:srcif-dif:表示从源接口接收原始数据流,并转发到目的接口;Rep:srcif-dif:表示从源接口接收回程数据流,并转发到目的接口;Up_if:退出接口
写在最后
目前,外部网络无法访问映射服务器。基本上这套“组合拳”就能解决绝大部分的映射问题。感谢好机油好烧烤,这波分享本来就结束了,但最后还是给了大家史上最全的故障排除“杀手锏”:


