前言
- 本人为网络技术小白,本文内容基于网络大佬分享的知识整理融合,仅作个人备忘。
- 核心目标:家庭设备仅有公网 IPv6、无公网 IPv4 时,实现外网 IPv4 环境访问、IPv6 环境自动分流,且统一使用不带端口的泛域名访问。
一、前置准备
- 网络环境:家庭宽带有公网 IPv6,路由器拨号(推荐,减少 NAT 层数和端口转发配置)。
- NAT 类型:Lucky 的 STUN 穿透页面测试,NAT1 最佳,NAT3 通常可用,NAT4 需搜索降低层级方法。lucky 的 stun 页面可以测试,如果不是就不用看本篇文章了
- 域名与 CF 托管:拥有一个域名(推荐付费,免费二级域名可能存在问题),并托管至 Cloudflare(简称 CF),本文以
123.xyz为例。
- 软件基础:已安装 Lucky,会使用其动态解析、反向代理功能(本文使用 Lucky 2.23.3,老旧版本建议升级)。
二、Cloudflare(CF)配置
1. 获取账户 ID
- 登录 CF 账户,进入托管的域名页面(如
123.xyz)。
- 右侧下滑至底部,复制「账户 ID」(后续配置需使用)。
![]()

2. 添加 DNS 泛域名解析
- 进入「DNS」→「添加记录」:
- 类型:CNAME 记录
- 名称:通配符
*(表示 *.123.xyz)
- 目标:cf.090227.xyz(优选地址 `)
- 代理状态:不勾选
![]()

4. 创建 API 令牌(用于 Lucky 调用 CF 接口)
- 主页右下角「API」→「获取您的 API 令牌」→「创建令牌」→「自定义令牌」:
-
令牌名称:描述用途(如「workers」)
-
权限添加:
- 账户 → workers 脚本 → 编辑
-
资源设置:
- 账户资源 → 包括 → 所有帐户
-
完成创建后,复制令牌并保存(仅显示一次)。
![]()

![]()

三、Lucky 配置
1. 配置 DDNS(域名动态解析)
目标:实现 *.ipv4.123.xyz(A 记录)和 *.ipv6.123.xyz(AAAA 记录)的动态解析。
(1)创建 CF DNS API 令牌(单独用于 DDNS)
- CF 中创建令牌,权限:区域 → DNS → 编辑;区域资源:包含
123.xyz,保存令牌。
![]()

(2)Lucky DDNS 配置
2. 配置反向代理(已有代理可直接编辑)
3. STUN 内网穿透设置(核心配置)
- 进入 Lucky「穿透」→「添加穿透规则」:
- 规则名称:
随便填
- 穿透类型:TCP(或 UDP)
- 穿透通道本地端口:填 0(随机分配)
- 关闭:防火墙自动放行
- 目标地址:Lucky 所在设备 IP(路由器 IP,如
192.168.5.2)
- 目标端口:Lucky 反向代理监听端口(如 16667)
![]()

- 启用 WebHook:
- 接口地址:`[[api.cloudflare.com/client/v4/accounts/账户 ID/workers/scripts/redirect]
- 请求方法:PUT
- 请求头:Authorization: Bearer 之前生成的 API 令牌
Content-Type: application/javascript
- 请求体 :
json
const CONFIG = {
sourceDomain: '123.xyz',
ipv4: { targetDomain: 'ipv4.123.xyz', port: Number(#{port}) || 80 },
ipv6: { targetDomain: 'ipv6.123.xyz', port: 16667 }
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
try {
const url = new URL(request.url);
const hostname = url.hostname.toLowerCase();
// 过滤非目标域名
if (!hostname.includes(CONFIG.sourceDomain.toLowerCase())) {
return new Response('Not Found', { status: 404 });
}
// 提取子域名(简化版)
const subdomain = hostname === CONFIG.sourceDomain
? ''
: hostname.replace(`.${CONFIG.sourceDomain}`, '');
// 识别IP版本(简化逻辑,保留双校验)
let ipVersion = request.headers.get('CF-IPVersion');
if (!['4','6'].includes(ipVersion)) {
const ip = request.headers.get('CF-Connecting-IP');
ipVersion = ip?.includes(':') ? '6' : '4';
}
// 拼接目标URL(用URL对象避免手动拼接错误)
const targetConf = ipVersion === '6' ? CONFIG.ipv6 : CONFIG.ipv4;
const targetHost = subdomain ? `${subdomain}.${targetConf.targetDomain}` : targetConf.targetDomain;
const targetUrl = new URL(url);
targetUrl.host = `${targetHost}:${targetConf.port}`;
// 307重定向
return Response.redirect(targetUrl.toString(), 307);
} catch (e) {
// 极简异常兜底
return new Response('Server Error', { status: 500 });
}
}
- 接口调用成功包含的字符串:
"success": true
- 保存后,执行「WebHook 手动触发测试」,确认 CF 规则中的端口已同步为 STUN 获取的公网端口。
![]()

四、CF workers绑定路由
- 进workers之后就可以看到已经有一个workers在运行了。这时候需要绑定路由才可以使workers生效

- 点进去之后点设置,添加路由

- 选择区域-你自己的域名,路由,自动生成*.123.xyz/*

五、测试成果与后续工作
1. 功能测试
- IPv4 环境访问:浏览器输入
emby.123.xyz,自动跳转至 https://emby.ipv4.123.xyz:公网端口
- IPv6 环境访问(如手机流量):自动跳转至
https://emby.ipv6.123.xyz:16667
- 测试完毕后,这些定时任务都要删除掉
![]()

2. 后续优化
- HTTPS 加密:在 Lucky 中为
*.ipv4.123.xyz和 *.ipv6.123.xyz配置自动申请证书。
- 应用兼容性:该方式适用于浏览器 Web 服务,应用内登录需看具体支持情况。