原始文章:[原创]最快的访问!使用Cloudflare+CDN节点优选+workers重定向lucky的ipv4-stun穿透http请求
前言
飞牛os作为近几年比较热门的NAS操作系统,以其简单易用,支持app的特点吸引了非常多的用户前来使用。 但是由于大部分的家庭网络都不存在公网ip的,想要完成在互联网上访问还是比较麻烦的。目前的话对于nas的访问有3种方法:
1、使用FRP
这种方案通常是需要自己有一台具备公网IP的服务器来进行中转,或者说是用免费的FRP供应商例如Sakura Frp、StarryFrp等。如果是使用自己的vps的话还需要花费金钱来购买服务器;如果使用免费的frp供应商的话节点稳定性、传输速度和限制流量等问题也是非常限制使用次数的。
2、使用组网服务
市面上已经有非常多的异地组网方案,来实现家庭局域网的访问,例如zerotier、tailscale、easytier和vnt等都是非常不错的组网方案。不过这些组网方案也不是非常实用的,一方面像zerotier的一类中转服务器部署在国外的,并且NAT环境不理想的话会导致访问速度非常的慢,延迟非常的高,p2p打洞的话还需要等待一定的时间,这样是非常影响日常使用的;另一方面使用组网软件的话一般都需要在每一台客户端安装独立的软件,并且在使用之前需要先进行配置好连接参数,这样不利用公共访问且不能方便使用。
3、使用ipv6
现在的家庭宽带络运营商都会提供公网ipv6网络了,使用ipv6网络可以轻松连接到家里的网络。但是目前的网络环境对于ipv6的兼容性还有很多问题,甚至有部分网络(例如校园网、公司网络等)是不提供ipv6网络的,一些家庭也是没有默认打开ipv6网络的,这就导致了ipv6网络非常难以开展。
以上这些方法都存在局限性,那么有什么方法可以实现比较完美访问家庭网络的方式呢?使用lucky就可以实现公网ipv4的访问了。我们可以利用lucky的stun穿透来获取到一个动态公网ip+动态端口号,再利用cloudflare的workers的脚本来实现重定向操作,来实现固定动态端口号。

一、将域名托管到Cloudflare
在注册好cloudflare账号后进入dash管理面板,在网站处添加域

输入你的域名,这里以a.com为例子

选择免费计划

这时候就得域你购买的域名托管商那修改你的dns地址了,这里以腾讯云为例

在域名控制面板域名右边的更多->修改dns服务器改为cloudflare的dns


修改完成后过10~20分钟即可完成dns的修改了
二、飞牛安装lucky
在应用中心可以直接下载lucky

三、配置lucky
安装好后直接启动或者在浏览器输入http://飞牛os的ip:16601来进行访问,默认用户名和密码都是666

1、升级lucky到最新版本
飞牛自带的lucky版本比较旧,建议下载官网最新的版本

选择lucky版本就可以了,lucky和wanji的区别官网有描述

下载Linux_x86_64.tar.gz版本的

下载完成后点击上传新版本即可完成升级

中间可能会有警告,我们直接点击确定就可以了


首次使用可能会有安全提醒,我们按照要求进行修改就可以了


2、添加stun穿透规则
点击STUN内网穿透->添加穿透规则来添加一条stun端口,按照下列规则填写
- 规则名称:stun
- 穿透通道本地端口:60000
- 防火墙自动放行
- upnp:打开
- 目标地址:127.0.0.1
- 目标端口:16666

点击添加后你会得到一个动态公网IP+动态端口号,这个IP+端口号就可以通过互联网直接访问到了

在这里你可能需要保证路由器的upnp功能是开启状态,或者已经添加了端口转发/DMZ主机到飞牛OS的ip,使lucky可以成功打洞。这里往往还需要你的光猫是桥接模式,并且是使用路由器进行拨号上网的。
如果你的lucky是安装在拨号设备上的,UPNP是不需要打开的;如果你路由器不支持UPNP,那么不要开启upnp,并且开启端口转发功能



