使用 cf workers 反向代理 nextdns 或者 adguardHome,配合国内 CDN 让你飞起

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

准备工作

第一步

登录到你的 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 服务商,我这里使用的是多 j 云。剩下的配置我就不演示了,就跟网站设置 cdn 一样,做个 cname 解析即可。

第三步

测试我们反向代理的效果是否能用

我这里反向代理的是 nextdns ,后台响应如下:

要快速检测生效,可使用 cfw 工具配置 tun 模式

7501 次点击
所在节点    DNS
23 条回复
c398425861
2022-11-11 14:00:52 +08:00
反代不支持 edns ?
a9k1n9
2022-11-27 19:47:19 +08:00
“missing parameters”属于正常吗?
eudemonwind
2023-05-26 23:42:38 +08:00
@0o0O0o0O0o 老哥能不能给个修改好后的完整代码? 比较看好你这个方案哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX