一、前置条件检查(必须满足)
1.1 检测 NAT 类型
下载 NatTypeTester,运行后选择 STUN 服务器测试:
┌─────────────────────────────────────────┐
│ NAT 类型检测结果 │
│ ───────────────────────────────────── │
│ NAT Type: FullCone (NAT1) ✅ 可以穿透 │
│ 或 NAT Type: Restricted (NAT2) ✅ 可以 │
│ NAT Type: Symmetric (NAT3/4) ❌ 放弃 │
└─────────────────────────────────────────┘NAT3/NAT4 无法打洞,需联系运营商改 NAT1,或光猫改桥接 + 路由器拨号。
1.2 网络环境优化
| 设备 | 推荐配置 |
|---|---|
| 光猫 | 改桥接模式,由路由器拨号(减少一层 NAT) |
| 路由器 | 开启 UPnP;或给运行 Lucky 的设备设置 DMZ |
| Lucky 安装位置 | 推荐直接装在拨号路由器上(OpenWrt/软路由),效率最高;如果是 Docker 需用 --net=host 模式 |
二、Lucky STUN 内网穿透配置
2.1 安装/登录 Lucky
访问: http://你的设备IP:16601
账号: 666
密码: 666
登录后务必在【设置】中修改密码2.2 添加 STUN 穿透规则(简易模式)
进入 STUN 内网穿透 → 穿透规则列表 → 添加穿透规则
┌─────────────────────────────────────────────────────┐
│ 【添加/编辑 STUN 穿透规则】 │
│ ───────────────────────────────────────────────── │
│ 规则名称: nas-web │
│ 启用规则: ☑️ 勾选 │
│ 操作模式: 简易模式 │
│ 穿透类型: IPv4-TCP │
│ 穿透通道监听端口: 0 (填0表示随机端口) │
│ 目标地址: 127.0.0.1 (Lucky和服务同设备) │
│ 目标端口: 5000 (你的NAS/Web服务端口) │
│ 防火墙自动放行: ☑️ 勾选 │
│ 启用 NAT-PMP: ☑️ 勾选 (或改用 UPNP) │
│ NAT-PMP/UPNP 网关地址: 192.168.1.1 (路由器地址) │
│ 保活间隔: 默认即可 │
└─────────────────────────────────────────────────────┘点击添加后,规则列表会显示:
┌─────────────────────────────────────────────────────┐
│ 规则名称 穿透公网地址 状态 │
│ ───────────────────────────────────────────────── │
│ nas-web 123.45.67.89:16666 ✅ 运行中 │
│ ↑ 这个地址每次重启会变! │
└─────────────────────────────────────────────────────┘用手机流量访问 http://123.45.67.89:16666 测试,确认能打开你的服务。三、域名托管到 Cloudflare
3.1 添加域名
- 登录 Cloudflare Dashboard
- 点击 添加站点,输入你的域名(如
example.com) - 选择 免费套餐
- 拿到 Cloudflare 提供的两个 DNS 服务器(如
lara.ns.cloudflare.com)
3.2 修改阿里云 DNS 服务器
阿里云域名控制台 → 域名列表 → 找到你的域名 → 管理
→ DNS 修改 → 修改 DNS 服务器
填入 Cloudflare 提供的两个地址
保存,等待 5-30 分钟生效3.3 创建 A 记录(占位)
进入 Cloudflare 域名管理 → DNS → 添加记录:
┌─────────────────────────────────────────┐
│ 类型: A │
│ 名称: @ (或你想用的子域名,如 stun) │
│ IPv4 地址: 1.1.1.1 (随便填,占位用) │
│ 代理状态: 🟡 已开启 (小云朵必须打开!) │
│ TTL: 自动 │
└─────────────────────────────────────────┘小云朵必须打开,但流量不经过 CDN 中转,只是用 Cloudflare 的规则功能。
四、Cloudflare 重定向规则配置(核心)
4.1 创建规则
进入 规则 → 重定向规则 → 创建规则
┌─────────────────────────────────────────────────────┐
│ 规则名称: ipv4-redirect │
│ 当传入请求匹配时: 自定义筛选表达式 │
│ ───────────────────────────────────────────────── │
│ 表达式: │
│ (http.host eq "stun.example.com") │
│ │
│ 则执行... URL 重定向 │
│ 类型: 动态 │
│ 表达式: │
│ concat("http://66.66.66.66:6666", http.request.uri.path) │
│ ↑ 先随便填一个 IP:端口,后面会被 Webhook 自动更新 │
│ │
│ 状态代码: 301 │
│ 保留查询字符串: 开启 │
└─────────────────────────────────────────────────────┘点击部署。
4.2 抓包获取 API 参数(关键步骤)
- 在重定向规则列表,点击刚才创建的规则 → 编辑
- 按 F12 打开浏览器开发者工具 → 切换到 网络/Network 标签
- 点击保存并部署
- 在 F12 中找到一条
PATCH请求,URL 类似:
https://dash.cloudflare.com/api/v4/zones/区域ID/rulesets/规则集ID/rules/规则ID提取三个关键参数:
- 区域 ID (zone_id):
zones/后面那串 - 规则集 ID (ruleset_id):
rulesets/后面那串 - 规则 ID (rule_id):
rules/后面那串
也可以参考 Cloudflare API 文档,通过 GET /zones/{zone_id}/rulesets 获取规则集 ID。五、Cloudflare API 令牌创建
进入 Cloudflare API 令牌 页面:
┌─────────────────────────────────────────────────────┐
│ 创建令牌 → 使用模板 → 编辑区域 DNS │
│ 或创建自定义令牌,权限选择: │
│ 区域 → 重定向规则 → 编辑 │
│ 区域 → 页面规则 → 编辑 (如果用旧版页面规则) │
│ 区域资源: 包括 → 特定区域 → 你的域名 │
│ 点击【继续以显示摘要】→ 创建令牌 │
│ 复制保存令牌(如: abcdef123456789) │
└─────────────────────────────────────────────────────┘六、Lucky Webhook 自动更新配置
回到 Lucky → STUN 内网穿透 → 编辑刚才的规则 → Webhook:
┌─────────────────────────────────────────────────────┐
│ 【Webhook 设置】 │
│ 启用 Webhook: ☑️ 勾选 │
│ ───────────────────────────────────────────────── │
│ 请求接口地址: │
│ https://api.cloudflare.com/client/v4/zones/ │
│ {区域ID}/rulesets/{规则集ID}/rules/{规则ID} │
│ │
│ 请求方法: PATCH │
│ ───────────────────────────────────────────────── │
│ 请求头: │
│ ┌─────────────────────────────────────────────┐ │
│ │ Authorization: Bearer 你的Cloudflare令牌 │ │
│ │ Content-Type: application/json │ │
│ └─────────────────────────────────────────────┘ │
│ ───────────────────────────────────────────────── │
│ 请求主体 (Body): │
│ { │
│ "action": "redirect", │
│ "expression": "(http.host eq \"stun.example.com\")", │
│ "description": "ipv4-redirect", │
│ "action_parameters": { │
│ "from_value": { │
│ "status_code": 301, │
│ "target_url": { │
│ "expression": "concat(\"http://#{ipAddr}\", http.request.uri.path)" │
│ }, │
│ "preserve_query_string": true │
│ } │
│ } │
│ } │
│ ───────────────────────────────────────────────── │
│ 接口调用成功包含的字符串: "success": true │
└─────────────────────────────────────────────────────┘测试 Webhook
点击 Webhook 手动触发测试,如果返回成功,回到 Cloudflare 查看规则,目标地址应已自动更新为 STUN 获取的 IP:端口。
七、IPv6 DDNS 配置(保持现有直连)
进入 Lucky → 动态域名(DDNS) → 添加任务:
┌─────────────────────────────────────────────────────┐
│ 【DDNS 任务设置】 │
│ 任务名称: ipv6-ddns │
│ 启用: ☑️ 勾选 │
│ 服务商: Cloudflare │
│ 令牌/密钥: 你的 Cloudflare API 令牌 │
│ ───────────────────────────────────────────────── │
│ IPv4: □ 不启用 │
│ IPv6: ☑️ 启用 │
│ 获取方式: 通过接口获取 或 网卡获取 │
│ ───────────────────────────────────────────────── │
│ 同步记录: │
│ 类型: AAAA │
│ 记录名: @ (或 www) │
│ 内容: {ipv6Addr} │
│ TTL: 自动 │
└─────────────────────────────────────────────────────┘这样 IPv6 用户访问 example.com 会直连你的设备,不走跳转。八、双栈访问效果验证
| 用户类型 | 访问地址 | 解析结果 | 实际访问路径 |
|---|---|---|---|
| IPv6 用户 | https://example.com | AAAA → 你的 IPv6 | 直连,速度快,无端口 |
| IPv4 用户 | https://example.com | A → Cloudflare | 301 跳转 → http://STUN_IP:端口 |
验证命令
# IPv6 解析测试
nslookup -q=aaaa example.com
# IPv4 解析测试
nslookup -q=a example.com
# 查看重定向规则是否生效
curl -I -L http://example.com
# 应看到 Location: http://123.45.67.89:16666九、进阶:HTTPS 安全访问(可选)
由于 STUN 获取的是 IP:端口,申请证书较麻烦,推荐双域名方案:
| 域名 | 用途 | 配置 |
|---|---|---|
example.com | 入口跳转 | Cloudflare 重定向规则 |
stun.example.com | 实际访问 | A 记录指向 STUN IP,申请证书 |
在 Cloudflare 重定向规则中,将目标改为:
concat("https://stun.example.com:#{port}", http.request.uri.path)然后在 Lucky 的 Web 服务 → 反向代理 中,给 stun.example.com 配置 TLS 证书(可用 Lucky ACME 模块自动申请)。
十、常见问题排查
| 问题 | 排查方法 |
|---|---|
| STUN 获取不到公网地址 | 检查是否 NAT1/NAT2;检查路由器 UPnP/DMZ;尝试关闭防火墙 |
| Webhook 测试失败 | 检查 Cloudflare 令牌权限;检查 zone_id/ruleset_id/rule_id 是否填对 |
| IPv4 访问跳转后打不开 | 确认 STUN 公网地址用手机流量能直接访问;检查路由器防火墙 |
| 端口频繁变化 | 正常现象,Webhook 会自动更新;若变化太频繁,尝试把 Lucky 直接装路由器上 |
评论 (0)