收起左侧

通过 Cloudflare 实现基于 IPv6 优先直连 + IPv4 自动代理 的访问方案

8
回复
393
查看
[ 复制链接 ]

0

主题

3

回帖

0

牛值

江湖小虾

🎯 目标

实现一个智能访问策略:

外网访问你的服务(如 飞牛主页)时:

  • 如果访问者 有 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)

  1. 在飞牛 上安装并运行 cloudflared(我用的是docker)

    image.png

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

    image.png

✅ 第二步:设置 DNS

记录 类型 目标
c.***.top 无记录(由 Cloudflare Tunnel 自动接管)
a.***.top AAAA 你飞牛的公网 IPv6 地址
a.***.top 灰色云关闭代理

说明:

  • a 是灰云,Cloudflare 不做代理,允许客户端直连 IPv6。

  • c 是由 Cloudflare Tunnel 接管的入口域名,最终访问的是你的 IPv4 内网服务。

    image.png

  • ✅ 第三步:编写并部署 Workers 脚本

1.打开 Cloudflare Dashboard → Workers → 创建一个 Worker。
创建workers示意图2.png

点击部署.png

点击编辑代码.png

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

image.png

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,路径 /

image.png

image.png

第四步(可选):本地内网访问用域名直连

如果你希望在内网环境下访问c.***.top 时,不走公网而是走内网直连(如 192.168.0.156),可以:

  • 在 OpenWRT 的「DHCP/DNS → 自定义域名解析」中添加:

  • c.***.top------------192.168.0.156

    image.png

🎯 访问测试场景

网络环境 访问 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访问(显示公网连接)
ab164130f3b616c0d64f5bc95c039967.jpg

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

4ef532203abf985479a80cb58ef816a0.jpg

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

e2ac573df8e0e4844acd451733b25ee1.jpg

说明步骤

  1. Cloudflare Tunnel 创建通道 c

    • 在飞牛FNOS设备上配置Cloudflare Tunnel,将内网服务映射到Cloudflare的c.***.top域名。
    • 确保隧道正常工作,c域名通过Cloudflare代理访问。
  2. 域名解析

    • a.***.top:AAAA记录指向飞牛FNOS设备的IPv6地址,开启Cloudflare代理(灰云),用于直连IPv6用户。
    • c.***.top:对应Cloudflare Tunnel,开启代理(橙云)。
  3. Cloudflare Workers脚本

    • 部署Workers,绑定c.***.top。
    • 脚本逻辑:
      • 如果访问者是IPv4,访问请求转发到 c.***.top,通过Cloudflare Tunnel代理访问飞牛FNOS内网。
      • 如果访问者是IPv6,直接返回 a.***.top(飞牛FNOS IPv6地址)进行直连访问。
  4. 内网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,保证访问速度和稳定性。
收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

3

回帖

0

牛值

江湖小虾

3 天前 楼主 显示全部楼层
不知道飞牛私有云app 支不支持302重定向,现在没有ipv6,暂时测试不了

4

主题

190

回帖

0

牛值

小有名气

点赞,折腾不息

墨香染指尖,代码藏心间。飞牛江湖里,书生亦狂癫。

0

主题

23

回帖

0

牛值

fnOS系统内测组

点赞,折腾不息

0

主题

1

回帖

0

牛值

江湖小虾

请教一下,想在这个的基础上再加上lucky反向代理,可以实现吗。
因为我目前是用lucky反向代理,所以dns记录的是*,想要实现lucky反向代理+cloudflare ipv6直连 + ipv4自动代理,有没有什么办法。

这个方法访问的是飞牛主页,因为我现在飞牛没有ipv6,不知道直接访问飞牛ipv6地址的话需不需要加上5666端口,需要的话就要配个LUCKY反代,直接在 worker代码那里originalURL.hostname = 'a.***.top:端口';这个后面  详情 回复
昨天 18:18

0

主题

3

回帖

0

牛值

江湖小虾

昨天 18:18 楼主 显示全部楼层
liyulive 发表于 2025-7-3 10:46
请教一下,想在这个的基础上再加上lucky反向代理,可以实现吗。
因为我目前是用lucky反向代理,所以dns记录 ...

这个方法访问的是飞牛主页,因为我现在飞牛没有ipv6,不知道直接访问飞牛ipv6地址的话需不需要加上5666端口,需要的话直接在 worker代码那里originalURL.hostname = 'a.***.top:5666'。同理如果访问其他的端口,比如要访问5244端口alist   只需要现在tunnle加上一个新的子域名d.***.top 映射作为ipv4访问就行了,然后继续创建新的worker绑定到这个域名,worker代码那里originalURL.hostname = 'd1.***.top:端口';然后为d1.***.top创建AAAA记录作为ipv6的访问路径,同样是需要访问一个d子域名来实现ipv4和ipv6的访问,这是我的一点不成熟的想法不知道可不可行

1

主题

4

回帖

0

牛值

江湖小虾

小白第一步就不会,直接从cloudflare网站上操作是一样的吧

不是 第一步 先去cloud创建隧道 然后用token去飞牛dockers创建cloud 然后返回cloud绑定子域名,这个过程可以去搜一下,教程挺多的  详情 回复
昨天 20:43

0

主题

3

回帖

0

牛值

江湖小虾

昨天 20:43 楼主 显示全部楼层
齐xx 发表于 2025-7-3 18:29
小白第一步就不会,直接从cloudflare网站上操作是一样的吧

不是  第一步 先去cloud创建隧道  然后用token去飞牛dockers创建cloud  然后返回cloud绑定子域名,这个过程可以去搜一下,教程挺多的

2

主题

27

回帖

0

牛值

江湖小虾

ipv4通过 Tunnel通道连接相比于通过stun内网穿透,经过cloudflare302重定向到域名的方法,连接速度上应该后者更具优势

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则