互联网上有很多关于NAT回流故障的分析,但大多数是模棱两可,没有从根本上给出NAT回流故障的具体原因,本文通过数据包捕获、分析数据包,结合TCP三次握手原理,详细的分析了NAT回流故障的具体原因,并给出相应的解决办法。

术语”NAT回流“,有的技术文档上又称为”NAT回环“,什么是NAT回流?举例说明或许会更加通俗易懂:

某公司有一个出口路由器连接ISP网络,在公司内部有web服务器。

公司员工在公司内部网络,使用公司网站的域名或公网IP地址(ISP的DNS服务器解析域名后,得到公司的公网IP地址),来访问公司内部的web服务器,其访问请求数据包在网络设备上的转发映射过程,就叫做”NAT回流“,如果访问请求失败,则意味着NAT回流发生故障了,这也是本文需要分析原因并加以解决的目标。

网络设备在NAT回流的过程中,将目标公网地址转换为web服务器的私有地址,然后将http访问请求数据包转发到web服务器上,这叫做”NAT映射“。

PS:

有人问,在公司内网为什么不直接使用web服务器的私有地址访问web服务器?

答,很多普通员工不知道什么是”IP地址“,只知道”网址“。如果公司内网没有架设DNS服务器,而使用ISP的DNS服务器解析域名,则解析结果为公网IP地址。

百度经验:jingyan.baidu.com

工具/原料

  • 在线远程实验室网络(见之前的文章)
  • MSR5040路由器、DCR2659路由器、MSR30路由器、交换机S16、PC2、PC3
  • sniffer抓包程序、360流量防火墙

百度经验:jingyan.baidu.com

