侧边栏壁纸
博主头像
凡心小站博主等级

以平凡之心,瞰世间繁星

  • 累计撰写 30 篇文章
  • 累计创建 13 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

【网络】 DNS设置之国外DOH连接方式

凡心
2025-03-09 / 0 评论 / 0 点赞 / 79 阅读 / 3692 字
温馨提示:
本文最后更新于 2025-03-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

背景

近期(特殊时期)有部分小伙伴发现自己的节点一片红,定位半天发现是上游国外DOH都挂了,简单粗暴点的方法就是换成国内的dns恢复正常,但是可能会导致DNS泄露,今天主要和大家分享下国外DOH连接方式。如果都是通过客户端科学或者走fake-ip的方式可能不涉及此问题。

适用场景

  • 软路由透明代理场景
  • redir-host模式需要真实ip场景

DOH走代理

不同的应用可能设置方法不太相同,以smartdns和openclash为例简单介绍下。

smartdns设置

1、打开 smartdns -> 代理服务器设置,填入http或者socks代理即可(代理需要自行获取)

截图_2025-03-09_20-07-56.png

2、选择需要开启代理的上游dns服务器,高级设置,勾选“使用代理”,保存应用即可

openclash设置

1、打开openclash -> 覆写设置 -> DNS设置,勾选 “遵循规则”即可

截图_2025-03-09_20-12-54.png

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泄露的问题,直接使用国内DNS即可,速度快还比较问题,上述DOH方式只是给出一个思路,解决某些特定场景下的问题。

0

评论区