想知道华为哪个路由对应哪种NAT实现方式,主要是为了测试内网穿透

项目需要学习了一些NAT方面的知識,想着应该怎么通俗易懂的来说一下但是一直没有好的思路,直到在看雪论坛发现了一个老帖子我觉得写的非常好,这里做了一些修改后分享给大家

  1. NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与外网通信时怎么将内网私有IP地址转换为可在网络中传播嘚合法IP地址NAT的出现完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击隐藏并保护网络内部的计算机。

第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)此外,如果任何外部主机想要发送数据给这个内网主机只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机IP发送过数据。只要满足这两个条件这个外部主机就可鉯用自己的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这個socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这個socket曾向这个外部主机(IP,Port)发送过数据只要满足这两个条件,这个外部主机就可以用自己的(IP,Port)发送数据给(PublicIP:PublicPort)内网的主机就能收到这个数据包。

PublicIP-2且Port-1等于Port-2此外,如果任何外部主机想要发送数据给这个内网主机那么它首先应该收到内网主机发给他的数据,然后才能往回发送否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现P2P通信但是如果另一方是Full Cone NAT,还是可以实现穿透的下面我会详细分析各种类型NAT穿透的情况。

    NAT功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中所以大家很少会感知到NAT,上面NAT类型的概念描述是比較通俗的但为了便于理解,再举例阐述一下NAT的原理

现有通信双方A和B,当A和B都是在公网的时候通信是不用NAT的。假设A在内网内网IP是192.168.1.3,端口号是5000A经过NAT后的IP是221.221.221.100,端口号是8000B的IP是202.105.124.100,端口是8500如果B要去主动连接A,即使B知道A经过NAT后的IP和端口也是无法连接成功的因为A没有向B(202.105.124.100:8500)发送過数据,所以B的数据包会被A的NAT丢弃于是连接失败。但是A如果去主动连接B由于B是在公网,所以会连接成功通信也就会建立。这也是反彈连接木马“反弹”二字的精髓

当A和B都处在内网时,双方由于都不知道对方的公网IP和端口就会无从下手,所以要在A和B之间架设一台服務器S来为它们牵线而且S是处在公网,以保证A和B都能连接到SA和B登录时都首先连接S,S就会知道A和B经过NAT后的IP和端口当A想要连接B时,就向S发絀请求S会把B经过NAT后的IP和端口告诉A,同时S向B发送A经过NAT后的IP和端口并要求B发送数据给A,B发送数据到达A时会被A的NAT抛弃但是B的NAT会有B发送数据箌A的记录,这时A再向B发送数据时就会被B的NAT放行因为B曾经向A的外网IP和端口发送过数据。

A往B发送数据的唯一阻碍就是NAT_B所以想要成功发送数據,必须把NAT_B穿一个洞A是无法完成这项工作的,所以就得让B完成这个打洞操作也就是让B往A发送数据,这样NAT_B就会误以为A发送的数据是上次會话的一部分从而不予阻拦但是,由于NAT的类型没有一个统一的标准所以NAT穿透使用的技术有很多种,穿透的成功率也不一样还有些NAT类型的内网之间几乎无法穿透。下面我们用实例详细分析一下各种NAT类型穿透的可行性

则无论A侧NAT属于Cone NAT还是Symmetric NAT,包都能顺利到达B如果程序设计嘚好,使得B主动到A的包也能借用A主动发起建立的通道的话则即使A侧NAT属于Symmetric NAT,B发出的包也能顺利到达A

反过来想,则可以得出另一个结论:

仩面的例子虽然只是分析了最初发包是从A到B的情况但是,由于两者的对称性前面得出的几条结论没有方向性,双向都适用

我们上面嘚出了四条结论,natcheck网站则把他归结为一条:

一般情况下只有比较注重安全的大公司会使用Symmetric NAT,禁止使用P2P类型的通信很多地方使用的都是Cone NAT,因此穿透技术还是有发展前景的

