前言:

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

一、前置准备

家庭宽带有公网ipv6。最好是路由器拨号,lucky安装在路由器,可以减少nat层数和端口转发设置。

在lucky的stun穿透页面测试nat类型,为nat1最好,如果是nat3一般也没有问题。但是nat4一般不行,可搜索如何降低nat层级。

有一个域名(最好是付费的,免费的二级域名可能有这样那样的问题),并且托管到CloudFlare(以下简称CF)。本文以 123.xyz 为例。

已经安装lucky,并会简单使用lucky的动态解析,反向代理等功能。

二、CF配置

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


2.点击DNS记录,添加一条A记录,名称填入通配符星号* 。ipv4随便填一个即可,不产生实际作用,这里填入的8.8.8.8。代理状态勾选上,点亮小黄云。

这里解释一下这样设置的作用。CF代理了*.123.xyz,以后访问如emby.123.xyz的时候,首先就会请求到CF这里来,然后根据我们后面会添加的规则,进行v4或者v6的重定向。

注意如果之前已经有了这条二级泛域名的解析,直接勾选代理即可。同时删除或者关闭lucky的这一条动态域名配置。

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

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

5.配置v6重定向规则

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


6.创建API令牌

        点击页面右上角》配置文件》API令牌》创建令牌》(最底下)自定义令牌。

        ①名称说明用途即可

        ②权限添加 "账户》规则策略》编辑"

        ③权限添加 "区域》单一重定向》编辑"

        ④账户资源添加 "包括》你自己的账户"

        ⑤区域资源添加 "包括》特定区域》你的域名"

        继续以显示摘要》创建令牌》复制令牌,保存到一个合适的位置,后面要用。




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

三、Lucky配置

我用的lucky版本是2.18.4,如果版本太过老旧,建议先升级到最新版。如果原来有二级泛域名*.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。


2.配置web服务的反向代理

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

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结构,每一个大括号括起来的部分是一个段落,不要往前看多了。   


        获取重定向规则ID

        重定向规则集包含多个规则,v4和v6的,现在要获取v4规则的id

        新增一个手动任务,除了接口地址,其余保持不变

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

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

        测试更新

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

        接口地址:        

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

        请求方式:PATCH
        请求头:不变
        请求体:        

{
  "description": "stun-重定向-v4",
  "expression": "(http.host wildcard \"*.123.xyz\" and not http.host contains \"nas.123.xyz\" and ip.src in {0.0.0.0/0})",
  "action": "redirect",
  "action_parameters": {
    "from_value": {
      "status_code": 307,
      "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的重定向规则编辑页面,看看是否已经成功修改成新内容。


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 not http.host contains \"nas.123.xyz\" and ip.src in {0.0.0.0/0})",
  "action": "redirect",
  "action_parameters": {
    "from_value": {
      "status_code": 307,
      "target_url": {
        "expression": "wildcard_replace(http.request.full_uri, \"*://*.123.xyz/*\", \"https://${2}.ipv4.123.xyz:#{port}/${3}\")"
      },
      "preserve_query_string": true
    }
  }
}


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


5.测试成果及后续工作

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

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

        另外要注意,这种方式对于浏览器web服务有效,但对于应用内的登录是否有效,就要看每个应用的支持情况了。

Last modification:March 6th, 2026 at 03:38 pm
如果觉得我的文章对你有用,请随意赞赏