使用cf workers反向代理nextdns,配合国内CDN让你飞起
你是否对 nextdns 及 adguard 去广告的能力感叹,但是在国内的网络环境,它们速度真的是一言难尽。今天,我就来分享一个如何使用 cf workers 反向代理,然后再配合优质 CDN ,让你在国内也正常使用这些 dns。
你是否对 nextdns 及 adguard 去广告的能力感叹,但是在国内的网络环境,它们速度真的是一言难尽。今天,我就来分享一个如何使用 cf workers 反向代理,然后再配合优质 CDN ,让你在国内也正常使用这些 dns

准备工作
- cloudflare 账号;
- 你要反代的 dns 服务( nextdns 、adguard 等)
- 一个自己的域名 (可选)
第一步
登录到你的 clodflare 账号,然后进入 workes ,创建一个服务,粘贴以下代码。
// 请求路径。请修改此路径,避免该 worker 所有人都能使用。
const endpointPath = '/dns-query';
// 上游 DoH 地址。必需是域名,不能是 IP 。Cloudflare 有限制。
const upstream = '这里填写要反代的 dns-query';
/**
* @param {Request} request
* @param {URL} clientUrl
*/
async function handleRequestGet(request, clientUrl) {
const dnsValue = clientUrl.searchParams.get('dns')
if (dnsValue == null) {
return new Response('missing parameters', { status: 400 });
}
if (request.headers.get('accept') != 'application/dns-message') {
return new Response('bad request header', { status: 400 });
}
const upstreamUrl = new URL(upstream);
upstreamUrl.searchParams.set('dns', dnsValue);
const upstreamRequest = new Request(upstreamUrl.toString(), {
headers: request.headers,
method: 'GET',
});
upstreamRequest.headers.set('host', upstreamUrl.hostname)
return await fetch(upstreamRequest);
}
/**
* @param {Request} request
* @param {URL} clientUrl
*/
async function handleRequestPost(request, clientUrl) {
if (request.headers.get('content-type') != 'application/dns-message') {
return new Response('bad request header', { status: 400 });
}
const upstreamRequest = new Request(upstream, {
method: 'POST',
headers: {
'accept': 'application/dns-message',
'content-type': 'application/dns-message',
},
body: await request.arrayBuffer()
});
return await fetch(upstreamRequest);
}
/**
* @param {Request} request
*/
async function handleRequest(request) {
const clientUrl = new URL(request.url);
if (clientUrl.pathname != endpointPath) {
return new Response('Hello World!', { status: 404 });
}
switch (request.method) {
case 'GET':
return handleRequestGet(request, clientUrl)
case 'POST':
return handleRequestPost(request, clientUrl)
default:
return new Response('method not allowed', { status: 405 });
}
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
然后保存即可,现在,你就可以使用你反向代理的 dns-query 了,如果需要自定义域名也可以自行百度。
这里有个问题,就是 cf 官方的 cdn 国内访问也是很拉,所有,我们可以自定义域名,然后套上第三方 cdn 。这里就不做推荐了,你可以选择又拍云、多吉云等等
第二步 (可选)
自定义域名后,选择一个 cdn 服务商,我这里使用的是又拍云。剩下的配置我就不演示了,就跟网站设置 cdn 一样,做个 cname 解析即可。
第三步
测试我们反向代理的效果是否能用
我这里反向代理的是 nextdns ,后台响应如下:
要快速检测生效,可使用 cfw 工具配置 tun 模式
=========================================================================
一般来说 CDN 不具备代理功能,你没有办法更改公共 DoH域名的解析,所以你的模型中还需要一台国内服务器和一个域名。CF workers 是免费额度较高的 serverless ,并且可以很好地和域名解析结合到一起,承担了反代的功能。
更多推荐

所有评论(0)