方法/步骤

  1. 1

    提供实验拓扑图和说明如下:

    S16(模拟内网普通交换机)

    R1(MSR5040路由器,提供NAT服务)

    R4(DCR2659路由器,模拟ISP网络)

    R3(MSR30路由器,模拟公网用户终端)

    PC2(模拟内网客户端PC,提供抓包功能)

    PC3(模拟内网WEB服务器、Telnet服务器,提供抓包功能)

    步骤阅读
  2. 2

    在PC3上配置WEB服务、Telnet服务、安装sniffer抓包软件。

    配置WEB服务比较简单,这里配置步骤省略。

    安装sniffer抓包软件比较简单,这里安装过程省略。

    配置Telnet服务,这里简单配置一下(达到测试目的即可),如下列截图所示:

    步骤阅读
    步骤阅读
    步骤阅读

  3. 3

    在内网PC2上测试PC3的WEB服务、Telnet服务是否正常:

    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读

  4. 4

    根据实验拓扑图,配置下列网络参数,具体步骤很简单,这里省略:

    配置R3、R4、R1的相关接口的IP地址;

    配置R3的默认路由指向R4的G0/4(192.168.34.4);

    配置R1的默认路由指向R4的G0/6(192.168.14.4);

    测试R3到R1的G0/0接口的连通性(ping  192.168.14.1),确保连通性;

    步骤阅读
  5. 5

    配置PC2和PC3的默认网关为:192.168.8.13。

    本案例中,远程在线实验用户vpn拨号后分配的ip网段为192.168.5.0/24,为了保持远程在线实验用户持续、正常的远程登录PC2和PC3,务必确保PC2和PC3有到192.168.5.0/24、192.168.6.0/24网段的静态路由,具体原因见之前的文章:“ 远程在线网络实验室搭建”

    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读

  6. 6

    下面开始配置R1的NAT服务,包括src-nat和dst-nat,并测试scr-nat

    1)、配置基本acl 2000,permit 192.168.8.0/24网段

    2)、在G0/0接口上配置src-nat

    3)、在G0/0接口上配置nat server(即dst-nat),针对www服务(80端口)和telnet服务(23端口)进行dst-nat转换

    4)、在R3上开启icmp的debug调试,在PC2上pingR3,测试src-nat是否成功

    截图如下:

    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读

  7. 7

    接下来开始测试外网用户(R3)对内部服务器PC3的访问。

    假设PC3的域名解析结果IP地址为R1的G0/0接口地址192.168.14.1

    1)、内部服务器PC3上打开360流量防火墙,检测呼入连接

    2)、R1上开启nat packet debug调试输出,查看nat的状态

    3)、R1关闭自身的http服务和telnet服务,避免冲突

    4)、测试R3到PC3的telnet连接

    5)、测试R3到PC3的http连接

    具体截图如下:

    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读
    步骤阅读

  8. 8

    到目前,外网用户已经可以通过PC3的公网IP来访问PC3,下面重点分析内网用户通过PC3的公网IP来访问PC3的过程,抓包分析,结合TCP三次握手原理。

  9. 9

    在R1的G0/1接口配置并开启nat server(dst-nat),这样当R1在G0/1接口收到PC2针对PC3的公网IP地址的访问请求时,才能进行nat转换

    且在R1上开启nat packet的debug调试输出

    步骤阅读
    步骤阅读

  10. 10

    在PC2和PC3上同时启动sniffer抓包功能

    在PC2上分别使用telnet和http两种方式来访问PC3的公网IP(192.168.14.1),发现访问失败

    步骤阅读
    步骤阅读

  11. 11

    在PC2上停止并查看数据包,分析如下:

    首先,PC2原本希望和PC3的公网IP(192.168.14.1)建立三次握手,但一直没有收到192.168.14.1的ACK,所以此连接请求失败;

    其次,PC2收到了PC3的内网IP(192.168.8.203)返回的ACK,但是PC2认为自己从来没有向PC3的内网IP进行过连接请求,所以此连接请求失败;

    第三,PC2向PC3发送了一个RST类型的TCP报文,PC2和PC3之间的“非法连接”被复位了(reset)

    步骤阅读
  12. 12

    在R1上查看调试信息输出,分析如下:

    R1在这个通信过程中,只干了一件事,就是不断的将目标IP 192.168.14.1转换为192.168.8.203,源IP 192.168.8.202保持不变,将数据包转发给192.168.8.203(PC3)

    而PC3收到数据包后,PC3认为是PC2向它发送了连接请求,所以回应一个SYN ACK连接响应给PC2,且此回应包没有经过R1的转发(直接经过交换机到达PC2)

    步骤阅读
  13. 13

    在PC3上停止并查看数据包,分析如下:

    首先,PC3收到R1转发过来的数据包,源IP为PC2(192.168.8.202),它认为这是PC2向自己发送的TCP连接请求;

    其次,PC3向PC2发送回应数据包SYN ACK;

    第三,PC3期待收到PC2的SYN ACK,但事与愿违,它收到了PC2的reset包

    所以,连接请求建立不成功;

    步骤阅读
  14. 14

    到目前为止,NAT回流不成功的原因已经找到了,就是TCP三次握手无法完整的建立导致的。

    知道深层次的原因后,自然就有解决方法了:

    首先,在R1的G0/1接口配置src-nat,这样,R1转发PC2到PC3公网IP的请求时,一方面将PC3的公网IP转换为PC3的内网IP(目标地址),另一方面,将源地址(PC2的IP)转换为G0/1接口的IP(192.168.8.13)

    其次,当PC3收到这个SYN请求时,回应SYN ACK包,目标为R1的G0/1接口IP,由于R1的G0/1接口同时配置了dst-nat和src-nat,所以此数据包的源IP转换为192.168.14.1(根据上一步建立的IP端口映射表),目标IP转换为192.168.8.202(根据上一步建立的IP端口映射表),R1完成转换后,从G0/1接口转发数据包给PC2

    第三,PC2收到这个SYN ACK后,发现源地址为192.168.14.1,即原先SYN请求的目标地址,于是向192.168.14.1回应SYN ACK

    ……

    以此类推,后面的通信过程是一样的。

    在这里,PC2认为自己一直是和192.168.14.1通信的,而PC3则认为自己一直是和192.168.8.13进行通信的,而实际上PC2和PC3一直进行着真正的通信。

  15. 15

    R1的G0/1接口同时配置src-nat和dst-nat(nat server)

    步骤阅读
  16. 16

    R1的nat packet debug输出如下:

    可以看出来,第一条和最后一条的源、目标IP地址以及端口号达到了一致性

    步骤阅读
  17. 17

    PC2成功的和192.168.14.1建立了三次握手

    PC3成功的和192.168.8.13建立了三次握手

    步骤阅读

