前言
- 本人为网络技术小白,本文内容基于网络大佬分享的知识整理融合,仅作个人备忘。
- 核心目标:家庭设备仅有公网 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:
- 接口地址:https://api.cloudflare.com/client/v4/accounts/改成你的账户id/workers/scripts/redirect
- 请求方法:PUT
- 请求头:Authorization: Bearer 之前生成的 API 令牌
Content-Type: application/javascript
- 请求体 :
json
// ===========================================
// Cloudflare Workers 智能重定向脚本
// 配合 Lucky STUN 穿透实现 IPv4/IPv6 自动分流
//
// 使用说明:
// 1. 将下方 CONFIG 中的 '123.xyz' 替换为你的主域名
// 2. 确保 WebHook 能自动更新 v4.port 的值
// 3. 部署到 Cloudflare Workers
// ===========================================
const CONFIG = {
domain: '123.xyz', // 请替换为你的主域名
v4: {
target: 'ipv4.123.xyz', // IPv4 目标域名(需替换)
port: Number(#{port}) || 80 // 由 WebHook 自动更新
},
v6: {
target: 'ipv6.123.xyz', // IPv6 目标域名(需替换)
port: 16667 // IPv6 固定端口
}
};
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.endsWith(CONFIG.domain)) {
return new Response('Not Found', { status: 404 });
}
// 提取子域名(如 emby、fnos 等)
const subdomain = hostname === CONFIG.domain
? ''
: hostname.slice(0, -CONFIG.domain.length - 1);
// 从 CF-Connecting-IP 判断客户端 IP 版本
const clientIP = request.headers.get('CF-Connecting-IP') || '';
const config = clientIP.includes(':') ? CONFIG.v6 : CONFIG.v4;
// 构建目标域名和完整路径
const targetDomain = subdomain
? `${subdomain}.${config.target}`
: config.target;
const fullPath = url.pathname + url.search + url.hash;
// 检测是否为浏览器(用于决定跳转方式)
const ua = request.headers.get('User-Agent') || '';
const isBrowser = /Mozilla|Chrome|Safari|Edge|Firefox/i.test(ua) &&
!/Emby|Kodi|Infuse|Plex|curl|wget|python|java/i.test(ua);
// 浏览器:返回 HTML 页面,使用 JS 跳转(保持密码填充)
if (isBrowser) {
const html = `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跳转中...</title>
<script>
// 立即跳转到目标地址
location.replace('https://${targetDomain}:${config.port}${fullPath}');
</script>
</head>
<body>
<p>正在跳转,请稍候...</p>
</body>
</html>`;
return new Response(html, {
headers: {
'Content-Type': 'text/html;charset=UTF-8',
'Cache-Control': 'no-cache, no-store, must-revalidate'
}
});
}
// 非浏览器(App/API):使用 307 重定向
return Response.redirect(
`https://${targetDomain}:${config.port}${fullPath}`,
307
);
} catch (error) {
return new Response('Service Temporarily Unavailable', {
status: 500,
headers: { 'Content-Type': 'text/plain' }
});
}
}
- 接口调用成功包含的字符串:
"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 服务,应用内登录需看具体支持情况。
已经修改stun穿透的webhook的workers代码,优化密码储存问题。