你是否对 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 ,并且可以很好地和域名解析结合到一起,承担了反代的功能。