Lucky stun内网穿透配合CF重定向实现无公网ipv4访问和v4/v6分流

Lucky stun内网穿透配合CF重定向实现无公网ipv4访问和v4/v6分流

ZJ
ZJ
2026-01-13 / 0 评论 / 2 阅读 / 正在检测是否收录...

Test
本文需要实现的目标是,如何在家中设备没有公网ipv4,只有公网ipv6的情况下,实现外网只有ipv4环境时的访问,以及外网有ipv6环境时自动用v6地址访问,并且访问用的域名统一为一个泛域名,不用带端口。

一、前置准备

1.家庭宽带有公网ipv6。最好是路由器拨号,lucky安装在路由器,可以减少nat层数和端口转发设置。
2.在lucky的stun穿透页面测试nat类型,为nat1最好,如果是nat3一般也没有问题。但是nat4一般不行,可搜索如何降低nat层级。
3.有一个域名(最好是付费的,免费的二级域名可能有这样那样的问题),并且托管到CloudFlare(以下简称CF)。本文以 123.xyz 为例。
4.已经安装lucky,并会简单使用lucky的动态解析,反向代理等功能。

二、CF配置

1.账户主页有托管过来的域名,点击进去。右侧下滑到最底部,有账户ID和区域ID,待会儿要用。
Test
Test

2.点击DNS记录,添加一条A记录,名称填入通配符星号 。ipv4随便填一个即可,不产生实际作用,这里填入的8.8.8.8。代理状态勾选上,点亮小黄云。这里解释一下这样设置的作用。CF代理了 .123.xyz,以后访问如emby.123.xyz的时候,首先就会请求到CF这里来,然后根据我们后面会添加的规则,进行v4或者v6的重定向。注意如果之前已经有了这条二级泛域名的解析,直接勾选代理即可。同时删除或者关闭lucky的这一条动态域名配置。
Test

3.进入“规则”,点击“创建规则”,选择“重定向规则”。
Test

4.配置v4重定向规则
①规则名称为了区别,添加v4后缀
②选择自定义筛选表达式。
③然后按图示配置字段,运算符,和值。第一栏是之前DNS解析添加的泛域名,*.123.xyz;第二栏可以不配置,这里是一种示意,如果某个以 .123.xyz 结尾的域名已经作特殊使用了,就排除一下;第三栏填入的值 0.0.0.0/0,表示匹配所有的ipv4地址。
④重定向类型选择“动态”
⑤表达式填入下面的一段代码。中间的 ipv4 是为了区别于 ipv6,实现分流,端口号6211在v4重定向规则中随便填入,后面会通过lucky的webhook同步成stun穿透获取的公网端口。

wildcard_replace(http.request.full_uri, "*://*.123.xyz/*", "https://${2}.ipv4.123.xyz:6211/${3}")

⑥状态代码选择307或者302(一般是302,但某些应用中使用时,307才有效;具体差异我不懂)。
⑦勾选保留查询字符串

这里解释一下表达式的含义

wildcard_replace 表示将输入的内容以一定的规则进行截取并组合输出新的内容;
http.request.full_uri 表示传入的完整的URL;
"://.123.xyz/" 就是一个匹配规则,星号 部分的内容会被截取并顺序保存到变量${1} ${2} ${3}中,以供后续使用;
"https://${2}.ipv4.123.com:6211/${3}" 表示合成输出的内容 变量 ${2} ${3} 为刚才存储截取部分的变量

整个过程如下:

传入的URL:http://emby.123.xyz/web/index.html#!/home
通配符表达式:://.123.xyz/*
构建新的URL:https://${2}.123.com:6211/${3}
生成新的URL:https://emby.ipv4.123.com:6211/web/index.html#!/home
Test

5.配置v6重定向规则
直接从v4重定向规则复制,修改一下规则名称,修改ip源地址为2000::/3,URL重定向表达式,把ipv4替换为ipv6,端口号改为lucky反向代理监听地址
Test
Test

6.创建API令牌
点击页面右上角》配置文件》API令牌》创建令牌》(最底下)自定义令牌。
①名称说明用途即可
②权限添加 “账户》规则策略》编辑”
③权限添加 “区域》单一重定向》编辑”
④账户资源添加 “包括》你自己的账户”
⑤区域资源添加 “包括》特定区域》你的域名”
继续以显示摘要》创建令牌》复制令牌,保存到一个合适的位置,后面要用。
Test
Test
Test
Test
Test

以上是CF端的准备工作。总结一下:我们添加了一条二级泛域名解析.123.xyz,由CF代理,然后创建了两条重定向规则,根据不同的访问ip来源,再分别重定向到v4或v6的地址上去。接下来是lucky端的配置,需要用到三级泛域名.ipv4.123.xyz和*.ipv6.123.xyz,以及账户ID,区域ID,以及具有编辑账户规则策略和区域重定向规则权限的API令牌。

三、Lucky配置

如果lucky版本太过老旧,建议先升级到最新版。如果原来有二级泛域名*.123.xyz的解析,一定要先删除或者关闭,同时在CF的DNS解析记录也要删除。

