小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-02-21 / 62 阅读
0
0

nat打洞(p2p)

nat打洞

定义

NAT打洞(NAT traversal或UDP Hole Punching)是一种网络技术,它允许两个位于不同私有网络且各自被NAT设备隐藏的主机之间直接建立连接。在互联网上,由于IPv4地址的短缺,NAT(网络地址转换)被广泛用于将多个内部私有IP地址转换成一个或几个公共IP地址,使得内网设备能够访问公网。

当两台分别位于不同NAT之后的主机想要进行P2P(点对点)通信时,通常会遇到问题,因为NAT设备仅允许已建立的连接的数据包通过,而不允许从外网发起的新连接进入内网。NAT打洞就是解决这一问题的技术:

  1. 原理

    • 主机A和主机B都位于各自的NAT之后。
    • A与B先尝试与一个公共服务器(如STUN服务器)通信,以确定自己的公网映射地址及端口信息。
    • 每个主机获取到对方的公网地址和端口后,同时向对方发送数据包。
    • 当这些数据包到达对方NAT时,即使NAT没有先前记录这个连接,由于数据包是响应先前发出的请求,部分类型(如Full Cone NAT、Restricted Cone NAT和Port Restricted Cone NAT)的NAT会创建一个新的映射条目,允许来自特定源IP和端口的数据包通过,从而“打洞”穿透了NAT。
  2. 成功条件

    • NAT类型必须支持这种打洞机制。
    • 需要双方或者至少一方能够主动发起连接至公共服务器或对方。
  3. 辅助协议

    • 为了提高打洞成功率,还引入了STUN(Session Traversal Utilities for NAT)、TURN(Traversal Using Relays around NAT)等协议来协助发现NAT类型和建立连接。
  4. 应用场景

    • P2P文件共享、VoIP、在线游戏、视频会议等领域经常需要使用NAT打洞技术来实现直接的点对点通信,减少服务器中继带来的延迟和带宽消耗。

简而言之

NAT打洞是网络技术,用于解决不同私有网络中被NAT设备隐藏的主机间直接建立P2P连接的问题。通过与公共服务器交互获取公网映射地址,双方同时发送数据包以穿透NAT,实现点对点通信,常见于VoIP、在线游戏等场景,减少服务器中继需求。

nat类型

NAT(Network Address Translation,网络地址转换)类型主要指不同网络环境中NAT设备处理内外部IP地址和端口映射的几种方式。以下是一些常见的NAT类型:

  1. 全锥型(Full Cone NAT)

    • 允许内部主机发起的任何连接都可以从外部接收任意来源的数据包。
    • 对于一个内部IP地址和端口组合映射到的公网地址和端口,任何公网主机都能通过这个公网地址和端口与内网主机通信。
  2. 受限锥型(Restricted Cone NAT 或 IP 受限锥型)

    • 内部主机可以向任意公网主机发起连接,但只有之前内部主机已成功连接过的公网主机才能回应并建立连接。
    • 公网中的主机必须知道内部主机曾经连接过的特定公网地址和端口才能通信。
  3. 端口受限锥型(Port Restricted Cone NAT 或 IP+PORT 受限锥型)

    • 类似于受限锥型,但增加了端口限制。
    • 内部主机可以向任意公网主机及端口发起连接,但只有那些公网主机且使用特定端口的连接可以回应,这些端口号对应内部主机发起连接时使用的端口。
  4. 对称型(Symmetric NAT 或 非端口预测性NAT)

    • 每次内部主机发起新的连接时,NAT都会分配一个新的临时的公网地址和端口组合,且每个会话的映射是独一无二的。
    • 即使同一内部主机访问相同的目标地址,如果每次连接尝试的时间或源端口不同,NAT也会创建不同的映射关系。
    • 对称型NAT环境下实现P2P连接非常困难,因为没有固定、可预测的公网映射信息。
  5. 静态NAT(Static NAT)

    • 一对一映射,私有IP地址与公网IP地址之间存在永久固定的映射关系,适用于对外提供服务的服务器等场景。
  6. 动态NAT(Dynamic NAT)

    • 多对多映射,多个私有IP地址可以从地址池中动态获取未使用的公网IP地址进行通信,当连接结束时公网IP地址会被释放回地址池。
  7. NAPT(Network Address Port Translation,网络地址端口转换)或PAT(Port Address Translation)

    • 多对一映射,允许多个内部主机共享一个公网IP地址,通过不同的端口号来区分各个内部主机的流量。

这些类型的NAT在网络通讯中起着关键作用,尤其在IPv4地址空间日益紧张的情况下,用于解决公网IP地址不足的问题,并影响了网络应用特别是P2P应用的设计和部署。

全锥形nat与对称型nat区别

