STUN 内网穿透
STUN(Session Traversal Utilities for NAT)穿透利用 STUN 协议探测本机的公网 IP 和端口,并结合 UPnP 或 NATMAP 技术实现端口映射,从而让外网设备能够直接访问内网服务。
技术原理
STUN / TURN / ICE 协议体系
内网穿透领域有三个核心协议,各有不同用途:
| 协议 | 全称 | 作用 |
|---|---|---|
| STUN | Session Traversal Utilities for NAT | 探测公网 IP 和端口,判断 NAT 类型 |
| TURN | Traversal Using Relays around NAT | 通过中继服务器转发流量(兜底方案) |
| ICE | Interactive Connectivity Establishment | 综合使用 STUN/TURN,自动选择最优连接路径 |
STUN 探测原理
内网设备 STUN 服务器(公网)
│ │
│ 1. 发送 Binding Request │
│ ─────────────────────────→ │
│ │
│ 2. 返回 Binding Response │
│ 包含:公网IP:端口 │
│ ←───────────────────────── │
│ │
│ 3. 设备获知自己的公网地址 │STUN 服务器帮助设备发现自己在 NAT 后的公网地址,但不转发数据流量。
UPnP 端口映射原理
内网设备 家用路由器(支持 UPnP)
│ │
│ 1. 发送 UPnP 映射请求 │
│ "请将外网端口 22222 │
│ 映射到我的 22 端口" │
│ ─────────────────────────→ │
│ │
│ 2. 路由器建立端口映射 │
│ 外网:22222 → 内网:22 │
│ ←───────────────────────── │
│ │
外网用户 ──→ 路由器公网IP:22222 ──→ 内网设备:22P2P 打洞流程(适用于 Full Cone / Restricted NAT)
设备 A(内网) 信令服务器 设备 B(内网)
│ │ │
│ 1. 注册公网地址 │ │
│ ──────────────────→ │ │
│ │ 2. 注册公网地址 │
│ │ ←──────────────── │
│ │ │
│ 3. 获取 B 的公网地址 │ │
│ ←────────────────── │ │
│ │ 4. 获取 A 的公网地址│
│ │ ──────────────────→ │
│ │ │
│ 5. 同时向对方发送 UDP 包(打洞) │
│ ─────────────────────────────────────────→ │
│ ←───────────────────────────────────────── │
│ │ │
│ 6. P2P 直连建立成功! │
│ ←─────────────────────────────────────────→│Symmetric NAT 无法打洞
如果你的网络是 对称型 NAT(Symmetric NAT),每次连接都会分配不同的外网端口,P2P 打洞将无法成功。
判断方法: 使用在线 STUN 检测工具,如果检测结果显示 "Symmetric NAT",建议改用 FRP 客户端 或 EasyTier 进行中转穿透。
常见 Symmetric NAT 场景:
- 运营商 CGNAT(多层 NAT)
- 企业级防火墙
- 4G/5G 移动网络
功能概述
- 自动探测公网 IP 和映射端口
- 支持 UPnP 自动端口映射(适用于支持 UPnP 的路由器)
- 支持 NATMAP 端口保持(适用于全锥形 NAT)
- IP 或端口变化时可触发回调,自动更新 DDNS 或其他配置
- 支持有效性检测,验证穿透是否成功
适用场景
| 场景 | 是否适用 | 说明 |
|---|---|---|
| 家庭宽带 + 支持 UPnP 的路由器 | ✅ 最佳 | 自动映射,无需手动配置 |
| 家庭宽带 + Full Cone NAT | ✅ 适用 | 使用 NATMAP 保持映射 |
| 家庭宽带 + Restricted NAT | ⚠️ 有限 | 仅适合特定场景 |
| 运营商 CGNAT / Symmetric NAT | ❌ 不适用 | 建议改用 FRP/EasyTier |
| 企业网络 | ❌ 通常不适用 | 企业防火墙通常阻止 UPnP |
配置说明
进入 STUN 内网穿透 页面,点击 新建 按钮:
基础配置
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 名称 | 字符串 | ✅ | — | 规则名称 |
| 启用 | 布尔 | ✅ | true | 是否启用 |
| 转发 IP/域名 | 字符串 | ✅ | — | 内网服务地址(如 127.0.0.1) |
| 转发端口 | 整数 | ✅ | — | 内网服务端口 |
| 触发回调 | 选择 | ❌ | — | IP/端口变化时触发的回调任务 |
UPnP 配置
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 使用 UPnP | 布尔 | ❌ | false | 是否通过 UPnP 在路由器上自动映射端口 |
| UPnP 外部端口 | 整数 | ❌ | 随机 | 指定 UPnP 映射的外部端口(0 表示随机) |
NATMAP 配置
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 使用 NATMAP | 布尔 | ❌ | false | 是否使用 NATMAP 保持端口映射 |
| NATMAP 服务器 | 字符串 | ❌ | — | NATMAP 服务器地址 |
配置示例
示例:通过 UPnP 穿透访问内网 SSH
将内网 SSH 服务(22 端口)通过 UPnP 映射到公网,并在 IP 变化时触发 DDNS 回调:
| 字段 | 值 |
|---|---|
| 名称 | SSH 穿透 |
| 转发 IP/域名 | 127.0.0.1 |
| 转发端口 | 22 |
| 使用 UPnP | ✅ |
| UPnP 外部端口 | 22222 |
| 触发回调 | 选择已配置的回调任务 |
配置完成后,可通过 公网IP:22222 访问内网 SSH。
查看穿透状态
在规则列表中,每条规则会显示:
- 当前公网 IP:STUN 探测到的公网地址
- 当前端口:映射的公网端口
- 最后更新时间:上次成功探测的时间
- 状态:运行中 / 探测失败 / 已停止
常见问题
Q:STUN 探测失败,无法获取公网 IP?
排查步骤:
- 确认网络连接正常,可以访问外网
- 检查防火墙是否阻止了 UDP 流量(STUN 使用 UDP 协议)
- 尝试更换 STUN 服务器地址
- 如果在企业网络中,可能被防火墙拦截,建议改用 FRP
Q:UPnP 映射失败?
排查步骤:
- 登录路由器管理界面,确认 UPnP 功能已开启
- 部分路由器需要重启才能生效
- 检查是否有其他设备占用了相同的外网端口
- 某些运营商光猫可能不支持 UPnP,需要在光猫上设置 DMZ 或端口映射
Q:穿透成功但外网无法访问?
排查步骤:
- 使用在线端口检测工具验证端口是否开放
- 确认内网服务正在运行(
telnet 127.0.0.1 <端口>) - 检查本机防火墙是否放行了该端口
- 如果是动态公网 IP,确认 DDNS 已更新到最新 IP
Q:IP 或端口频繁变化?
解决方法:
- 配置 触发回调 功能,在 IP/端口变化时自动更新 DDNS
- 使用 NATMAP 模式保持端口稳定
- 联系运营商申请固定公网 IP
注意事项
NAT 类型限制
STUN 穿透对 NAT 类型有要求。全锥形 NAT(Full Cone NAT) 效果最好;对称型 NAT(Symmetric NAT) 通常无法穿透,建议改用 FRP 或 EasyTier。
路由器 UPnP 设置
使用 UPnP 功能前,需要在路由器管理界面中开启 UPnP 功能。大多数家用路由器默认开启,企业路由器可能默认关闭。
与回调系统配合
STUN 穿透最常见的用法是配合 回调系统 使用:当公网 IP 或端口发生变化时,自动触发回调更新 DDNS 解析记录或 CDN 回源配置。详见 回调系统。