上面讲的情况可以直接应用于UDP穿透技术中,使用TCP 协议穿透NAT 的方式和使用UDP 协议穿透NAT 的方式几乎一样没囿什么本质上的区别,只是将无连接的UDP 变成了面向连接的TCP

值得注意是:B在向A打洞时,发送的SYN 数据包会被NAT_A丢弃。同时B需要在原来的socket上監听,由于重用socket 所以需要将socket 属性设置为SO_REUSEADDR 。

A向B发送连接请求同样,由于B到A方向的孔已经打好所以连接会成功,经过3 次握手后A到B之间嘚连接就建立起来了。具体过程如下:

  1. S启动两个网络侦听一个叫【主连接】侦听,一个叫【协助打洞】的侦听
  2. A和B分别与S的【主连接】保持联系。
  3. 当A需要和B建立直接的TCP连接时首先连接S的【协助打洞】端口,并发送协助连接申请同时在该端口号上启动侦听。注意由于要茬相同的网络终端上绑定到不同的套接字上所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败
  4. S的【协助打洞】连接收箌A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B
  5. B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。
  6. B尝试与A经过NAT-A转换后的公网IP地址和端口进行connect大多数路甴器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-B会纪录此次连接的源地址和端口号为接下来真正的连接做好了准备,这就是所谓的咑洞即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了
  7. 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通過与S的【主连接】回复消息“我已经准备好”S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。
  8. A收到S回复的B的公网IP和端口号等信息以后开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口NAT-B纪录了此次连接的信息,所以当A主动连接B时NAT-B会认为是合法的SYN数据,并允许通过从而直接的TCP连接建立起来了。




公有IP地址:也叫全局地址是指匼法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址

私有IP地址:也叫内部地址,属于非注册地址专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:

地址池:地址池是有一些外部地址(全球唯一的IP地址)组合而成我们称这样的一个地址集合为地址池。在内部网络的数据包通过地址转换到達外部网络时将会在地址池中选择某个IP地址作为数据包的源IP地址,这样可以有效的利用用户的外部地址提高访问外部网络的能力。

Protocol)哋址出现在Internet上顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术如下图所示。因此我们可以认为NAT在一定程度上,能够有效的解决公网地址不足的问题

简单地说,NAT就是在局域网内部网络中使用内部地址而当内部节点要与外部网络进行通讯時,就在网关(可以理解为出口打个比方就像院子的门一样)处,将内部地址替换成公用地址从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接这一功能很好地解决了公共 IP地址紧缺的问题。通过这种方法可以只申请一个合法IP地址,就把整个局域网中的计算机接入Internet中这时,NAT屏蔽了内部网络所有内部网计算机对于公共网络来说是不可见的,而内部网计算机用户通常不会意识到NAT的存在如丅图所示。这里提到的内部地址是指在内部网络中分配给节点的私有IP地址,这个地址只能在内部网络中使用不能被路由转发。

NAT 功能通瑺被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中比如Cisco路由器中已经加入这一功能,网络管理员只需在路由器的IOS中设置NAT功能就可鉯实现对内部网络的屏蔽。再比如防火墙将WEB Server的内部地址192.168.1.1映射为外部地址202.96.23.11外部访问202.96.23.11地址实际上就是访问访问 192.168.1.1。此外对于资金有限的小型企业来说,现在通过软件也可以实现这一功能Windows 98 SE、Windows 2000 都包含了这一功能。

通过手动设置使 Internet 客户进行的通信能够映射到某个特定的私有地址囷端口。如果想让连接在 Internet 上的计算机能够使用某个私有上的(如网站)以及应用(如游戏)那么静态映射是必需的。静态映射不会从 NAT 转換表中删除
  如果在 NAT 转换表中存在某个映射,那么 NAT 只是单向地从 Internet 向私有传送数据这样,NAT 就为连接到私有部分的计算机提供了某种程喥的保护但是,如果考虑到 Internet 的安全性NAT 就要配合全功能的防火墙一起使用。

对于以上网络拓扑图当内网主机 10.1.1.1如果要与外网的主机201.0.0.11通信時,主机(IP:10.1.1.1)的数据包经过路由器时路由器通过查找NAT table 将IP数据包的源IP地址(10.1.1.1)改成与之对应的全局IP地址(201.0.0.1),而目标IP地址201.0.0.11保持不变这樣,数据包就能到达201.0.0.11而当主机HostB(IP:201.0.0.11) 响应的数据包到达与内网相连接的路由器时,路由器同样查找NAT table将IP数据包的目的IP 地址改成10.1.1.1,这样内网主机僦能接收到外网主机发过来的数据包在静态NAT方式中,内部的IP地址与公有IP地址是一种一一对应的映射关系所以,采用这种方式的前提是机构能够申请到足够多的全局IP地址。

动态地址NAT只是转换IP地址它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号对于頻繁的远程联接也可以采用动态NAT。当远程用户联接上之后动态地址NAT就会分配给他一个IP地址,用户断开时这个IP地址就会被释放而留待以後使用。

动态NAT方式适合于 当机构申请到的全局IP地址较少而内部网络主机较多的情况。内网主机IP与全局IP地址是多对一的关系当数据包进絀内网时,具有NAT功能的设备对IP数据包的处理与静态NAT的一样只是NAT table表中的记录是动态的,若内网主机在一定时间内没有和外部网络通信有關它的IP地址映射关系将会被删除,并且会把该全局IP地址分配给新的IP数据包使用形成新的NAT table映射记录。

网络地址端口转换NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个IP地址的不同端口上它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号

NAPT是使用最普遍的一种转换方式,它又包含两种转换方式:SNAT和DNAT

(1)源NAT(Source NAT,SNAT):修改数据包的源地址源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成数据包伪装就是一具SNAT嘚例子。

NAT刚好与SNAT相反它是改变第一个数据包的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT

源NAT举例:对于以上网络拓扑图,内网的主机数量比较多但是该组织只有一个合法的IP地址,当内网主机(10.1.1.3)往外发送数据包时则需要修改数据包的IP地址和TCP/UDP端口号,例洳将

源port:1492(注意:源端口号可以与原来的一样也可以不一样

当外网主机(201.0.0.11)响应内网主机(10.1.1.3)时应将:

这样,通过修改IP地址和端口的方法就可以使内网中所有的主机都能访问外网此类NAT适用于组织或机构内只有一个合法的IP地址的情况,也是动态NAT的一种特例

目的NAT举例:這种方式适用于内网的某些服务器需要为外网提供某些服务的情况。

例如以上拓扑结构内网服务器群(ip地址分别为:10.1.1.1,10.1.1.2,10.1.1.3等)需要为外网提供WEB 服务,当外网主机HostB访问内网时所发送的数据包的目的IP地址为10.1.1.127,端口号为:80当该数据包到达内网连接的路由器时,路由器查找NAT table路由器通过修改目的IP地址和端口号,将外网的数据包平均发送到不同的主机上(10.1.1.1,10.1.1.2,10.1.1.3等)这样就实现了负载均衡。



端口限制性锥NAT与限制性锥NAT类似只是多了端口号的限制。


  • 每一个来自相同内部IP与端口到一个特定目的地地址和端口的请求,都映射到一个独特的外部IP地址和端口
    同┅内部IP与端口发到不同的目的地和端口的信息包,都使用不同的映射
  • 只有曾经收到过内部主机数据包的外部主机,才能够把数据包发回

NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。

这时NAT Gateway会将IP包嘚目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2Src=202.20.65.4)转发到私有网。对于通信双方而言这种地址的转换过程是完全透明的。转换示意图如下

如果内网主机发出的请求包未经过NAT,那么当Web Server收到请求包回复的响应包中的目的地址就是私有网络IP地址,在Internet上无法正确送达导致连接夨败。

在上述过程中NAT Gateway在收到响应包后,就需要判断将数据包转发给谁此时如果子网内仅有少量客户机,可以用静态NAT手工指定;但如果內网有多台客户机并且各自访问不同网站,这时候就需要连接跟踪(connection track)如下图所示:

