HongShi AI正在绞尽脑汁想思路ING···
HongShiのAI摘要
GPT-4o

无服务器部署私人DoH

前一阵子L站被SNI阻断了,直接不能直连了,搜了一下,发现自己搭建一个DoH是一个比较好的方案。当然github上有很多好的DoH项目,但是这些项目基本上都需要服务器,并且配置比较复杂。于是,这个项目诞生了,一个可以通过Netlify、vercel、huggingface部署的Doh项目。

什么是DoH

DNS over HTTPS (DoH) 是一种通过 HTTPS 协议加密 DNS 查询和响应的技术。传统的 DNS 查询使用明文方式传输,通常通过 UDP 53 端口进行,这种方式容易受到中间人攻击、DNS 劫持等安全威胁。DoH 的主要目标是使用 HTTPS 协议来加密 DNS 查询和响应,从而保护用户的隐私和安全。它将 DNS 查询封装在 HTTPS 流量中,通过 HTTPS 协议进行传输,这样可以有效防止第三方监控用户的上网行为,保护用户的隐私。
关于DoH工作原理这里不详细介绍,详细信息可以参考这里

项目介绍

项目地址:HongShi-DoH请点个star,有什么问题请提交到issues

这是配置项:

变量名 默认值 说明
DOH_PATH dns-query 自定义 DoH 路径。设定后将禁用默认 /dns-query
DOH cloudflare-dns.com 上游 DoH 服务(可为 dns.google 等)
IP_ENRICH auto local / ipwhois / ipapi / ipinfo 自动优先使用本地数据库
IPINFO_TOKEN (可选) IP_ENRICH=ipinfo 时使用
TOKEN / HSD_PATH (可选) 替代路径参数(历史兼容)

这是一些可用功能对应的地址:

功能 描述
/dns-query 标准 DoH 接口,支持 GET / POST / application/dns-message
/resolve JSON 模式 DNS 查询(聚合 A / AAAA / NS)
/ui/ 可视化前端界面,支持输入域名、选择 DoH、显示 JSON 与表格
/ip 返回请求方 IP、归属地、ASN、运营商、经纬度等信息
/host 显示部署平台主机名与实例信息
/meta 返回当前 DOH_PATH、DNS Query 启用状态
/ 首页介绍,自动检测 /meta

部署

静态平台

这个项目能托管到netlify、vercel、huggingface等平台,当然,你也可以部署到自己的服务器上(包括虚拟主机)
你只需要fork这个仓库,在vercel、Netlify绑定github账户,点击部署、等待上线就行了。
当然,这个项目也支持一些自定义。

huggingface

由于huggingface比较特殊,所以需要对项目做一些小的更改。
这里提供两个版本,一个是完整功能的,另一个是仅有dns解析功能的,大家按需下载。
完整功能版本-OneDrive
完整功能版本-博客下载
完整功能版本与上述的配置方法一致
仅dns解析功能版本-OneDrive
完整功能版本-博客下载
注,仅DNS版本的环境变量如下

1
2
3
UPSTREAM_DOH = https://dns.google/dns-query
DOH_PATH = /my-secret-doh-123
CACHE_TTL_SECONDS = 120

项目架构

系统由三部分组成:

  1. Edge Functions(核心)

    • 位于 netlify/edge-functions/dns.tsvercel/app/route.ts
    • 负责 DNS 请求解析、上游转发、以及 IP 定位。
    • 通过 TypeScript 在 Edge 运行时执行,速度快、无冷启动。
  2. 静态页面(UI + 首页)

    • /public/ui/index.html 是可交互查询界面,支持切换上游(Cloudflare、Google、自定义)。
    • /public/index.html 为主页,展示服务简介与导航按钮。
  3. 配置文件

    • Netlify 使用 netlify.toml 注册 Edge Function;

    • Vercel 使用 app/ 目录自动匹配路径。

    • 主要环境变量:

      • DOH_PATH:自定义 DoH 端点路径(默认 dns-query,修改后 /dns-query 将禁用)。
      • DOH:上游 DoH 服务地址,默认 cloudflare-dns.com

核心运行逻辑

  1. /resolve/dns-query

用户从 UI 发起查询时,Edge Function 会:

1
2
3
const name = url.searchParams.get('name');
const type = url.searchParams.get('type') || 'A';
const doh = url.searchParams.get('doh') || '';

然后依次尝试多个上游:

1
2
const chain = urlListForHost(host, name, type);
const out = await fetchJsonChain(chain);

其中 urlListForHost() 生成 Cloudflare / Google / 1.1.1.1 的候选 DoH URL,
fetchJsonChain() 轮询请求直到某个成功返回。

若全部失败,则返回:

1
{"error": "upstream failed", "detail": "..."}
  1. /ip

Edge 运行时调用 https://ipapi.co/{ip}/json/ 获取基础地理信息,并加入本地 ASN 对照表

1
2
3
4
5
6
7
const ASN_MAP = {
13335: "Cloudflare",
4134: "中国电信",
9808: "中国移动",
16509: "亚马逊云",
15169: "谷歌云"
};

返回结果形如:

1
2
3
4
5
6
7
{
"ip": "8.8.8.8",
"as": { "number": 15169, "name": "Google LLC", "info": "谷歌云" },
"country": { "code": "US", "name": "United States" },
"regions": ["California", "Mountain View"],
"location": { "latitude": 37.4, "longitude": -122.0 }
}
  1. /host/meta
  • /meta 返回当前环境配置(例如 DOH_PATH)。
  • /host 返回当前平台信息(Netlify/Vercel 及区域标识)。
UI 特性
  • 玻璃拟态卡片 + 渐变背景;
  • 查询结果同时以表格和 JSON 展示;
  • 支持同源与跨源 DoH 测试;
  • 自动检测后端 /resolve 连通性。

使用教程

Windows使用

这里仅作为一个简单的教程,适用于临时使用。
*注意,由于这个项目延迟由托管平台->设备的延迟决定,一般情况下延迟可能会很大,不建议作为默认的DNS服务器使用。

Edge

edge://settings/中搜索“DNS”,打开使用安全的DNS,并在服务提供商的文本框中输入你部署的服务(必须携带https请求头,并且携带dns解析路径)

Chrome

选择 偏好设置->隐私和安全->安全,或者在地址栏输入chrome://settings/security。在 高级 部分,完成 DoH 接入点配置。 打开 使用安全DNS。 在选择 DNS 提供商中选中 添加自定义DNS服务提供商。在下方编辑框中输入 DoH接入点。

安卓

大多数系统仅支持输入主机名作为端点,但是,你在这些平台部署后只会返回URL,并不会有主机名,所以我个人推荐用Intra
安装完成后前往设置页面,选择设置,在文本框中输入你的dnh地址即可。