全锥型NAT(Full Cone NAT)与对称型NAT(Symmetric NAT)在处理网络地址转换时有着显著的区别:

  1. 全锥型NAT (Full Cone NAT):

    • 当一个内部主机通过全锥型NAT发送数据包到公网时,NAT设备会创建一个映射条目,将内网IP和端口映射到公网IP和端口。
    • 任何外部主机都能通过这个固定的公网IP和端口向该内网主机发送数据包,无论这个外部主机是否之前被内网主机连接过。
    • 这意味着,对于同一个内网源IP和端口的组合,总是映射到相同的公网地址和端口。
  2. 对称型NAT (Symmetric NAT):

    • 对称型NAT为每个新的外出连接请求分配一个新的、独特的公网IP地址和端口对。
    • 即使是同一内部主机发起的多个不同的连接请求(即使目标是相同的公网地址),也会映射到不同的公网IP和端口上。
    • 因此,只有当内部主机首先主动联系外部主机时,外部主机才能回应。而且,不同连接的公网映射是不一致的,无法预测。
  3. 地址限制锥形NAT (Address Restricted Cone NAT):

    • 地址限制锥形NAT相比端口限制锥形NAT,除了需要匹配端口外,还增加了目的IP地址的限制。即内部主机仅能接受那些之前它主动连接过的目标公网IP地址发来的回应,即使端口不同也不行。
  4. 对称型NAT (Symmetric NAT):

    • 对称型NAT最为严格,每次内部主机发起新的连接时,NAT设备都会分配一个新的公网IP地址和端口对,即使目的地相同也是如此。
    • 这意味着即使是同一内网主机试图连接同一外部主机的不同会话,也会有不同的公网映射。因此,只有当内网主机首先建立连接时,外部主机才能响应,并且必须针对每一个会话使用不同的公网IP和端口来响应。
  5. 端口限制锥形NAT (Port Restricted Cone NAT):

    • 对于端口限制锥形NAT,内部主机发起的每个外出连接都会被映射到一个特定的公网IP地址和端口对。
    • 外部主机可以向内部主机发送数据,但必须知道正确的公网IP地址以及端口,并且这个端口必须是内部主机之前在外出连接时使用的端口。也就是说,对于某个内网(IP, 端口)对,只允许从它先前连接过的特定外网IP和端口接收响应。

总结区别:

  • 全锥型NAT最宽松,对外部通信无任何附加限制,任何公网主机都能任意时间向内网主机发送数据。
  • 端口限制锥形NAT比全锥型更严格,要求外部响应只能来自于内网主机之前连接过的特定外网IP及端口。
  • 地址限制锥形NAT进一步收紧了规则,只允许内网主机之前主动连接过的公网IP地址发送回应,而不考虑端口变化。
  • 对称型NAT是最具挑战性的类型,因为它为每个会话创建独立且不可预测的映射关系,极大地阻碍了P2P应用和其他未预先进行端口映射设置的服务之间的直接通信。
  • 在全锥型NAT中,一旦建立了对外的连接,所有公网主机都能直接访问内网主机,而无需预先建立连接。
  • 而在对称型NAT下,没有固定或可预测的公网映射关系,每次新连接都会生成新的映射,并且只有内网主机知道如何与其已经接触过的外部主机通信,这使得P2P应用和一些需要预设端口映射的服务难以穿透NAT进行直接通信。

不同类型的NAT对于网络连接穿透性(即P2P应用和其他需要直接点对点通信的场景下的连接建立能力)具有不同的影响:

  1. 全锥型NAT (Full Cone NAT):

    • 最具穿透性的NAT类型,因为一旦内部主机通过该NAT与外部服务器或主机建立了连接,任何公网上的主机都能向内网主机发送数据包,无需事先建立联系。因此,全锥型NAT通常可以实现很好的P2P穿透。
  2. 受限锥型NAT (Restricted Cone or Address Restricted Cone NAT):

    • 穿透性相对较好,但比全锥型稍差。内部主机可以直接接收之前已连接过的任意公网IP地址发来的数据包,但对于未预先建立过连接的公网IP则无法接收。如果两个内网主机都使用这种NAT,并且至少有一方能够成功发起连接到公共服务器或对方,理论上仍有可能实现P2P穿透。
  3. 端口限制锥型NAT (Port Restricted Cone NAT):

    • 与受限锥型类似,但是除了要求响应的公网IP地址曾经被连接过外,还必须是从相同的端口进行回应。尽管条件更为严格,但在某些条件下仍然允许P2P穿透。
  4. 对称型NAT (Symmetric NAT):

    • 对于P2P穿透来说最具挑战性,因为每次内部主机发起新的连接时,NAT都会分配一个新的、不可预测的公网IP和端口对。这使得在没有中间服务器协助的情况下,两个同样位于对称型NAT之后的主机很难直接建立连接。然而,在采用STUN/TURN等协议以及适当的打洞技术后,也可以一定程度上提高穿透成功率,但不能保证100%穿透。