这三个功能选择一个开启就可以了
3、配置lucky反向代理
在lucky的动态域名->web服务->添加Web服务规则来创建一个web规则,按照下列参数填写
- Web服务规则名称:反向代理
- 监听类型:全选
- 监听端口:16666
- 防火墙自动放行
- TLS:启用
- 默认规则设置为文本输出,用来做测试

此时在浏览器输入https://stun穿透ip:stun穿透端口号,就可以成功访问了,这里可能会提示证书错误的问题,因为我们还没有配置证书,因此直接忽略就可以了。


测试完成就可以继续操作了,如果无法正常访问请检查本机和路由器防火墙是否拦截了
测试完成如果可以正常访问就可以将默认规则修改成反向代理就可以了。

4、获取cloudflare-dns编辑API令牌
在cloudflare的面板右上角个人资料->api令牌->创建令牌,使用编辑区域DNS模板,选上你的域名,即可点击继续即可。




完成之后会显示API令牌,注意:这个令牌只会显示一次,请务必保存在文本内,后续会多次用到

5、配置ddns
在lucky的动态域名->添加任务来添加一个ddns解析,按照下列操作
- 任务名称:ddns
- 托管服务商:Cloudflare
- Token你的DNS API 令牌
- {ipv4Addr}:启用

接着在下面添加一个同步记录
- 备注:三级泛域名解析
- 记录名:*.s.a.com
- 记录类型:A(IPV4)

这样就完成了cloudflare的ddns解析了

四、配置Cloudflare
1、设置Cloudflare-CDN优选域名
在cloudflare的dns管理页面,添加一个CNAME的cloudflare优选域名,这里使用的优选域名为cf.090227.xyz,大家也可以使用其他的优选域名。优选域名推荐网站

关于域名优选这一部分,博主有一篇文章详细深入分析为什么要进行优选和如何优化优选域名,感兴趣的可以点我了解
当然你也可以选择不使用优选域名,直接开启小黄云解析也是可以的,不过这样可能会首次访问比较慢

2、添加workers
在cloudflare的侧边栏->workers路由->管理workers->创建->创建workers来创建一个workers


名称填redirect,点击部署

完成后点击编辑代码

