自动化研究产物 — 非上游项目。
本仓库是由自动化工具链为拉瓦尔大学(Université Laval)硕士论文构建的一次性实验环境,用于复现已发表的 GitHub Actions 工作流漏洞。它是
serverless-dns/serverless-dns在提交b0b1a1538aeb1991b5bc13dfe4e18e686913b12e(2025-04-26)时的逐字快照,依据该项目自身的许可证重新分发,该许可证文件已原样包含在本快照中。上游项目未参与其中,也从未成为攻击目标,此处研究的漏洞已公开。本仓库中的每个密钥和变量均为随机生成的虚拟值——不存在任何真实凭据。操作引用和运行器镜像均固定为 2025-04-26 时解析到的版本;有关对快照所做的每项更改,请参阅工具链输出中的
pinning.md。如有疑问或异议,请联系:[email protected]
serverless-dns 是一个类 Pi-Hole 的内容拦截、无服务器、存根 DNS-over-HTTPS (DoH) 和 DNS-over-TLS (DoT) 解析器。开箱即用地运行于 Cloudflare Workers、Deno Deploy、Fastly Compute@Edge 和 Fly.io。所有这些服务的免费套餐应足以覆盖每月 10 到 20 台设备的 DNS 流量。
RethinkDNS 在生产环境中于以下端点运行 serverless-dns:
| 云平台 | 服务器位置 | 协议 | 域名 | 使用方式 |
|---|---|---|---|---|
| ⛅ Cloudflare Workers | 280+ (ping) | DoH | sky.rethinkdns.com | 配置 |
| 🦕 Deno Deploy | 30+ (ping) | DoH | 私有测试版 | |
| ⏱️ Fastly Compute@Edge | 80+ (ping) | DoH | 私有测试版 | |
| 🪂 Fly.io | 30+ (ping) | DoH 和 DoT | max.rethinkdns.com | 配置 |
服务端处理耗时从 0 毫秒(ms)到 2ms(中位数),端到端延迟(因地区和网络而异)介于 10ms 到 30ms(中位数)之间。
Fly.io 上的 Rethink DNS 解析器由 FOSS United 赞助。
Cloudflare Workers 是搭建 serverless-dns 最简单的平台:
如需分步说明,请参阅:
| 平台 | 难度 | 运行时 | 文档 |
|---|---|---|---|
| ⛅ Cloudflare | 简单 | v8 Isolates | 托管于 Cloudflare Workers |
| 🦕 Deno.com | 中等 | Deno Isolates | 托管于 Deno.com |
| ⏱️ Fastly Compute@Edge | 简单 | Fastly JS | 托管于 Fastly Compute@Edge |
| 🪂 Fly.io | 困难 | Node MicroVM | 托管于 Fly.io |
要设置拦截列表,请从浏览器访问 https://<my-domain>.tld/configure(应加载与 RethinkDNS 的 configure 页面 类似的内容)。
代码:
# 导航到工作目录
cd /my/work/dir
# 克隆本仓库
git clone https://github.com/serverless-dns/serverless-dns.git
# 导航到 serverless-dns
cd ./serverless-dns
Node:
# 如有需要,通过 nvm 安装 node v22+
# https://github.com/nvm-sh/nvm#installing-and-updating
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install --lts
# 下载依赖
npm i
# (可选)更新依赖
npm update
# 在 node 上运行 serverless-dns
./run n
# 运行 clinicjs.org 分析器
./run n [cpu|fn|mem]
Deno:
# 安装 deno.land v2+
# https://github.com/denoland/deno/#install
curl -fsSL https://deno.land/install.sh | sh
# 在 deno 上运行 serverless-dns
./run d
Fastly:
# 如有需要,通过 nvm 安装 node v22+
# 安装 Fastly CLI
# https://developer.fastly.com/learning/tools/cli
# 在 Fastly Compute@Edge 上运行 serverless-dns
./run f
Wrangler:
# 安装 Cloudflare Workers (cli),即 Wrangler
# https://developers.cloudflare.com/workers/cli-wrangler/install-update
npm i wrangler --save-dev
# 在 Cloudflare Workers (cli) 上运行 serverless-dns
# 请确保先配置好 Wrangler:
# https://developers.cloudflare.com/workers/cli-wrangler/authentication
./run w
# 使用 Chrome DevTools 分析 wrangler
# blog.cloudflare.com/profiling-your-workers-with-wrangler
本仓库的提交强制执行 Google JavaScript 风格指南(参考:.eslintrc.cjs)。
一个 git pre-commit 钩子会对 .js 文件运行 linter(eslint)和 formatter(prettier)。使用 git commit --no-verify
可绕过此钩子。
拉取请求也会检查代码风格违规,并在可能的情况下自动修复。
如需调整默认值,请配置 env.js。
对于 Cloudflare Workers,请在 wrangler.toml 中设置环境变量。
对于 Fastly Compute@Edge,请在 fastly.toml 中设置环境变量。
src/server-[node|workers|deno] <-> doh.js <-> plugin.jsplugin.js 流程:user-op.js -> cache-resolver.js -> cc.js -> resolver.jsserverless-dns 支持对 DoH 和 DoT 使用字母数字 bearer token 进行认证。对于 token,msg-key(密钥),将 hex(hmac-sha256(msg-key|domain.tld), msg) 的输出以 csv 格式追加到 ACCESS_KEYS 环境变量中。注意:msg 当前固定为 sdns-public-auth-info。
msg-key 放在 blockstamp 末尾,如下所示:
1:1:4AIggAABEGAgAA:<msg-key>(此处 1 是版本号,1:4AIggAABEGAgAA
是 blockstamp,<msg-key> 是认证密钥,: 是分隔符)。msg-key 放在包含 blockstamp 的 SNI(域名)末尾:
1-4abcbaaaaeigaiaa-<msg-key>(此处 1 是版本号,4abcbaaaaeigaiaa
是 blockstamp,<msg-key> 是认证密钥,- 是分隔符)。如果打算同时对 DoT 使用认证,请将 msg-key 保持较短(8 到 24 个字符),因为子域总长度可能仅限 63 个字符。
你可以从 max.rethinkdns.com 为你的 fork 生成访问密钥,如下所示:
msgkey="ShortAlphanumericSecret"
domain="my-serverless-dns-domain.tld"
curl 'https://max.rethinkdns.com/genaccesskey?key='"$msgkey"'&dom='"$domain"
# 输出
# {"accesskey":["my-serverless-dns-domain.tld|deadbeefd3adb33fa2bb33fd3eadf084beef3b152beefdead49bbb2b33fdead83d3adbeefdeadb33f"],"context":"sdns-public-auth-info"}
serverless-dns 可通过 Cloudflare Logpush 上传日志。