NAT类型、探测及穿透

NAT总结比较全面参考:
 

1.NAT类型

1.1 NAT类型及分布统计

  • 基本NAT,只做内网IP与公网IP的替换,网络层以上的部分不替换,即端口不变。
    • 静态地址映射
      • 静态一对一,将一个内网IP和一个公网IP静态关联,出入时进行替换。
      • 静态多对一,将一段内网IP和一段公网IP静态关联。
    • 动态地址映射,一组内网主机抢占式地共享一个公网IP地址池。当公网IP地址池用完以后,新连接将无法建立。
  • NAPT(网络地址端口转换),与基本NAT只转换IP地址不同,NAPT转换IP:Port。
    • 动态端口映射,将内网IP动态替换为外网IP,同时将传输层端口按照一定规则动态提换为另一个端口,通过不同的端口号来区分不同的主机,不同的进程。
      • cone型(锥型),特点是将一个内网IP:Port固定映射到一个外网IP:Port,对于所有会话即不同的目的IP:Port都不变。
        • Full-cone NAT(全锥型),其特点为:一旦内部主机端口对(iAddr:iPort)被NAT网关映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);任何一个外部主机发送到(eAddr:ePort)的报文将会被转换后发到(iAddr:iPort),即使内部主机之前没有向外部主机发送过数据。
        • Restricted cone NAT(IP限制性),一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有 (iAddr:iPort)向特定的外部主机hAddr发送过数据,主机hAddr从任意端口发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。
        • Restricted port cone NAT(端口限制性),其特点为:一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有(iAddr:iPort)向特定的外部主机端口对(hAddr:hPort)发送过数据,由 (hAddr:hPort)发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。
      • Symmetric NAT(对称型),对于不同的会话,即目的IP:Port不同时,内网IP:Port在NAT设备上映射到不同IP:Port。NAT网关会把内部主机“地址端口对”和外部主机“地址端口对”完全相同的报文看作一个连接,在网关上创建一个公网“地址端口对”映射进行转换,只有收到报文的外部主机从对应的端口对发送回应的报文,才能被转换。即使内部主机使用之前用过的地址端口对去连接不同外部主机(或端口)时,NAT网关也会建立新的映射关系。
    • 静态端口映射,通过静态配置,把一个固定的私网IP地址和端口关联到一个公网地址和端口上。这种方式等同于前面介绍过的全锥模式,但是不需要内网主机首先发出报文。这种方式适用于在NAT网关上把一个知名服务(如HTTP)映射到一个内部主机上,也称为port forwarding,或者虚拟服务器。
  • 其他类型
    • Multiple IP NAT(多地址型),NAT网关有多个公网IP地址(可能时多个运营商地址),每次访问根据目的地址运营商类型,选择映射相应的IP:Port。
    • Open net NAT(公网类型),没有NAT网关,主机直接使用公网IP。

 1.2 NAT类型修改

NAT功能其实时设备上的一个软件,可以通过修改设备的规则来改变NAT行为,从而改变NAT的类型。对于P2P而言,Full Cone类型是友好的的类型,易于穿透。可以通过路由器或者网关的配置修改为full cone类型的NAT,但这样同时也会降低安全性。

DMZ:将内网主机设置为DMZ主机,外网可以通过访问网关的公网IP访问访问到内网主机。内网主机的NAT类型就改变为full cone类型。

静态端口映射:将一个内网IP:Port静态映射到公网IP:Port,则外部网络可以通过访问公网IP:Port访问到内网的IP:Port,表现为full cone类型。

2.NAT类型探测

NAT类型探测通过STUN协议实现,RFC 3489 STUN协议简介如下,

Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs) (STUN) is a lightweight protocol that allows applications to discover the presence and types of NATs and firewalls between them and the public Internet.  It also provides the ability for applications to determine the public Internet Protocol (IP) addresses allocated to them by the NAT.  STUN works with many existing NATs, and does not require any special behavior from them. As a result, it allows a wide variety of applications to work through existing NAT infrastructure.

