近期特殊时期佬友们的上游DOH大部分都挂了,分享几种方式来连接国外DOH,解决特定场景下科学上网的DNS问题。大部分佬友都是客户端科学上网国外域名远程解析可能不涉及此问题。
DOH走代理
不同的应用可能设置方法不太相同,以smartdns和openclash为例简单介绍下。
smartdns设置
1、打开 smartdns → 代理服务器设置,填入http或者socks代理即可(代理需要自行获取)
2、选择需要开启代理的上游dns服务器,高级设置,勾选“使用代理”,保存应用即可
openclash设置
1、打开openclash → 覆写设置 → DNS设置,勾选 “遵循规则”即可
2、在对应的规则列表中添加DOH地址的域名或者IP走代理请求
CF代理DOH
1、通过cf worker的方式代理DOH请求,配合优选可用性和延迟都还可以。
worker脚本
// SPDX-License-Identifier: 0BSD
const doh = 'https://cloudflare-dns.com/dns-query'
const dohjson = 'https://cloudflare-dns.com/dns-query'
const contype = 'application/dns-message'
const jstontype = 'application/dns-json'
const path = ''; // default allow all, must start with '/' if specified, eg. "/dns-query"
const r404 = new Response(null, {status: 404});
// developers.cloudflare.com/workers/runtime-apis/fetch-event/#syntax-module-worker
export default {
async fetch(r, env, ctx) {
return handleRequest(r);
},
};
async function handleRequest(request) {
// when res is a Promise<Response>, it reduces billed wall-time
// blog.cloudflare.com/workers-optimization-reduces-your-bill
let res = r404;
const { method, headers, url } = request
const {searchParams, pathname} = new URL(url)
//Check path
if (!pathname.startsWith(path)) {
return r404;
}
if (method == 'GET' && searchParams.has('dns')) {
return fetch(doh + '?dns=' + searchParams.get('dns'), {
method: 'GET',
headers: {
'Accept': contype,
}
});
} else if (method === 'POST' && headers.get('content-type') === contype) {
// streaming out the request body is optimal than awaiting on it
const rostream = request.body;
return fetch(doh, {
method: 'POST',
headers: {
'Accept': contype,
'Content-Type': contype,
},
body: rostream,
});
} else if (method === 'GET' && headers.get('Accept') === jstontype) {
const search = new URL(url).search
return fetch(dohjson + search, {
method: 'GET',
headers: {
'Accept': jstontype,
}
});
}
return res;
}
2、需要修改path来方式被其余人恶意刷请求数,path以/开头,路径自己随便填写,然后绑定自定义域名,doh 和dohjson变量根据自己情况修改即可。例如path为 “/fanxinxiaozhan”,自定义域名“XXX”,最终DOH地址为:https://XXX/fanxinxiaozhan
3、通过以下命令测试DOH地址是否有效,返回数据则表示没问题。
curl -H ‘accept: application/dns-json’ ‘https://XXX/fanxinxiaozhan?name=seek.nuer.cc&type=A’
4、脚本来源于开源项目:https://github.com/tina-hello/doh-cf-workers,大概测试了下每天6w请求(低于CF worker上限10w请求),最好是配合本地DNS分流和缓存减少请求次数
常用DNS和DOH地址
- 常用DNS提供商:https://adguard-dns.io/kb/zh-CN/general/dns-providers/
- DOH地址:https://github.com/curl/curl/wiki/DNS-over-HTTPS
佬友们觉得有用的话别忘了给个小星星哈