NAT的四种类型



简述

基于UDP的P2P应用需要考虑NAT的类型,因为不同的NAT组合的穿透的方式并不一致,有的能通, 有的不能通。

一般来讲, NAT可以分为四种类型,分别是:

 

1, 全锥型(Full Cone)

2,  受限锥型(Restricted Cone), 或者说是IP受限锥型

3,  端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型

4,  对称型(Symmetric)

其中1,2,3属于同一种类型,都是锥型,区别只是路由器的不同的安全策略。

还有些NAT不属于这四种中的任何一种,就不在本文的讨论范围了。

 

为什么有四种类型的NAT

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

假定

公网server1 ip是1.1.1.1, 监听端口是1111

公网server2 ip是2.2.2.2, 监听端口是2222

NAT router ip是8.8.8.8

NAT内部client是192.168.0.3

client发送数据的时候,不管是tcp还是udp必须本地绑定一个端口,一般来讲,这个过程都是自动的。

假定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)之间的报文都通过这个映射关系进行转发。

NAT之间主要的区别分两种情况讨论

1:

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)<--->(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 这就是对称型NAT

注:  (8.8.8.8, 801)只是举例,到底用什么端口取决于路由器的端口管理策略,总之是另外的一个端口,有的路由器有多个公网IP,不同的IP也会参与到这个映射关系中。

2:

client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射关系后,如果这个时候路由器(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有10种组合

全锥型 全锥型
全锥型 受限锥型
全锥型 端口受限锥型
全锥型 对称型
受限锥型 受限锥型
受限锥型 端口受限锥型
受限锥型 对称型
端口受限锥型端口受限锥型
端口受限锥型对称型✘, 无法打通
对称型对称型✘, 无法打通

  • 29
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
NAT穿越服务器概要设计 编写目的 多媒体会话信令协议是在准备建立媒体流传输的代理之间交换信息的协议,例如SIP、RTSP、H.323等。媒体流与信令流截然不同,它们所采用的网络通道也不一致。由于协议自身设计上的原因,使得媒体流无法直接穿透网络地址转换/防火墙(NAT/FW)。因为它们生存期的目标只是为了建立一个在信息中携带IP地址的分组流,这在遇到NAT/FW 时会带来许多问题。而且这些协议的目标是通过建立P2P(Peer to Peer)媒体流以减小时延,而协议本身很多方面却与NAT存在兼容性问题,这也是穿透 NAT/FW的困难所在。 而NAT仍是解决当前公用IP地址紧缺和网络安全问题的最有力手段,它主要有四种类型:完全锥型NAT(Full Cone NAT),地址限制锥型NAT (Address Restricted Cone NAT),端口限制锥型NAT (Port Restricted Cone NAT),对称NAT (Symmetric NAT)。前三种NAT,映射与目的地址无关,只要源地址相同,映射就相同,而对称NAT的映射则同时关联源地址和目的地址,所以穿透问题最为复杂。 不少方案已经被应用于解决穿越NAT问题,例如:ALGs(Application Layer Gateways)、Middlebox Control Protocol、STUN (Simple Traversal of UDP through NAT)、TURN(Traversal Using Relay NAT)、ICE(Interactive Connectivity Establishment)、RSIP(Realm Specific IP)、symmetric RTP等。 本文档描述基于STUN/TURN协议解决穿越NATNAT穿越服务器(Nat Traversal Server)的概要设计说明书。
├ 第1章 网络技术基础,网盘文件,永久连接 │ │ 1、考点1:计算机网络的形成与发展.mp4 │ │ 2、考点2:计算机网络的基本概念.mp4 │ │ 3、考点3:数据报交换与虚电路交换.mp4 │ └ 4、考点4:网络体系结构与网络协议.mp4 ├ 第2章 局域网基础 │ │ 5、考点1:局域网的各类型及其特点.mp4 │ │ 6、考点2:Ethernet工作原理及帧结构.mp4 │ │ 7、考点3:交换式局域网与虚拟局域网.mp4 │ │ 8、考点4:高速局域网的各类型.mp4 │ └ 9、考点5:无线局域网技术.mp4 ├ 第3章 Internet基础 │ │ 10、考点1:Internet的组成与其接入方式.mp4 │ │ 11、考点2:IP服务特点与工作原理及数据报.mp4 │ │ 12、考点3:组播技术与IPv6地址表示.mp4 │ │ 13、考点4:路由与路由选择.mp4 │ └ 14、考点5:ICMP、UDP与NAT.mp4 ├ 第4章 Internet基本服务 │ │ 15、考点1:客户机服务器和对等计算模型.mp4 │ │ 16、考点2:域名系统(DNS)的过程.mp4 │ │ 17、考点3:远程登录与FTP服务.mp4 │ │ 18、考点4:电子邮件系统(E-mail).mp4 │ └ 19、考点5:浏览器(Web)服务.mp4 ├ 第5章 新型网络应用 │ │ 20、考点1:即时通信系统模型及通信协议.mp4 │ │ 21、考点2:P2P文件共享和网络搜索.mp4 │ └ 22、考点3:VOD与VOIP技术.mp4 └ 第6章 网络管理与网络安全 │ 23、考点1:网络管理及管理协议.mp4 │ 24、考点2:网络安全和加密与认证技术.mp4 └ 25、考点3:安全协议、防火墙与入侵检测技术.mp4
以下是一个用于检测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类型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值