在NAT Gateway收到客户机发来的请求包后,做源地址转换並且将该连接记录保存下来,当NAT Gateway收到服务器来的响应包后查找Track Table,确定转发目标做目的地址转换,转发给客户机

以上述客户机访问服務器为例,当仅有一台客户机访问服务器时NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。但是如果Client A和Client B同时访问Web Server那么当NAT Gateway收到响应包的时候,就无法判断将数据包转发给哪台客户机如下图所示。

 此时NAT Gateway会在Connection Track中加入端口信息加以区分。如果两客户机访问同一服务器的源端口不哃那么在Track Table里加入端口信息即可区分,如果源端口正好相同那么在实行SNAT和DNAT的同时对源端口也要做相应的转换,如下图所示


NAT主要可以实現以下几个功能:数据包伪装、平衡负载、端口转发和透明代理

数据伪装: 可以将内网数据包中的地址信息更改成统一的对外地址信息鈈让内网主机直接暴露在因特网上,保证内网主机的安全同时,该功能也常用来实现共享上网例如,内网主机访问外网时为了隐藏內网拓扑结构,使用全局地址替换私有地址

端口转发: 当内网主机对外提供服务时,由于使用的是内部私有IP地址外网无法直接访问。因此需要在网关上进行端口转发,将特定服务的数据包转发给内网主机例如公司小王在自己的服务器上架设了一个Web网站,他的IP地址为192.168.0.5使用默认端口80,现在他想让局域网外的用户也能直接访问他的Web站点利用NAT即可很轻松的解决这个问题,服务器的IP地址为210.59.120.89那么为小王分配┅个端口,例如81即所有访问210.59.120.89:81的请求都自动转向192.168.0.5:80,而且这个过程对用户来说是透明的

负载平衡:目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。例如1.2.3所讲的目的NAT的例子

失效终结:目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路甴器访问的关键服务器一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上提高系统的鈳靠性。

透明代理:例如自己架设的服务器空间不足需要将某些链接指向存在另外一台服务器的空间;或者某台计算机上没有安装IIS服务,泹是却想让网友访问该台计算机上的内容这个时候利用IIS的Web站点重定向即可轻松的帮助我们搞定。


NAT在最开始的时候是非常完美的但随着網络的发展,各种新的应用层出不穷此时NAT也暴露出了缺点。NAT的缺陷主要表现在以下几方面:

(1) 不能处理嵌入式IP地址或端口

NAT设备不能翻译那些嵌入到应用数据部分的IP地址或端口信息它只能翻译那种正常位于IP首部中的地址信息和位于TCP/UDP首部中的端口信息。如下图由于对方会使鼡接收到的数据包中应用数据部分嵌入的地址和端口进行通信(比如FTP协议),这样就可能产生连接故障如果通信双方都是使用的公网IP,這不会造成什么问题但如果那个嵌入式地址和端口是内网的,显然连接就不可能成功原因就如开篇所说的一样。MSN Messenger的部分功能就使用了這种方式来传递IP和端口信息这样就导致了NAT设备后的客户端网络应用程序出现连接故障。

一些NAT服务为了适应更多的场景提供了对多种协議的适配,比如支持FTP、SCTP、IMCP、DNS等等这种技术称为ALG(Application Level Gateway),即在应用层对IP和端口做一定的抽取工作并生成NAT映射表记录。但这些也大大增加了NAT嘚复杂度特别是自定义协议的情况下,要考虑较复杂的机制来穿透NAT

(2) 不能从公网访问内部网络服务

由于内网是私有IP,所以不能直接从公網访问内部网络服务比如WEB服务,对于这个问题我们可以采用建立静态映射的方法来解决。比如有一条静态映射是把218.70.201.185:80与192.168.0.88:80映射起的,当公网用户要访问内部WEB服务器时它就首先连接到218.70.201.185:80,然后NAT设备把请求传给192.168.0.88:80192.168.0.88把响应返回NAT设备,再由NAT设备传给公网访问用户

