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种组合

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


您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

<think>我们之前讨论的是如何设计实验验证路由器的NAT类型(静态NAT、动态NAT、PAT),但用户现在的问题是基于RFC3489(STUN协议)的NAT类型分类(对称型、全锥形、受限锥形、端口受限锥形)。因此,我们需要调整实验方案,采用STUN(Session Traversal Utilities for NAT)协议的方法来检测NAT行为。 根据引用[1]的内容,NAT类型的判断由客户端完成,通过两种测试方法: - 测试1:客户端(IP:A, PORT:A)向服务器(IP:B, PORT:B)发送消息,服务器从相同的IP和端口(B, B)响应。 - 测试2:客户端(IP:A, PORT:A)向服务器(IP:B, PORT:B)发送消息,服务器从不同的端口(IP:B, PORT:C)响应。 通过这两个测试,结合客户端是否能收到响应以及响应的来源,可以判断NAT类型。 实验设计目标:区分对称NAT、全锥形NAT、受限锥形NAT、端口受限锥形NAT。 实验原理:利用STUN服务器发送测试包,观察NAT映射和过滤行为。 - 映射行为(Mapping Behavior):NAT如何分配公网IP和端口给内网主机(是否根据目标地址改变映射)。 - 过滤行为(Filtering Behavior):NAT是否允许外部不同主机的数据包进入(根据来源地址和端口)。 实验步骤: 1. 准备环境: - 客户端:位于待测NAT路由器内网,具有私有IP地址。 - 两个STUN服务器:位于公网,具有不同IP地址(或同一服务器使用两个不同端口)。 - 网络拓扑:客户端通过待测NAT路由器连接互联网。 2. 测试步骤: **测试1:绑定测试(Binding Test)** - 客户端向STUN服务器1(IP:B, PORT:B)发送请求。 - STUN服务器1从相同的IP和端口(B, B)回复,并在回复中告知客户端它看到的客户端公网IP和端口(即NAT映射后的地址,记为X:x)。 **测试2:改变IP测试(改变服务器IP)** - 客户端向STUN服务器2(IP:C, PORT:C)发送请求(注意:IP不同)。 - STUN服务器2从(C, C)回复,并告知客户端它看到的公网IP和端口(记为Y:y)。 **测试3:改变端口测试(改变服务器端口)** - 客户端向STUN服务器1的另一个端口(IP:B, PORT:D)发送请求。 - STUN服务器1从(B, D)回复,并告知客户端它看到的公网IP和端口(记为Z:z)。 3. 判断映射行为(Mapping Behavior): - 如果X:x == Y:y == Z:z,则映射是独立的(Endpoint-Independent)-> 锥形NAT(包括全锥、受限、端口受限)。 - 如果X:x == Y:y 但 Z:z不同(因为目标端口改变),则映射是地址依赖(Address-Dependent)-> 受限锥形NAT或端口受限锥形NAT(需要进一步判断过滤行为)。 - 如果每次映射都不同(X:x, Y:y, Z:z都不同),则映射是端口和地址依赖(Address and Port-Dependent)-> 对称NAT。 4. 判断过滤行为(Filtering Behavior): - 在测试1后,客户端已经知道自己的公网映射地址(X:x)。我们让另一个公网主机(可以是STUN服务器1)尝试向(X:x)发送数据包(从不同的IP和/或端口)。 - 测试4:从STUN服务器1(IP:B, PORT:B)向(X:x)发送一个数据包(注意:这个数据包不是对客户端请求的响应,而是主动发送)。 - 测试5:从STUN服务器2(IP:C, PORT:C)向(X:x)发送一个数据包。 - 测试6:从STUN服务器1的不同端口(IP:B, PORT:E)向(X:x)发送一个数据包。 观察客户端是否能收到这些数据包: - 如果测试4、5、6都能收到,则过滤行为是“端点独立”(Endpoint-Independent Filtering)-> 全锥形NAT。 - 如果测试4能收到,测试5收不到(不同IP),测试6能收到(相同IP不同端口),则过滤行为是“地址依赖”(Address-Dependent Filtering)-> 受限锥形NAT。 - 如果测试4能收到,测试5收不到,测试6也收不到(因为端口不同),则过滤行为是“地址和端口依赖”(Address and Port-Dependent Filtering)-> 端口受限锥形NAT。 5. 综合判断NAT类型: - 全锥形NAT:映射行为是端点独立,过滤行为也是端点独立。 - 受限锥形NAT:映射行为是端点独立(或地址依赖?注意:这里映射行为是端点独立,但过滤行为是地址依赖),但实际上,在锥形NAT中,映射行为通常是端点独立的(即映射后的地址端口对不随目标改变),而过滤行为不同。 - 端口受限锥形NAT:映射行为端点独立,过滤行为地址和端口依赖。 - 对称NAT:映射行为地址和端口依赖(即每次不同的目标地址端口对,都会产生新的映射)。 注意:对称NAT不需要测试过滤行为,因为它的映射行为已经决定了它是对称型。 实验步骤总结: | 测试编号 | 测试内容 | 观察点 | |----------|------------------------------------------|---------------------------| | Test1 | 客户端->服务器1(B:B),服务器1(B:B)响应 | 得到映射地址X:x | | Test2 | 客户端->服务器2(C:C),服务器2(C:C)响应 | 得到映射地址Y:y | | Test3 | 客户端->服务器1(B:D),服务器1(B:D)响应 | 得到映射地址Z:z | | Test4 | 服务器1(B:B)主动发送数据到X:x | 客户端是否收到? | | Test5 | 服务器2(C:C)主动发送数据到X:x | 客户端是否收到? | | Test6 | 服务器1(B:E)主动发送数据到X:x | 客户端是否收到? | 根据结果判断: 1. 映射行为: - 如果X:x == Y:y == Z:z:端点独立映射(锥形NAT)。 - 如果X:x == Y:y 但 Z:z不同(因为目标端口改变):地址依赖映射(实际上,在锥形NAT中,映射行为通常是端点独立,所以这种情况很少见,通常对称型才会改变映射)。因此,我们主要关注是否相同。 - 如果X:x != Y:y 且 X:x != Z:z:对称NAT(地址和端口依赖映射)。 2. 如果映射行为是端点独立(锥形NAT),则进一步判断过滤行为: - 如果Test4、Test5、Test6都收到:全锥形NAT。 - 如果Test4收到、Test5收不到、Test6收到:受限锥形NAT(因为Test5是不同IP,Test6是相同IP不同端口,但受限锥形只限制IP,不限制端口,所以Test6应该能收到?这里需要澄清:实际上,受限锥形要求IP相同,端口任意,所以Test6应该能收到;而端口受限锥形要求IP和端口都相同,所以Test6收不到)。 - 如果Test4收到,Test5收不到,Test6也收不到:端口受限锥形NAT。 注意:在测试过滤行为时,Test4、5、6发送的数据包必须是同一协议(UDP)且发送到相同的映射地址X:x。 实验工具: - 客户端:可以使用支持STUN的客户端软件(如pystun3)或自行编写(使用UDP套接字)。 - STUN服务器:可以使用公共STUN服务器(如stun.l.google.com:19302)或自建(如coturn)。 实验记录: - 记录每个测试中客户端收到的响应,以及主动发送的数据包是否到达。 - 根据记录结果对照上述判断标准。 实验注意事项: - 确保客户端没有防火墙阻挡UDP包。 - 确保STUN服务器在公网可达。 - 测试过滤行为时,主动发送的数据包不能是之前请求的响应(必须是未经请求的数据包)。 相关问题: 1. 在实验中,如何确保测试过滤行为时发送的数据包是未经请求的? 2. 对称NAT和端口受限锥形NAT在行为上有什么主要区别? 3. 如何自建STUN服务器进行测试?</think>### 实验设计:验证路由器NAT类型对称型/锥形) 根据RFC3489标准[^1],通过UDP协议行为可判断NAT类型。实验需部署STUN服务器和客户端,通过**映射行为**和**过滤行为**两个维度检测。以下是分步实验方案: --- ### **实验拓扑** ```mermaid graph LR A[客户端] --> B[待测NAT路由器] B --> C[STUN服务器1 IP_B:Port_B] B --> D[STUN服务器2 IP_C:Port_C] ``` --- ### **核心测试原理** 1. **映射行为** - NAT是否对同一内网主机分配固定公网(IP:Port) - 公式:$M_{client} = f(S_{src}, D_{dst})$ - $S_{src}$:内网源地址 - $D_{dst}$:目标服务器地址 2. **过滤行为** - NAT是否允许外部不同主机主动连接映射后的(IP:Port) --- ### **实验步骤** #### **阶段1:基础连接测试** 1. 客户端向STUN服务器1(IP_B:Port_B)发送UDP请求 2. 服务器1从**相同IP和端口**(IP_B:Port_B)响应 - ✅ 收到响应 → NAT允许入站通信 - ❌ 未收到 → 防火墙阻断UDP或对称NAT #### **阶段2:映射行为测试** ```python # 伪代码:客户端测试逻辑 def test_mapping(): resp1 = send_request(server1) # 目标 Server1:Port_B resp2 = send_request(server2) # 目标 Server2:Port_C resp3 = send_request(server1, port=D) # 目标 Server1:Port_D # 比较NAT分配的映射端口 if resp1.mapped_port == resp2.mapped_port == resp3.mapped_port: return "端点独立映射" # 锥形NAT特征 else: return "地址依赖映射" # 对称NAT特征 ``` #### **阶段3:过滤行为测试** | 测试场景 | 允许通信 | NAT类型推断 | |------------------------------|----------|---------------------| | 同IP同端口(Server1:Port_B) | ✅ | 全锥形NAT必要条件 | | 同IP不同端口(Server1:Port_E)| ✅/❌ | 区分受限/端口受限 | | 不同IP(Server2:Port_B) | ✅/❌ | 区分全锥/受限 | --- ### **NAT类型判定表** | 测试结果 | 映射行为 | 过滤行为 | NAT类型 | |------------------------------|----------------|------------------------|-----------------| | 映射端口一致 + 允许任意外部连接 | 端点独立 | 端点独立 | 全锥形NAT | | 映射端口一致 + 仅允已知IP | 端点独立 | 地址依赖 | 受限锥形NAT | | 映射端口一致 + 仅允已知(IP:Port)| 端点独立 | 地址端口依赖 | 端口受限锥形NAT | | 不同目标映射端口不同 | 地址端口依赖 | 地址端口依赖 | 对称NAT | | 无响应 | - | - | UDP被防火墙阻断 | --- ### **实验工具与配置** 1. **STUN服务器** - 部署两个公网服务器(如AWS实例) - 开启UDP端口:Port_B(默认3478)、Port_C、Port_D - 实现RFC3489响应逻辑[^1] 2. **客户端** - 使用Python socket库发送测试UDP包 - 记录响应包的源地址和端口 --- ### **验证示例** - **对称NAT验证** ```log 请求1 → Server1:Port_B → 映射端口: 5000 请求2 → Server2:Port_C → 映射端口: 5001 # 映射端口变化 请求3 → Server1:Port_D → 映射端口: 5002 # 映射端口变化 ``` - **全锥形NAT验证** ```log 所有请求映射端口均为5000 Server2主动连接5000 → 客户端收到数据 # 允许任意外部连接 ``` --- ### **注意事项** 1. 需确保客户端无防火墙干扰 2. STUN服务器需部署在纯公网环境 3. 每个测试重复3次避免偶发错误 4. 对称NAT常见于企业网络,锥形NAT多见于家用路由器[^1] --- ### 相关问题 1. 如何区分端口受限锥形NAT对称NAT? 2. 在NAT类型检测中,TCP协议是否适用? 3. 如何通过实验验证NAT映射超时时间? > 实验设计基于RFC3489标准[^1],通过系统化测试可精准识别NAT行为特征。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值