粘贴下列代码块并修改配置参数,主要修改你的域名、ddns域名和端口号。端口号填写上面在lucky创建的stun穿透后的端口号,最后点击部署
// 配置参数
const CONFIG = {
// 需要重定向的域名
sourceDomain: 'a.com',
// 重定向后的域名
targetDomain: 's.a.com',
// 目标端口号
targetPort: '3587'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 只要 hostname 中包含 sourceDomain,就将 sourceDomain 替换为 targetDomain,并指定 port
if (hostname.includes(CONFIG.sourceDomain)) {
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向,如果有需要,可以改成 307 重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
JavaScript这样就完成了对workers的部署。如果还想继续修改js代码的话可以右上角点击代码标志进行修改

3、添加workers路由
在设置栏添加一个路由,把*.a.com/*进行路由,这样就可以将*.a.com/*的全部http请求交给workers-redirect来处理,进行js重定向操作



最后将这个wokers页面隐藏就能够完美重定向了,也可以不隐藏,在这个js脚本基础上再加一些别的信息显示,通过workers.dev的链接打开可以显示一些信息。预览url不要开启,是用来做调试用的

4、测试重定向是否可用
现在可以在浏览器输入www.a.com来进行测试,看看是否可以重定向到https://www.s.a.com:3587/,如果可以成功跳转的话说明我们的workers配置是没有问题的;如果无法正常重定向,可能是以下原因:
- 泛域名*.a.com是否解析好了(CNAME/小黄云)
- workers-redirect的路由是否成功添加
- 直接访问www.s.a.com:port是否可以正常访问
- www.s.a.com:port可以正常访问,但是*.a.com无法访问,可能是你的workers配置出现问题,可能是js脚本,也可能是redirect的路由问题;
这里可以尝试将重定向后的域名targetDomain: 's.a.com',替换成targetDomain: 'www.baidu.com',目标端口为targetPort: '443',访问a.com测试是否可以正常重定向到百度;
如果没办法重定向,说明是redirect的路由/泛域名*.a.com解析的问题,尝试换成别的优选域名 - www.s.a.com:port不能正常访问,但是公网ip+端口号可以正常访问,说明是你的*.s.a.com解析出现了问题,请检查ddns是否正常解析;也有可能是当前网络无法解析到你的域名,这个问题通常是因为dns污染导致无法解析托管到cf的dns域名,这个问题可以尝试修改本地dns为8.8.8.8或许可以解决
这样就可以实现ipv4直连接访问了,不过我们还有一个问题要解决,那就是固定stun穿透的端口号。我们使用ddns将ip地址固定下来,但是端口号的话需要我们手动修改,因此我们可以使用cloudflare的workers编辑API令牌来实现动态更新stun穿透的端口号。
5、获取workers编辑API
在cloudflare右上角我的个人资料->API令牌->创建令牌->创建自定义令牌来创建workers令牌

令牌名称叫workers,权限为账户-workers脚本-编辑

添加完成后保存好API令牌备用
6、记录cloudflare的账户ID

在cloudflare的面板右侧栏有账户ID,复制下来备用
五、动态更新stun端口号(重点)
回到lucky->STUN内网穿透->编辑之前创建的stun穿透规则,点击Webhook,依次填写下列参数:
- 接口地址:
https://api.cloudflare.com/client/v4/accounts/账户ID/workers/scripts/redirect - 请求方法:PUT
- 请求头:
Authorization: Bearer workers的API密钥Content-Type: application/javascript
- 接口调用成功包含的字符串:
"success": true - 请求体:
// 配置参数
const CONFIG = {
// 需要重定向的域名
sourceDomain: 'a.com',
// 重定向后的域名
targetDomain: 's.a.com',
// 目标端口号
targetPort: '#{port}'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 只要 hostname 中包含 sourceDomain,就将 sourceDomain 替换为 targetDomain,并指定 port
if (hostname.includes(CONFIG.sourceDomain)) {
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向,如果有需要,可以改成 307 重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
JavaScript在这里说明一下,Webhook是一个用来实现当stun穿透的端口号发生变化的时候会自动执行http请求,实现动态更新端口号。请求头内的#{port}是lucky的变量,代表当前stun穿透的端口号。

填写完成后先点击Webhook手动触发测试,测试一下

如果发现存在”success”: true字眼就说明可以正常更新了,这样就实现了动态更新stun穿透的公网端口

点击保存,等待一会,就可以看到Webhook触发成功的标识

六、设置TLS证书
回到lucky->SSL/TLS证书->添加证书->添加一个tls证书,依次填入下列信息
- 证书备注:随意
- 添加方式:ACME
- 验证方式:Cloudflare
- Token:cloudflare dns令牌,忘记了可以去ddns那里复制
- 域名列表:*.s.a.com

完成之后等待一两分钟,就可以完成证书的申请

七、添加http站点
回到lucky->Web服务->更多操作->添加子规则来创建一个http子规则

这里以飞牛OS进行反向代理为例
- 子规则名称:任意
- 服务类型:反向代理
- 前端地址:fn.s.a.com
- 后端地址:192.168.1.66:5666


填写完成之后就可以在浏览器输入fn.a.com,会自动跳转到https://fn.s.a.com:3523,并且使用了tls进行加密,其他站点也是同理。
总结
使用lucky的stun+workers重定向的功能可以非常轻松地实现直连访问,并且飞牛官方的APP也是支持重定向连接的,但是对于其他需要反向代理的app就不一定支持了,需要测试才知道。如果想实现其他网络连接的骚操作,如实现无端口号访问等,欢迎进入我的博客进行学习https://www.ytca.top
本篇文章已同步发布在飞牛论坛
📌 本文由 FishBoss_Tca 原创,转载请注明作者和原文链接。
原文链接:https://www.ytca.top/stun/2119/











我要是无法使用upup获取stun ip和端口该怎么办?大佬求救一下。
如果无法使用UPNP的话请配置路由器的端口转发,将路由器的指定外部端口和内部端口设置成一致,或者直接配置DMZ服务
配置成功了域名访问不了
访问不了请检查 第四章:”四、配置Cloudflare4″的第四小节:”4、测试重定向是否可用”来排查问题
老哥这个CDN加速在校园网环境如何,我想搞影音服务器,学校又是没ipv6又是端口隔离搞得我怪头疼的
(/ω\)
这个方法只依赖你家里的网络环境,如果可以顺利打通stun端口的话,在哪里都是可以访问的,包括校园网。
另外,我是没有使用CDN的,只是利用了CDN的一小部分内容而已。
这个方法是使用lucky的stun获取到公网ipv4的端口的,因此ipv6不在我们的考虑范围,或者说可以ipv4访问了,就不需要考虑ipv6的情况
你好。这里无法实现。 点击STUN内网穿透->添加穿透规则来添加一条stun端口,按照下列规则填写
规则名称:stun
穿透通道本地端口:60000
防火墙自动放行
upnp:打开
目标地址:127.0.0.1
目标端口:16666
我是lucky安装在openwrt主路由上的,然后设置stun添加穿透规则时一直报错: 一、穿透端口设置0,开启upnp时——添加映射端口失败
二、当设置穿透端口为指定的 60000时,又报错公网地址有效性一直检测失败。 请问应该如何设置才能成功获取到公网地址呢?我的openwrt主路由还装了tailscale插件和梯子插件,为了避免干扰。我上面测试时全都是关了这两个插件的了。
如果你是主路由拨号使用lucky的话,使用upnp就是多此一举,并且使用openwrt的内置转发和防火墙来实现转发放行,直接不使用Lucky内置端口转发,就可以了
像emby这类我在手机爆米花上需要添加域名+端口的docker,适合于博主说的方法吗
可以,但是每次端口变化的话都得重新修改服务器地址,因为app本身不支持重定向,网页的话是没问题
那就很鸡肋了,那这种打洞的意义我突然不知道用在什么地方了哈哈,如果是搭帕鲁那种服务器就不能重定向了吧,必须端口访问,然后端口是会变是吧
是的,但是我还有缓解方案,这个不是问题,可以看看我的博客stun专栏,有一个tcp/udp直连的
另外,重定向的话最实用的就是http服务,tcp/udp服务只是有曲线救国方案
具体是哪一篇文章呢,我目前的需求是想在公网的embyapp上登录家里的服务,要用到端口号这些,这是无法固定的吧,重定向app也不支持,我目前猜应该也只能获取通知提示我端口变成什么了?
这个是电脑使用的:https://www.ytca.top/guidance/openwrt/1258/
这篇是http服务通用的:https://www.ytca.top/stun/1872/
感谢大佬,我试试那个http的通用的
大佬我弄那个workers的,重定向方法的workers没有任何问题,但是用了反向代理的workers代码一直显示访问原域名cloudflare520,三级域名+端口可以进去是怎么回事啊
如果反向代理的方案用不了有可能是地区运营商限制了,老老实实用重定向方案吧
那就还是没办法通过不搭建vnt这类工具来访问emby这种app了嘛
如果是自己使用的话vnt方案我觉得还是可以的,非常方便,至于手机的话就需要开一下vnt了
要说没有其他方案的话也不是,可以试试走CDN的方案:https://www.ytca.top/stun/2193/
感谢博主的方向,我通过修改你的js脚本自动侦测用户是否可以访问ipv6,从而统一了二级域名重定向到ipv6(公网)或ipv4(stun)的效果,实测你这种方法在windows里的webdav也支持访问,有时间我也写一篇出来分享分享
可以的,如果写出来的话也麻烦分享一下链接给大家学习学习
也可以参考这个教程来实现ipv6和重定向ipv4自动分离:
https://www.bilibili.com/opus/1091309502978850866
我测试是可以的 注意防火墙需要打开v6的对应端口否则自动跳转到v4的域名,还是感谢大佬的教程。
const CONFIG = {
sourceDomain: 'a.xyz',
ipv4TargetDomain: 'ipv4.a.xyz', // IPv4 STUN穿透域名
ipv6TargetDomain: 'ipv6.a.xyz', // IPv6固定端口域名
ipv4Port: '#{port}', // IPv4动态端口
ipv6Port: '8216' // IPv6固定端口
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 检查是否匹配源域名
if (!hostname.includes(CONFIG.sourceDomain)) {
return new Response('Not Found', { status: 404 });
}
// 检测客户端IP版本
const clientIP = request.headers.get('CF-Connecting-IP');
const isIPv6 = clientIP && clientIP.includes(':');
let targetDomain, targetPort;
if (isIPv6) {
// IPv6客户端 -> 使用IPv6固定端口
targetDomain = CONFIG.ipv6TargetDomain;
targetPort = CONFIG.ipv6Port;
} else {
// IPv4客户端 -> 使用STUN穿透域名和动态端口
targetDomain = CONFIG.ipv4TargetDomain;
targetPort = CONFIG.ipv4Port;
}
const newHost = hostname.replace(CONFIG.sourceDomain, targetDomain);
const targetUrl = `https://${newHost}:${targetPort}${url.pathname}${url.search}`;
// 返回302重定向
return Response.redirect(targetUrl, 302);
}
这个思路是可以的
兄弟分享下修改后的js脚本?
顺便问下贴主, 这样stun是http到lucky的吧, 运营商会检测到传输内容吗
我们是使用https传输的,运营商检测不到
请问在ipv6环境下,是直接ddns直连飞牛nas吗?还是每次都经过上述重定向、穿透等流程访问nas呢?
已实现ipv4环境直连nas的http访问,但像emby app,需要单独输入服务器地址+端口号的如何实现呢?应该学习博主哪篇教程呢?
https://www.ytca.top/stun/1872/
这篇可以实现,但是效果不是很好
可以用在群晖上,全端口公网访问吗?还是说只能规定的端口可以访问?家里有v6但是学校只有v4想访问家里的黑群,有些APP跟登录端口不一样的。
这个方法只适用于网页特定端口登入,有没有ipv6都不影响,不同端口的话请使用组网服务vnt
好的,谢谢
Lucky STUN穿透进阶教程02:用公网服务器轻松实现无端口访问Web服务!
大佬尝试过这个方案吗?有成功的教程吗?
粘一下链接
https://66666.host/stun002-server-snirouting/ 这里,有劳大佬。另外麻烦帮我评估一下这里的公网服务器能用带FRP的内网服务器替代吗?要是可以的话就可以用DDNS的FRP IP+FRP端口访问了,相当于定住端口。谢谢大佬
https://www.ytca.top/guidance/openwrt/144/
这个是我的第一个stun方案,现在已经归档了,你可以参考一下,都是使用frp方案,结论是可行,但是不支持泛域名或者带路经的重定向(关于路经重定向请参考https://www.ytca.top/guidance/openwrt/940/的第三章:”三、设置alist分享路径重定向”)
个人认为这种方案并不好,目前比较满意的方案还是利用CDN提供商来实现重定向最佳,不管在速度、延迟还是消耗上,都是用尽可能利用客户端或者公资源来实现直连内网,而不是在重定向阶段就在消耗自己的资源
自己使用,不对外服务,够用、稳定、不复杂就行。谢谢大佬,期待大佬的更新
如果是自用的话可以使用内网组网服务来实现,例如vnt,easytier,wireguard,zerotier,Taliscal,
https://www.ytca.top/guidance/openwrt/905/
现在就是使用wireguard,公司没IPv6,流量需要通过frp中转,流量受限制。所以想实现ddns+固定端口重定向直连,不知道这样能不能行
frp重定向是没问题的,但是不如本方案好
在尝试这篇方案,目前到“4、测试重定向是否可用”卡住了,访问ptn.yuming.asia无法重定向到ptn.s.yuming.asia。
能帮我看看问题在哪里吗?谢谢。可以加我QQ沟通,2242622212,可以有酬
环境:a.com=yuming.asia;.s.a.com=.s.yuming.asia
在这一步之前配置了*.s.yuming.asia的SSL证书,https://ptn.s.yuming.asia:8900可以正常访问不报证书错误。
workers的代码我是全删了原来的helloworld的默认代码然后粘贴你的代码,仅将变量修改为我自己的,如下:
// 配置参数
const CONFIG = {
// 需要重定向的域名
sourceDomain: ‘ptn.yuming.aisa’, #使用过“yuming.asia”不行
// 重定向后的域名
targetDomain: ‘ptn.s.yuming.aisa’, #同上,使用过“s.yuming.aisa”,不行
// 目标端口号
targetPort: ‘8900’ #stun 端口
};
按教程设置成功了,有两个问题 重定向到https://fn.s.a.com:3523 如果去掉后面的端口就无法访问,怎么再次重定向到自动带端口号呢,我重定向到fn.a.com 源地址不行呢, 问题2:如果用户收藏了带端口的网页链接,那等端口变了后链接就永久失效了,用户也不知道下次端口是什么?除非收藏主域名
我们只需要记住重定向前的端口号就可以了,这个相对于入口,既然它可以访问到重定向后的端口,那么它肯定有重定向前的地址
iStoreOS主路由装的lucky,Webhook测试提示这个报错怎么弄,之前在飞牛上测试是没有问题的。
Webhook接口调用结果
NetworkCallApiFailure :
{“success”:false,”errors”:[{“code”:9106,”message”:”Missing X-Auth-Key, X-Auth-Email or Authorization headers”}]}
Web接口反馈的完整内容
{“success”:false,”errors”:[{“code”:9106,”message”:”Missing X-Auth-Key, X-Auth-Email or Authorization headers”}]}
是不是缺少认证呀,或者API TOKEN不对,请检查一下你的请求头
在我的区域电信访问二级域名进行重定向总是遇到连接重置,但是多次刷新有一定概率成功,尝试过将优选域名更换为质量较高的优选ip并无效果,有点神秘了
举个例子:
有可能是你的本地运营商对cf的有做限制,你用手机或者别的运营商网络再试试
手机移动也重置捏(
神奇的是一台设备上某个子域名只要重定向成功一次就再也不重置连接了,而且每次F12看到的CF的302响应标头里时间也是实时,说明不是浏览器缓存,但是换个别的子域名又开始重置。
怀疑还是我的配置问题或我这里worker被限制使用了。
PS:主播昨天抽到EdgeOne兑换码了,实在不行换个方式重定向罢
刚刚用阿里云服务器上的edge试了一下是没有连接重置现象的,那么原因有可能是:
1、CF的IP连通性正常,但是发往CF的HTTP(S)请求会被本地运营商拦截
2、我的IP段被限制运行Workers
那只能使用国内的CDN服务了腾讯的edgeone和阿里的都可以
飞牛docker里装的APP,如迅雷、lucky等,需要访问其他的端口,无法打开,有什么简单的办法设置呢,不可能每个app的端口再单独穿透一次吧
反向代理