Test 1:STUN client向STUN server发送UDP请求包,STUN server以原地址发送响应包,并返回STUN serve看到的请求包的公网IP和Port。

Test 2:STUN client向STUN server发送请求包,要求STUN serve change IP和change port发送响应包,响应包包含看到的请求包的公网IP和Port。

Test 3:STUN client向STUN server发送请求包,要求STUN serve change port发送响应包,响应包包含看到的请求包的公网IP和Port。

3.NAT穿透技术

3.1 主要思路

主要思路是通过一个辅助服务器,实现两个内网主机的通信。

(1)Active Peer和Passive Peer均项Punch Server UDP保活包,Punch Server获取Active peer和Passive peer的内网IP:Port和公网IP:Port。

(2)Active Peer向Punch Server发送请求,希望与Passive Peer建立连接,Punch server向Active peer发送响应包,包含Passive peer的内网和公网IP:Port;Punch server向Passive peer发送请求,包含Active peer的内网和公网IP:Port,要求Passive peer向Active peer发送打洞消息。

(3)Active peer向Passive peer的公网和内网IP:Port发送UDP打洞消息,Passive peer收到Punch server的辅助打洞请求后,向Active peer的公网和内网IP:Port发送UDP打洞请求。

(4)其中有一端收到打洞请求的响应包后,连接建立。

能否发送成功取决于Active peer和Passive peer的NAT类型,不同的类型组合打洞结果不同。

更多详细的内容,包括TCP穿透过程参考该文章

3.2 中转策略

对于无法穿透的场景,可以使用中转策略实现两台内网主机的通信,主要思路是两台内网机器都连接到第三方公网服务器,通过公网服务器实现消息的转发。例如TURN协议

3.3 UPNP协议

这也是一种通过开发通用方法解决NAT穿越问题的努力。与前者不同之处是,NAT网关是这一解决方案的参与者。与ALG的不同在于,客户端会参与网关公网映射信息的维护,此时NAT网关只要理解客户端的请求并按照要求去分配转换表,不需要自己去分析客户端的应用层数据。其中UPnP就是这样一种方法。UPnP中文全称为通用即插即用,是一个通用的网络终端与网关的通信协议,具备信息发布和管理控制的能力。其中,网关映射请求可以为客户动态添加映射表项。此时,NAT不再需要理解应用层携带的信息,只转换IP地址和端口信息。而客户端通过控制消息或信令发到公网侧的信息中,直接携带公网映射的IP地址和端口,接收端可以按照此信息建立数据连接。NAT网关在收到数据或连接请求时,按照UPnP建立的表项只转换地址和端口信息,不关心内容,再将数据转发到内网。这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。

3.4 映射关系保持

Active peer和Punch Server在NAT上的映射关系,存在一定的有效时间,因此需要保活包,维持映射关系。

3.5对称型NAT穿透

3.5.1 对称型NAT和端口限制型NAT的穿透

对于端口线性变化的对称型NAT可以通过端口预测的方式进行穿透;

对于端口随机变化的对称型NAT可以通过生日攻击算法实现,对称型侧新建400个socket,往端口限制侧分别发一个打洞包,端口限制侧往对称型侧随机选400个端口发送打洞包,打通的概率为80%。(短时间内发送过多的打洞包,对于某些NAT设备,会导致断网或者封禁)

3.5.2对称型NAT和对称型NAT暂无有效的方法

TCP穿透

TCP点对点穿透探索--失败-阿里云开发者社区

使用SO_REUSEADDR选项可以实现Full Cone NAT的穿透,对于IP限制型和端口限制型的基于SO_REUSEADDR不一定能打通(待实验验证,主要是SYN和syn+ack的消息的控制)

参考:腾讯云PCDN:从P2P到万物互联服务框架-腾讯云开发者社区-腾讯云

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值