🎯 目标
实现一个智能访问策略:
外网访问你的服务(如 飞牛主页)时:
- 如果访问者 有 IPv6,则直接通过你的内网公网 IPv6(不经 Cloudflare 中转)。
- 如果访问者 只有 IPv4,则通过 Cloudflare Tunnel(Argo)转发至 飞牛内部服务,实现全球 IPv4 可访问。
且:地址栏统一使用域名c.***.top,用户无需知道你内部部署情况。
🧱 环境准备
项目 |
内容 |
物理机 |
已安装飞牛FNOS(飞牛安装op,后续实现同一个域名局域网登录飞牛) |
公网 IPv6 |
有 |
公网 IPv4 |
无 |
Cloudflare |
已托管 ***.top 域名 |
子域名 |
c.***.top 作为主入口,a.***.top 为直连 IPv6 目标 |
本地 Web 服务 |
飞牛nas主页 |
🧩 总体流程概览
客户端(浏览器)
**
**─ 有 IPv4 → 请求 c.domain.top → Cloudflare Workers 脚本 → 原地 fetch (走 Cloudflare Tunnel)
**
**─ 有 IPv6 → 请求 c.domain.top → Workers 脚本判断 → 302 跳转到 a.domain.top → IPv6 直连访问你的设备
🔧 步骤详解
✅ 第一步:配置 Cloudflare Tunnel(Argo)
-
在飞牛 上安装并运行 cloudflared
(我用的是docker)

-
在cloudflare创建隧道并绑定服务:

✅ 第二步:设置 DNS
记录 |
类型 |
目标 |
c.***.top |
无记录(由 Cloudflare Tunnel 自动接管) |
|
a.***.top |
AAAA |
你飞牛的公网 IPv6 地址 |
a.***.top |
灰色云(关闭代理) |
|
说明:
1.打开 Cloudflare Dashboard → Workers → 创建一个 Worker。



2.脚本如下(chatgpt已经调试成功的版本,根据目标“IPv6 跳转、IPv4 原地 fetch”配置):

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const clientIP = request.headers.get('CF-Connecting-IP') || '';
const isIPv6 = clientIP.includes(':');
if (!isIPv6) {
// IPv4 用户,直接访问原始请求,不重定向,不代理
return fetch(request);
}
// IPv6 用户,构造重定向地址到 a.***.top(保持请求路径和参数不变)
const originalURL = new URL(request.url);
originalURL.hostname = 'a.***.top';
// 返回 302 重定向响应
return Response.redirect(originalURL.toString(), 302);
}
3 部署后,将 Worker 绑定到c.***.top,路径 /
。


第四步(可选):本地内网访问用域名直连
如果你希望在内网环境下访问c.***.top 时,不走公网而是走内网直连(如 192.168.0.156
),可以:
🎯 访问测试场景
网络环境 |
访问 c.***.top 的效果 |
IPv4-only |
走 Cloudflare Tunnel,访问成功 |
IPv6-only |
被 302 重定向到 a.***.top ,IPv6 直连 |
内网设备 |
可通过挟持 c.***.top → 192.168.0.156 本地访问 |
🚨 注意事项与优化建议
✅ 地址栏变化是否正常?
- 是的,用了
302
重定向,浏览器会切换地址栏为 a.***.top
,这是标准行为。
- 如果你希望地址栏保持不变,只能在 Worker 中用
fetch()
做反向代理,但这样会失去直连的高性能。
✅ 是否影响网速?
- IPv6 直连最快。
- IPv4 路径通过 Cloudflare Tunnel → 相比公网绕远,但速度仍然优秀。
- 不建议为 “隐藏跳转” 牺牲直连性能,优先推荐你当前方式。
✅ 最终效果总结
类型 |
地址 |
功能 |
主访问入口 |
https://c.***.top |
全球 IPv4/IPv6 用户统一入口 |
IPv6 直连 |
https://a.***.top |
不经过 Cloudflare,直达 飞牛FNOS |
IPv4 转发 |
c → Tunnel → 飞牛FNOS |
无公网 IPv4 的完美替代方案 |
测试与验证
1.ipv4访问(显示公网连接)

2.连上内网wifi访问(显示局域网连接)

3.ipv6访问(跳转到子域名a,因为我的飞牛没有ipv6公网地址,所以a域名DDNS到另一台有公网ipv6的op了)

说明步骤
-
Cloudflare Tunnel 创建通道 c
- 在飞牛FNOS设备上配置Cloudflare Tunnel,将内网服务映射到Cloudflare的c.***.top域名。
- 确保隧道正常工作,c域名通过Cloudflare代理访问。
-
域名解析
- a.***.top:AAAA记录指向飞牛FNOS设备的IPv6地址,开启Cloudflare代理(灰云),用于直连IPv6用户。
- c.***.top:对应Cloudflare Tunnel,开启代理(橙云)。
-
Cloudflare Workers脚本
- 部署Workers,绑定c.***.top。
- 脚本逻辑:
- 如果访问者是IPv4,访问请求转发到 c.***.top,通过Cloudflare Tunnel代理访问飞牛FNOS内网。
- 如果访问者是IPv6,直接返回 a.***.top(飞牛FNOS IPv6地址)进行直连访问。
-
内网DNS自定义挟持
- 在家中路由器飞牛FNOS的Dnsmasq配置中,添加自定义挟持规则:
- c.***.top 映射到内网IP(192.168.0.156)
- 家里设备连接WiFi时,访问 c.***.top 会直接访问内网设备,绕过公网。
总结
- 公网IPv6用户:直接直连a.***.top的IPv6地址,绕过Cloudflare代理,速度快,延迟低。
- 公网IPv4用户:通过Cloudflare代理访问c.***.top,利用Cloudflare Tunnel安全访问内网服务。
- 内网用户(家中WiFi):通过自定义DNS挟持,直接访问内网IP,保证访问速度和稳定性。