登录到你的 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 解析即可。
测试我们反向代理的效果是否能用
要快速检测生效,可使用 cfw 工具配置 tun 模式
![]() | 1 Jesmora OP 我这里再加个工具网站,关于 iOS 用户想要使用 DoH ,不需要使用第三方工具,iOS 大于 14 的基本支持自定义配置,所以我们可以不借助第三方 app 使用 iOS 的 profile 功能,生成一个 mobileconfig 文件,你就可以随时添加 DoH 或者 DoT 。 工具链接: https://dns.notjakob.com/tool.html |
3 0o0O0o0O0o 2022-04-13 18:51:48 +08:00 via iPhone |
5 seakingii 2022-04-13 19:30:16 +08:00 不太明白,你这样做的链路是 : 我的电脑 > 多吉云 CDN > CF WORKER > DNS 服务器吗? 能不能 : 我的电脑 > 多吉云 CDN > DNS 服务 这样?还少个步骤 是不是我哪里理解有误 |
![]() | 7 since2021 2022-04-13 19:51:10 +08:00 又认识一个免费资源,多 J 云~ |
8 seakingii 2022-04-13 19:51:53 +08:00 @ik 你理解错误我的疑问 楼主说: 我的电脑 > DNS 服务慢,中间要再加个 CF ,因为 我的电脑 > CF 也慢,所以 还要加个 多吉云 , 那楼主就是认为 多吉云 > CF 快 , CF > DNS 快, 所以就算加了 2 个中间层还是快 我的问题是 多吉云 > DNS 不行吗 ? 就慢了? 一定要在 多吉云和 DNS 中间加个 CF? |
9 0o0O0o0O0o 2022-04-13 19:59:10 +08:00 via iPhone @seakingii 一般来说 CDN 不具备代理功能,你没有办法更改公共 DoH 域名的解析,所以你的模型中还需要一台国内服务器和一个域名。CF workers 是免费额度较高的 serverless ,并且可以很好地和域名解析结合到一起,承担了反代的功能。 |
![]() | 10 since2021 2022-04-13 20:03:26 +08:00 直接用百度云函数了好了,小于百万次也免费~ |
11 seakingii 2022-04-13 20:03:35 +08:00 @0o0O0o0O0o 可能我的理解有误: 我的理解是 : 1 访问 多吉云 CDN, 2 多吉云 那边邦我访问 DNS 3 多吉云 将 DNS 的响应返回给我 这几个步骤下来,多吉云 没有起到类似 "反代"的功能吗? 除非不能"简单"的,中间还需要有应用代码解析请求进行复杂一点的操作 |
![]() | 12 lxxself 2022-04-14 00:23:56 +08:00 “剩下的配置我就不演示了”,这话让我折腾好一会还是没弄好。多吉云 cdn -> cf worker ->nextdns ,这其中的多吉云 cdn 配置的源地址是 cf worker 的 xxx.xxx.workers.dev 还是说是 cf 后台配置的域名(规则转发到 worker 的域名)? |
![]() | 14 Jesmora OP @0o0O0o0O0o 你见过支持这样 https://example.workers.dev/https://family.cloudflare-dns.com/dns-query 的 doh 的吗? 我自定义域名了还得 https://www.mydomain.com/https://dns.google/dns-query ,那我使用 profile 自定义 mobileconfig 的时候校验不过,思路是好的,但有时候聪明反被聪明误 |
![]() | 15 Jesmora OP @seakingii 不是这样的,cf-workers 反向代理第三方 dns 是为了自定义域名使用优质 cdn ,你不能直接 cname 第三方 dns 服务,并且也不支持,自定义域名后的逻辑链路如下: https://store.heytapimage.com/cdo-portal/feedback/202204/14/68688cfdf1c8a527761896df453f4ae6.png |
16 0o0O0o0O0o 2022-04-14 11:11:09 +08:00 ![]() @Jesmora #14 你这批评,让我还去搜了下 RFC...没有定义说不能这样啊?代码里稍微处理一下,这样 path 部分编不编码都支持,说到底就是个反代。 用 curl --doh-url 和 dnslookup 测试均能通过 curl --doh-url https://exmaple.workers.dev/https://dns.google/dns-query https://www.google.com/robots.txt curl --doh-url https://exmaple.workers.dev/https%3A%2F%2Fdns.google%2Fdns-query https://www.google.com/robots.txt curl --doh-url https://exmaple.workers.dev/https://cloudflare-dns.com/dns-query https://www.google.com/robots.txt curl --doh-url https://exmaple.workers.dev/https%3A%2F%2Fcloudflare-dns.com%2Fdns-query https://www.google.com/robots.txt ``` addEventListener("fetch", event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { let url = new URL(request.url); let upstream = new URL(decodeURIComponent(url.pathname.replace(/^\/+/, '')).replace(/^https:\/+/, 'https://')); upstream.search = url.search; return fetch(upstream, { method: request.method, body: request.body, headers: request.headers, keepalive: request.keepalive, } ); } ``` |
![]() | 17 Rilimu 2022-04-25 19:15:42 +08:00 ![]() 我说这代码怎么眼熟。 复制粘贴别人的代码不署名。 给后人指条路。代码源复制自 github 上的 cfdohpw 项目。 |
![]() | 18 baodl 2022-04-27 15:08:32 +08:00 @Jesmora 能不能给写下 第二步 (可选) 自定义域名后,选择一个 cdn 服务商,我这里使用的是多 j 云。剩下的配置我就不演示了,就跟网站设置 cdn 一样,做个 cname 解析即可。 卡在这第二步不会弄了。 多吉云创建的加速 CDN 只能是备案的域名,国外的域名如 xxx.xxx.workers.dev 不支持,然后用了一个备案的域名,生成了一个 cdn 地址,如 xxx.s2-web.dogedns.com. 想加 CNAME 了,但是在 CF 那里有要求,此域名的 NS 必须托管在 CF ,否则不能 CNAME 指向这个加速 CDN ,但是托管了,备案就掉了。到这块不会弄了,能不能给指导一下啊? |
![]() | 19 Jesmora OP @baodl 用你备案域名在多吉那里添加一个服务,把 xxx.xxx.workers.dev 作为回源地址,然后多吉生成的地址你在你域名解析那里添加 cname 记录就行了,没有必要去 cf 那里解析 |
![]() | 20 baodl 2022-04-30 16:15:48 +08:00 谢谢,已经照你说的弄好了。但是最后效果不太好,在 workers 上的 DOH 解析,用多吉的 CDN 加速反而还慢了。不如直接访问 workers.dev 了。 |
21 c398425861 2022-11-11 14:00:52 +08:00 反代不支持 edns ? |
&nbs; 22 a9k1n9 2022-11-27 19:47:19 +08:00 “missing parameters”属于正常吗? |
23 eudemonwind 2023-05-26 23:42:38 +08:00 @0o0O0o0O0o 老哥能不能给个修改好后的完整代码? 比较看好你这个方案哈 |