NAT 四种类型

参考:NAT的四种类型以及类型探测P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

ice 框架整合了STUN和TURN

NAT主要分为两大类:锥型(Cone)和对称型(Symmetric)。

1.为什么需要NAT ?

NAT缓解了IPV4地址不够用的问题,同时也也带了限制,那就是NAT外部的主机无法主动跟位于NAT内部的主机通信,NAT内部主机想要通信,必须主动和公网的一个IP通信,路由器负责建立一个映射关系,从而实现数据的转发, 这就是NAT的工作原理。

2.什么是锥型和对称型呢?

假定:
公网Server1 ip:1.1.1.1,监听端口1111
公网Server2 ip:2.2.2.2,监听端口2222
NAT router ip是8.8.8.8
NAT内部client1是192.168.0.3

假定client(192.168.0.3, 100)给 server(1.1.1.1, 1111)发送报文,报文到达路由器,路由器在自己的公网ip上开辟一个端口800,从而建立了一个隐射关系(8.8.8.8, 800)<—>(192.168.0.3, 100), 建立映射关系后,所以(192.168.0.3, 100)和(1.1.1.1, 1111)之间的报文都通过这个映射关系进行转发。

client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射关系后,如果client(192.168.0.3, 100)又给(2.2.2.2, 2222)发送数据,路由器该怎么处理呢?

  1. 复用旧的映射关系(8.8.8.8, 800)<—>同时和(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 这就是锥型(Cone) NAT
  2. 创建新的映射关系(8.8.8.8, 801)<—>(2.2.2.2, 2222)通信, 这就是对称型NAT
如果这个时候路由器(8.8.8.8)在800端口上收到从另外一台server(2.2.2.2, 2222)发来的数据,是不是应该转发给(192.168.0.3, 100)呢?

有四种情况:

  1. 无条件转发给(192.168.0.3, 100), 这就是全锥型(Full Cone)NAT。
  2. 如果(192.168.0.3, 100)之前给(2.2.2.2)发送过数据,则转发, 这就是受限锥型(Restricted Cone)。
  3. 如果(192.168.0.3, 100)之前给(2.2.2.2, 2222)发送过数据,则转发, 这就是端口受限锥型(Port Restricted Cone)。
  4. 丢弃报文,拒绝转发, 这就是对称型NAT。

从上面也描述也可以看出,安全性系数, 对称型 > 端口受限锥型 > 受限锥型 > 全锥型

在这里插入图片描述
对称nat无法穿透,这个说法不正确,对称nat与full cone nat、对称nat 与 ip受限cone、是可以穿透的,对称nat与 端口受限、对称nat与对称nat,不可穿透。
类型:
1、full cone 全椎
2、Restricted Cone ip受限
3、port Restricted Cone 端口受限
4、Symmetric 对称。
穿透关系:上述4种类型,如果定义他们的值为序列号,N为序列号相加。则N<=6可穿透。
2 和 4 序列相加 = 6 则可穿透。 3(端口受限)和4(对称)= 7 不可穿透。

3. p2p网络中的NAT穿透问题—NAT的原理和类型

1.完全圆锥型NAT (Full Cane NAT)

完全圆锥型的NAT,将从同一内部IP地址和端口来的所有请求,都映射到相同的外部

IP地址和端口。而且,任何外部主机通过向映射的外部地址发送报文,可以实现和内部主机进行通信。这是一种比较宽松的策略,只要建立了内部网络的IP地址和端口与公网IP地址和端口的映射关系,则所有Internet上的主机都可以访问该NAT之后的主机。

在图7-1中,NAT会将内网地址{X:y} (x代表内网主机的IP地址,Y代表端口)映射

成公网地址{A:b}(A代表映射的公网IP地址,b代表映射的端口)并绑定。任何数据分组

都可以通过地址麦{A:b}送到此内网主机。
在这里插入图片描述

2,受限圆锥型NAT ( Restricted Cone NAT)

受限圆锥型NAT也是将从相同的内部IP地址和端口来的所有请求,映射到相同的公网

IP地址和端口。但是与完全圆锥型NAT不同,当且仅当内网主机之前己经向公网主机(假

设IP地址为P)发送过分组,此公网主机才能够向内网主机发送分组。

在图7-2中,NAT会将内网地址{x:y}映射成公网地址{A:b〕并绑定,只有源地址为P的分组才能和此内网主机通信。

在这里插入图片描述

3.端口受限圆锥型NAT ( Port Restricted Cone NAT)

类似于受限圆锥型NAT,但更严格。端U受限圆锥型NAT增加了端u号的限制,当_IL

仅当内网主机之前已经向公网主机发送了分组,公网卞机才能和此内网主机通信。

在图7-3中,NAT会将内网地址{X:y}映射成公网地址{A:b}并绑定,由于内网主机之前

己经分别与地址为M,端口为n的主机以及地址为P,端口为q的主机通信,所以只有来自

这两个公网地址和端口的分组才能到达内网主机。

在这里插入图片描述

4.对称型NAT CSymmetric NAT)

对称型NAT把从同一内网地址和端口到相同日的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另一个日的地址发送分组,则会使用不同的映射,而且公网主机只有在接收到分组后,才能向与发送分组的内网主机进行通信。可见,对称性NAT是所有NAT类型中限制最为严格的口

在图7-4中,对称型NAT会将内网地址{X:y}转换成公网地址{A:b}并绑定为{X=Y}|{A:b}<一>{P}9}。这就意味着NAT只允许地址{A:b}接收来自{P:q}的分组,将它转给{X:y} 。

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用于检测NAT类型的Python脚本,它可以识别四种常见的NAT类型:完锥型NAT、受限锥型NAT、端口受限锥型NAT和对称NAT。 ```python import socket def get_nat_type(): stun_servers = [('stun.l.google.com', 19302), ('stun1.l.google.com', 19302), ('stun2.l.google.com', 19302), ('stun3.l.google.com', 19302), ('stun4.l.google.com', 19302)] for server in stun_servers: try: # 创建UDP套接字 sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 连接STUN服务器 sockfd.connect(server) local_addr, local_port = sockfd.getsockname() # 发送绑定请求 sockfd.send(b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') # 接收响应 response = sockfd.recv(1024) # 解析响应数据 nat_type = ord(response[20:21]) # 关闭套接字 sockfd.close() if nat_type == 1: return "完锥型NAT" elif nat_type == 2: return "受限锥型NAT" elif nat_type == 3: return "端口受限锥型NAT" elif nat_type == 4: return "对称NAT" except socket.error: pass return "无法确定NAT类型" if __name__ == '__main__': nat_type = get_nat_type() print("NAT类型:", nat_type) ``` 此脚本使用多个公共的STUN服务器进行测试。它创建一个UDP套接字并连接到STUN服务器。然后,它发送一个绑定请求并接收响应。根据响应中的特定字节,它确定NAT类型并返回相应的结果。 请注意,由于NAT的复杂性和网络环境的多样性,这个脚本可能无法准确识别所有NAT类型。在实际应用中,还需要考虑更多的因素和测试方法来确定NAT类型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值