1.配置DDNS(域名动态解析)
如果之前不是用的CF做动态解析,这里简单说一下配置方法:
首先也是要在CF创建一个API令牌,权限:区域》DNS》编辑;区域资源:包括》特定区域》123.xyz。然后保存好令牌。
编辑已有任务或者添加一个任务;托管商选择CF;Token填入刚刚创建的API令牌;{ipv4Addr}和{ipv6Addr}的开关都打开;添加同步记录;记录名填.ipv4.123.xyz,记录类型选择A;再添加一条同步记录,记录名填.ipv6.123.xyz,记录类型选择AAAA。
Test
Test

2.配置web服务的反向代理
这里已经会配置反向代理,并且已经配置有反向代理服务了。那么编辑已有的反向代理服务,前端地址中,添加两条带ipv4和ipv6字段的地址,后端地址保持不变。
Test

3.获取重定向规则的ID,实现通过CF提供的API修改规则内容
这里的过程就比较复杂了。为了实现stun穿透中的完整webhook,我们要先通过计划任务,分步骤获取一些id。

获取重定向规则集ID

①任务类型CallWeb
②接口地址:

https://api.cloudflare.com/client/v4/zones/区域ID/rulesets

③请求方法GET
④请求头:注意这里的API令牌不是用于动态解析的令牌,是上一节创建的令牌。

Authorization: Bearer API令牌
Content-Type: application/json

⑤勾选 禁用接口调用成功字符串检测
⑥保存并手动触发一次,点击任务执行日志,查找"http_request_dynamic_redirect", 位于其前面的那个ID才是我们需要的重定向规则集ID 。这里注意下json结构,每一个大括号括起来的部分是一个段落,不要往前看多了。
Test
Test

获取重定向规则ID
重定向规则集包含多个规则,v4和v6的,现在要获取v4规则的id
新增一个手动任务,除了接口地址,其余保持不变

https://api.cloudflare.com/client/v4/zones/区域ID/rulesets/重定向规则集ID

保存并手动触发一次,点击任务执行日志,查找v4的重定向名称,记住其后的ID
Test

测试更新

现在可以根据v4重定向规则的ID来修改内容了,再新建一条手动任务。
接口地址:

https://api.cloudflare.com/client/v4/zones/区域ID/rulesets/重定向规则集ID/rules/重定向规则ID

请求方式:PATCH
请求头:

Authorization: Bearer API令牌
Content-Type: application/json

请求体:

{
  "description": "stun-重定向-v4",
  "expression": "(http.host wildcard \"*.123.xyz\" and ip.src in {0.0.0.0/0})",
  "action": "redirect",
  "action_parameters": {
    "from_value": {
      "status_code": 302,
      "target_url": {
        "expression": "wildcard_replace(http.request.full_uri, \"*://*.123.xyz/*\", \"https://${2}.ipv4.123.xyz:6211/${3}\")"
      },
      "preserve_query_string": true
    }
  }
}

这些内容具体可以从刚刚的“ 获取重定向规则ID ”的日志中查看到:
description 是v4重定向规则的名字。
expreession 可以从日志中复制出来,或者在CF的重定向规则编辑页面有表达式的预览可以复制,但注意内部的引号需要加反斜杠\。
target_url中的expression 也可以从日志中复制,或者CF的重定向规则编辑页面复制表达式,但注意内部的引号需要加反斜杠\。
端口随便改一个不一样的,确认后手动触发一次,再回到CF的重定向规则编辑页面,看看是否已经成功修改成新内容。
Test
Test

4.stun内网穿透设置

现在创建一个stun穿透任务
①取一个描述作用的名称
②穿透类型选择TCP,UDP也可以
③穿透通道本地端口填一个没有使用的,或者填0,会使用随机端口
④开启防火墙自动放行
⑤目标地址:哪个设备要使用这个穿透就填谁的ip。这里,是供lucky的反向代理用的,lucky装在路由器上,就填192.168.31.1
⑥目标端口,就填lucky反向代理的监听端口
⑦打开WebHook开关,下面内容就复用上面创建的最有一条手动任务。请求体有所不同的是,端口号改成了lucky提供的变量#{port},表示传入stun穿透获取到的公网端口。
⑧调用成功填入 "success": true

{
  "description": "stun-重定向-v4",
  "expression": "(http.host wildcard \"*.123.xyz\" and ip.src in {0.0.0.0/0})",
  "action": "redirect",
  "action_parameters": {
    "from_value": {
      "status_code": 302,
      "target_url": {
        "expression": "wildcard_replace(http.request.full_uri, \"*://*.123.xyz/*\", \"https://${2}.ipv4.123.xyz:#{port}/${3}\")"
      },
      "preserve_query_string": true
    }
  }
}

Test

可以点击“WebHook手动触发测试”,看一下CF规则页面是否修改,lucky是否返回成功。保存后,stun穿透开始运行,最终成功的情况如下图。看CF规则页面的表达式中的端口是否变成了stun穿透获取的公网端口,这里是6211。

5.测试成果及后续工作

现在在浏览器输入emby.123.xyz,应该就可以跳转到emby.ipv4.123.xyz:6211这个地址了。如果是在v6环境下访问,比如手机流量,那么会自动跳转到emby.ipv6.123.xyz:15556。
Test

对于.ipv4.123.xyz和.ipv6.123.xyz,这两个三级泛域名,可以在lucky中配置上自动申请证书,即可使用https加密访问啦。

本文共 2192 个字数,平均阅读时长 ≈ 6分钟
0

评论 (0)

取消