推荐阅读:
前言:
之前我发过几篇文章,都是围绕lucky打通内网ipv4如何达到完美访问的,最后一篇是将域名托管到Cloudflare(以下简称cf)上使用“页面规则”来实现http重定向并添加上stun的端口号实现完美http访问
问题
1、请求/重定向时间长
但是这样其实还不够完美,就是我们将域名托管到cf导致每次dns请求都会发往cf上面进行解析。因为众所周知是原因,cf的dns服务器在国内解析是非常慢的,相对去其他国内dns厂商(腾讯、百度、阿里等),有一个数量级的差别,并且因为是重定向的缘故,导致每次首次请求获取实际带stun端口的地址都要进行两次cf的ip地址请求的过程,第一次请求是获取端口号,第二次请求是获取时间访问的ip地址,对于多次跳转不同域名的等待时间显然是不能接受的。
2、页面规则过少
默认的免费账户只能创建3个页面规则,并且一个至少有一个页面规则是用来匹配*.example.com的,但是这样就有个弊端,就是不能附带路径,如*.example.com/web/index.html最后会被重定向成*.stun.exampel.com:6666,访问路径部分因为通配符只能匹配一处的缘故配丢弃了。尽管可以使用可以再创建一个页面规则为特定域名做路径匹配b.example.com/*变成b.stun.exampel.com:6666/*,但是因为一个账号最多只能创建2个路径匹配的页面规则,对于有多个需要携带路径附带的请求就无能为力了。
新方案
之前在研究cf的CDN节点ip优选的时候发现cf的workers可以编写一些js脚本,于是可以利用其来实现多个通配符匹配,实现域名和路径全匹配,并且这个方案使用了cf的CDN-ip优选,还可以优化首次请求的响应速度,减少的dns请求的等待时间
一、前提条件
- 需要一个主域名托管到cf
- 需要第二个副域名托管到国内dns网站
- 会使用lucky的stun功能
- 会使用lucky的WebHook功能
主域名这里使用a.com作为演示,托管到cf的部分略过,需要的可以自行百度。副域名使用b.net作为演示,并且将b.net托管到腾讯云dns上
二、流程步骤
①我们想要访问www.a.com/index.html的网页,因为a.com被托管到cf上,因此第一次先会向cf请求www.a.com的ip地址,在这之前,我们因为进行了cdn-ip优选,因此www.a.com的请求会发往最近的cdn节点进行解析ip地址
②cdn在收到dns的请求后流经cf的workers.js进行处理,重定向后返回带端口号和路径的副域名www.b.net:6666/index.html,这里同时保留了二级域名和路径
cf的workers给用户自己编写一个js脚本来处理请求的内容,并返回处理后的结果,可以为我们的网站执行一些自动化操作,因此我们请求的www.a.com/index.html流经workers处理后就被包装成了www.b.net:6666/index.html。关于wokers的更多其他好玩的功能请自行学习
③因为b.net是托管在国内的网站了,因此就会就近进行dns查询并返回真实的ip地址,从而实现http页面的请求
三、配置Cloudflare
1、添加CNAME记录到IP优选域名
cf的IP优选就是在访问网站之前先进行自适应连接最近的CDN来访问,以加快后来的请求访问,这通常需要连入一个CNAME的CDN优选域名帮帮忙做CDN筛选。关于CDN优选的内容有兴趣大家可以自行去网上查找,这里不作为主要内容。
先在DNS解析记录这里填入一个CNAME类型*泛域名的解析记录到优选域名cf.090227.xyz。大家可以使用其他的优选域名,也可以使用这个域名进行优选。
2、添加workers
侧边栏->管理workers->创建->创建workers来创建一个workers
名称填redirect,点击部署
完成后点击编辑代码
粘贴下列代码块并修改配置参数,主要修改你的主域名、副域名和端口号,点击部署
// 配置参数
const CONFIG = {
// 需要重定向的源主域名
sourceDomain: 'a.com',
// 目标主域名
targetDomain: 'b.net',
// 目标端口号
targetPort: '7363'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 获取主机名的主域部分
const domainParts = hostname.split('.').slice(-2).join('.');
// 如果请求的主域名是 sourceDomain
if (domainParts === CONFIG.sourceDomain) {
// 将 sourceDomain 替换为 targetDomain,并指定 port
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
JavaScript这样就完成了对workers的部署。如果还想继续修改js代码的话可以右上角点击代码标志进行修改
3、添加路由
在设置栏添加一个路由,把*.a.com/*进行路由,这样就可以搭配workers进行域名和路径的js重定向了
最后将这个wokers页面隐藏就能够完美重定向了,也可以不隐藏,在这个js脚本基础上再加一些别的信息显示,通过workers.dev的链接打开可以显示一些信息。预览url不要开启,是用来做调试用的
3、获取workers编辑API
在我的个人资料->API令牌->创建令牌->创建自定义令牌来创建workers令牌
令牌名称叫workers,权限为账户-workers脚本-编辑
添加完成后保存API密钥备用
四、配置腾讯云
这里其实也没什么要设置的,无非就是绑定域名到实际IP
在这里顺便获取一下API密钥,用作ddns固定ip
五、配置lucky
1、添加ddns解析记录
在动态域名添加一个任务,填写相应的信息解析泛域名即可,详细步骤可以参考之前的文章
2、添加stun穿透
这里和之前那些创建页面规则的操作就大同小异了
- 接口地址:https://api.cloudflare.com/client/v4/accounts/账户ID/workers/scripts/脚本名字
- 请求方法:PUT
- 请求头:
- Authorization: Bearer workers的API密钥
- Content-Type: application/javascript
- 接口调用成功包含的字符串:”success”: true
- 请求体:
// 配置参数
const CONFIG = {
// 需要重定向的源主域名
sourceDomain: 'a.com',
// 目标主域名
targetDomain: 'b.net',
// 目标端口号
targetPort: '#{port}'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 获取主机名的主域部分
const domainParts = hostname.split('.').slice(-2).join('.');
// 如果请求的主域名是 sourceDomain
if (domainParts === CONFIG.sourceDomain) {
// 将 sourceDomain 替换为 targetDomain,并指定 port
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
JavaScript关于账户ID的话在cf的右侧栏是有显示的
这样就完成了终端更新workers的重定向端口号了
在itdog的网站测试结果也是快很多的,可以看到连接都是通过多个CDN节点连入的,加快了解析和访问速度
博主我有一个问题,假如我有ipv4的公网ip,这个方法能不能实现纯域名访问,不想加端口号
如果有公网IP的话可以直接使用域名访问了,不需要做stun的工作,关键是现在大部分家庭网络都回收了公网ip,并且即使有公网IP也无法访问80/443端口,依旧需要重定向到别的端口来访问
您是想借鉴我的方案实现什么功能呀?
最近也在研究stun,因为只有公网v6没有公网v4,现在用的cf内网穿透,使用lucky也按照教程实现入浏览器输入alist.565.pp.ua自动定向到alist.stun.565.pp.ua+穿透端口。但是还是想学学大佬的方法。希望有空帮我设置一下,万分感谢。
如果你会使用lucky的stun+cf的Webhook的话这个方法也不难,原理都是一样的,只是实现重定向的方式不一样而已
那现在你是哪里不理解?
才从b站上搞定这个,看到你的教程就想尝试,还没有仔细研究你的方法,本是小白,也在慢慢学习这方面。b站方法现在证书第一次申请成功,后面不知道设置了啥一直调用证书。一直不安全浏览。你的我要认真揣摩一下。或者空了可否博主帮忙远程指导一下。万分感谢。q3811822924
我是istoresOs,发现一个问题,就是lucky的stun跟openclash冲突,stun显示ip也是宽带运营商的,穿透端口也正常,就是直接ip+端口无法打开web。关闭openclash就行了,我设置了openclash每日重启和延时启动,但是过几个小时stun就不通了。stun随机端口没重新获取。只要关闭openclash,stun几天都是正常的,端口也没有改变。
openclash是不是开启了系统代理或者tun,如果是这样做的话会导致stun探测的端口是你的代理服务器的端口
对的,开启openclash后,stun就会调用科学的ip了,主路由试了upnp和DMZ,开启dmz会不会调用科学ip。
换成DMZ就好了。其他转发只要开openclash,stun就跑变成科学IP。感谢
五、配置lucky
1、添加ddns解析记录
在动态域名添加一个任务,填写相应的信息解析泛域名即可,详细步骤可以参考之前的文章
这里是配置b.net的DDNs吧,我有阿里云b.xyz域名,但是只能分配二级域名,因为住域名有其他用途,是不是A记录到*.stun.b.xyz。然后填写stun穿透的真实ip。
添加workers那里填写主域名和副域名后填写的目标端口号是STUN内网穿透的端口吗?比如我是16666就填写16666
stun那里都设置完成,webhook手动触发提示(接口调用出错),但是cf网站的js端口那里已经更新成stun穿透的随机外部端口了。教程那里没有说要不要手动触发验证一下是否各项填写检验。
还有一个问题web反向代理那里是不是不用设置了?打开要怎样设置。