由TCP三次握手原理来分析NAT回流故障相关推荐

  1. TCP 三次握手原理,你真的理解吗

    转载自  TCP 三次握手原理,你真的理解吗 最近,阿里中间件小哥哥蛰剑碰到一个问题--client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么 ...

  2. TCP三次握手原理详解

    TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族. 从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层.网络层.传输层.应用层. TCP协议:即传输控制 ...

  3. TCP三次握手原理,你真的了解吗?

    最近碰到一个问题,Client 端连接服务器总是抛异常.在反复定位分析.并查阅各种资料搞懂后,我发现并没有文章能把这两个队列以及怎么观察他们的指标说清楚. 问题描述 场景:Java 的 Client ...

  4. TCP 三次握手原理,你真的理解吗?

    阿里妹导读:最近,阿里中间件小哥哥蛰剑碰到一个问题--client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑 ...

  5. TCP三次握手源代码跟踪分析

    1.前言 1.1TCP基本概念 TCP协议:面向连接的.可靠的字节流服务 SYN 同步序列编号(Synchronize Sequence Numbers).是TCP/IP建立连接时使用的握手信号. 三 ...

  6. TCP三次握手和劫持原理与实例

    首先详细了解一下TCP三次握手的过程     三次握手Three-way Handshake   一个虚拟连接的建立是通过三次握手来实现的   1. (B) --> [SYN] --> ( ...

  7. TCP、UDP、TCP三次握手与四次挥手、TCP如何保证可靠传输、TCP异常分析、拆包和粘包等

    4.OSI模型 4.1.OSI七层模型 4.2.七层模型功能 ​ 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,如网线:网卡标准. ​ 数据链路层:接收来自物理层的位流形式的数据 ...

  8. mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论 ...

  9. TCP三次握手、四次挥手过程及原理

    TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/I ...

最新文章

  1. k8s组件说明:主要组件统一说明
  2. pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
  3. python 生成 和 加载 requirements.txt
  4. 腾讯Tiny OS 组合 NB-IoT,值得程序员一试吗?
  5. 平台型时间信号强度曲线_中联重科直臂式高空作业平台 ZT42J
  6. 记录windows游戏编程——1
  7. 吴翰清:云计算安全是“皇帝的新装”么?
  8. 在iOS9上不能分享至微信,提示没有安装微信客户端
  9. 四川大学计算机与生命科学专业,四川大学生命科学学院2014年研招专业目录
  10. NAS自动挂载和关闭硬盘电源原理
  11. 千兆光模块的类型都有哪些?
  12. DL/T645-2007电表协议 数据域DATA注意事项
  13. xampp v3.2.2 php版本,xampp 3.2.2下载
  14. 栈和队列的特点,什么情况下使用?
  15. ubuntu14.04+cuda8.0+cudnn5.1+torch7配置整理
  16. 【Python Matplotlib】设置横纵单位长度相同
  17. CorelDRAW中的双色图样填充该怎么使用
  18. input输入框的限制输入
  19. php mysql首字母查询_MySQL应用技巧实现查询汉字的拼音首字母
  20. delphi android闪退,delphi 运行后闪退

热门文章

  1. opencv2.0 saturate_cast? 研究
  2. android 发短信意图,android代码实现打电话和发送短信功能
  3. BIEE入门篇之一 BIEE的安装
  4. 读书笔记:《做出明智判断的10个方法》
  5. 苹果5怎么显示是4g网络连接服务器,苹果5有4g网络吗 苹果5怎么样【图解】
  6. 菜鸟的蜕变:教你一步一步创建基于laravel5的简易论坛系统(3)
  7. Android 类似Ios的时间滚轮控件
  8. 科一考完很久了,怕三年有效期快满了,如何查科一通过的具体日期?
  9. Unity之光源分类
  10. MySQL数据库崩溃恢复