无服务器部署私人DoH

无服务器部署私人DoH
HongShi前一阵子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 | UPSTREAM_DOH = https://dns.google/dns-query |
项目架构
系统由三部分组成:
Edge Functions(核心)
- 位于
netlify/edge-functions/dns.ts与vercel/app/route.ts。 - 负责 DNS 请求解析、上游转发、以及 IP 定位。
- 通过 TypeScript 在 Edge 运行时执行,速度快、无冷启动。
- 位于
静态页面(UI + 首页)
/public/ui/index.html是可交互查询界面,支持切换上游(Cloudflare、Google、自定义)。/public/index.html为主页,展示服务简介与导航按钮。
配置文件
Netlify 使用
netlify.toml注册 Edge Function;Vercel 使用
app/目录自动匹配路径。主要环境变量:
DOH_PATH:自定义 DoH 端点路径(默认dns-query,修改后/dns-query将禁用)。DOH:上游 DoH 服务地址,默认cloudflare-dns.com。
核心运行逻辑
/resolve与/dns-query
用户从 UI 发起查询时,Edge Function 会:
1 | const name = url.searchParams.get('name'); |
然后依次尝试多个上游:
1 | const chain = urlListForHost(host, name, type); |
其中 urlListForHost() 生成 Cloudflare / Google / 1.1.1.1 的候选 DoH URL,fetchJsonChain() 轮询请求直到某个成功返回。
若全部失败,则返回:
1 | {"error": "upstream failed", "detail": "..."} |
/ip
Edge 运行时调用 https://ipapi.co/{ip}/json/ 获取基础地理信息,并加入本地 ASN 对照表:
1 | const ASN_MAP = { |
返回结果形如:
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地址即可。








![[折腾笔记]小狼毫输入法](/images/cover/%E5%B0%8F%E7%8B%BC%E6%AF%AB.png)