综上所述,从穿透性角度来看,全锥型NAT最为友好,而对称型NAT最不友好。实际应用中,许多P2P应用程序会结合STUN(Session Traversal Utilities for NAT)、TURN(Traversal Using Relays around NAT)以及其他NAT穿越技术来尝试解决不同类型的NAT所带来的连接问题。

NAT打洞(UDP Hole Punching)过程中,并不能直接指定运营商端口。运营商提供的NAT设备在进行网络地址转换时,为内部主机映射到公网IP的端口号是由NAT设备动态分配的,而不是由用户或应用层直接指定。

当内部主机发起连接请求时,NAT设备会根据其内部源IP和端口以及目标IP和端口来决定如何进行映射。对于P2P通信而言,通常需要通过STUN协议发现自己的公网映射信息,包括公网IP和端口。

如果两个位于不同私有网络中的主机想要建立直接连接,它们会各自向公共服务器(如STUN服务器)发送请求以获取自己对外部世界的可见信息。然后,双方利用这些信息尝试同时发送数据包给对方,期望穿透各自的NAT设备。此时,能否成功“打洞”穿越NAT取决于NAT设备的类型和策略,而并非客户端能主动控制NAT所使用的公网端口。

在某些情况下,例如使用TURN(Traversal Using Relays around NAT)协议时,可以通过中继服务器提供一个固定且可预测的公网端口供通信双方使用,但这不是直接指定运营商NAT设备的端口,而是通过服务器转接的方式实现点对点通信。

Natter的打洞原理

Natter之所以只能在NAT1下打洞,是因为Natter通过使用特定端口与公网STUN服务器通信达成端口映射规则的建立,STUN服务器会将映射的外网端口发回Natter,这样只需在路由器上配置好本层NAT的端口映射规则,就能完成外网端口->软件监听端口的转换,其它客户端就可以通过这个外部端口连接到你的客户端进行下载。而在NAT2,NAT3下,外部主机的连接受到源限制,只能靠第三方服务器完成打洞。

STUN服务器(Session Traversal Utilities for NAT)

是一种网络服务,其主要功能是帮助位于NAT(网络地址转换)设备后的客户端发现它们在公网上的实际IP地址和端口号。由于NAT设备的存在,内网设备通常无法直接知道自己的公共网络可见性信息,这阻碍了这些设备与互联网上其他主机进行直接的P2P连接。

当一个客户端通过STUN服务器查询时,它会发送一个请求到STUN服务器,并且这个请求包含了发起请求的客户端在其私有网络内的源IP地址和端口信息。STUN服务器接收到请求后,会原封不动地将接收到的数据包中的源IP地址和端口信息作为响应内容发回给客户端。这个响应中包含的就是客户端在公网上的映射IP地址和端口。

通过这种方式,客户端可以了解到自己在公网中的“位置”,进而尝试与同样使用STUN协议的其他客户端建立直接的点对点通信连接,即所谓的“打洞”过程。STUN服务器本身并不参与实际数据传输,仅提供地址和端口映射信息的查询服务。

此外,在WebRTC、VoIP和其他实时通信应用中,STUN服务器是实现P2P通信的基础组件之一。不过对于某些类型或配置严格的NAT,单纯依靠STUN可能不足以穿透,这时需要配合TURN(Traversal Using Relays around NAT)服务器来提供中继服务,确保所有情况下都能建立连接。

TURN(Traversal Using Relays around NAT)

协议是一种网络穿透技术,它主要用于解决在NAT环境下进行P2P通信时遇到的连接问题。当直接使用STUN(Session Traversal Utilities for NAT)无法成功建立点对点连接时,TURN协议提供了一种中继服务以确保数据包能够从一个私有网络中的客户端到达另一个私有网络中的客户端。

TURN的工作原理:

  1. 中继模式:与STUN不同的是,TURN服务器不仅帮助客户端发现其公网映射地址,还会作为中继节点接收和转发数据包。当两个位于NAT后的设备尝试建立连接但无法直接通信时,它们可以将数据发送到TURN服务器。
  2. 分配传输地址:客户端向TURN服务器请求分配一个临时的传输地址。这个传输地址通常是一个公网IP地址和端口组合,所有的数据都将通过此地址中继。
  3. 数据转发:一旦获得传输地址,客户端就会将其告知对方,并开始通过TURN服务器转发所有通信数据。客户端A发送给B的数据首先发往TURN服务器,然后由服务器转发给B;反之亦然。
  4. 安全性:TURN协议支持安全机制,如传输层安全(TLS)加密以及基于用户名/密码的身份验证来保护通信的安全性。

由于TURN服务器实际参与了数据流的传输过程,因此相比于仅依赖STUN的情况,其对于带宽的需求更高,同时也会增加一定的延迟。但在许多复杂NAT环境或对称型NAT下,TURN是保证P2P连接成功的必要手段,尤其在WebRTC、VoIP等实时通信场景中扮演着关键角色。

natter


评论