(3) 有一些应用程序雖然是用A端口发送数据的,但却要用B端口进行接收不过NAT设备翻译时却不知道这一点,它仍然建立一条针对A端口的映射结果对方响应的數据要传给B端口时,NAT设备却找不到相关映射条目而会丢弃数据包


对于那些没有中间服务器的纯P2P应用(如电视会议,娱乐等)来说如果夶家都位于NAT设备之后,双方是无法建立连接的因为没有中间服务器的中转,NAT设备后的P2P程序在NAT设备上是不会有映射条目的也就是说对方昰不能向你发起一个连接的。现在已经有一种叫做P2P NAT穿越的技术来解决这个问题

(5) NAT设备对数据包进行编辑和修改操作,降低了发送数据的效率;而且由于增加了技术的复杂性排错也变得困难了。

NAT 不仅实现地址转换同时还起到防火墙的作用,隐藏内部网络的拓扑结构保护內部主机。 NAT 不仅完美地解决了 lP 地址不足的问题而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机这样对于外蔀主机来说,内部主机是不可见的但是,对于P2P 应用来说却要求能够建立端到端的连接,所以如何穿透NAT 也是P2P 技术中的一个关键



和ClientB-1 之间嘚消息,但是这样服务器太累会吃不消。另一种方法就是让ClientA-1 何ClientB-1 建立端到端的连接然后他们自己通信。这也就是P2P 连接根据不同类型的NAT ,下面分别讲解

(1 )全锥NAT ,穿透全锥型NAT 很容易根本称不上穿透,因为全锥型NAT 将内部主机的映射到确定的地址不会阻止从外部发送的連接请求,所以可以不用任何辅助手段就可以建立连接
(2 )限制性锥NAT 和端口限制性锥NAT (简称限制性NAT ),穿透限制性锥NAT 会丢弃它未知的源哋址发向内部主机的数据包所以如果现在ClientA-1 直接发送UDP 数据包到ClientB-1 ,那么数据包将会被NAT-B 无情的丢弃所以采用下面的方法来建立ClientA-1 和ClientB-1 之间的通信。
3. ClientB-1 向ClientA-1 (202.103.142.29:5000 )发送UDP 数据包当然这个包在到达NAT-A 的时候,还是会被丢弃这并不是关键的,因为发送这个UDP 包只是为了让NAT-B 记住这次通信的目的地址:端口号当下次以这个地址和端口为源的数据到达的时候就不会被NAT-B 丢弃,这样就在NAT-B 上打了一个从ClientB-1

使用TCP 协议穿透NAT 的方式和使用UDP 协议穿透NAT 的方式几乎一样没有什么本质上的区别,只是将无连接的UDP 变成了面向连接的TCP 值得注意是:

同时开放TCP 策略非常依赖于猜测对方的下一个端ロ,而且强烈依赖于发送连接请求的时机而且还有网络的不确定性,所以能够建立的机会很小即使Server 充当同步时钟的角色。下面是一种通过UDP 穿透的方法由于UDP 不需要建立连接,所以也就不需要考虑“同时开放”的问题


    从上面两种穿透对称NAT 的方法来看,都建立在了严格的假设条件下但是现实中多数的NAT 都是锥NAT ,因为资源毕竟很重要反观对称NAT ,由于太不节约端口号所以相对来说成本较高所以,不管是穿透锥NAT还是对称NAT ,现实中都是可以办到的除非对称NAT 真的使用随机来分配可用的端口。


NAT技术无可否认是在ipv4地址资源的短缺时候起到了缓解莋用;在减少用户申请ISP服务的花费和提供比较完善的负载平衡功能等方面带来了不少好处但是在ipv4地址在以后几年将会枯竭,NAT技术不能改變ip地址空间不足的本质然而在安全机制上也潜在着威胁,在配置和管理上也是一个挑战如果要从根本上解决ip地址资源的问题,ipv6才是最根本之路在ipv4转换到ipv6的过程中,NAT技术确实是一个不错的选择相对其他的方案优势也非常明显。


我要回帖

 

随机推荐