<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on aloneowo's blog</title><link>https://blog.hatsune01.de/tags/cloudflare/</link><description>Recent content in Cloudflare on aloneowo's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 28 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.hatsune01.de/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>SuperDoH：基于 Cloudflare Workers 的多上游 DNS over HTTPS 代理，支持ECH和路由注入</title><link>https://blog.hatsune01.de/p/superdoh%E5%9F%BA%E4%BA%8E-cloudflare-workers-%E7%9A%84%E5%A4%9A%E4%B8%8A%E6%B8%B8-dns-over-https-%E4%BB%A3%E7%90%86%E6%94%AF%E6%8C%81ech%E5%92%8C%E8%B7%AF%E7%94%B1%E6%B3%A8%E5%85%A5/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://blog.hatsune01.de/p/superdoh%E5%9F%BA%E4%BA%8E-cloudflare-workers-%E7%9A%84%E5%A4%9A%E4%B8%8A%E6%B8%B8-dns-over-https-%E4%BB%A3%E7%90%86%E6%94%AF%E6%8C%81ech%E5%92%8C%E8%B7%AF%E7%94%B1%E6%B3%A8%E5%85%A5/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;先推销一下自己的项目（手动 doge）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="github-card-box" id="gh-3966376462666330306134643435316333316262336236373532613061323434"&gt;
 &lt;a class="github-card-link" href="https://github.com/aloneowo0/SuperDoH" target="_blank" rel="noopener noreferrer"&gt;
 &lt;div class="gc-header"&gt;
 &lt;div class="gc-title-wrap"&gt;
 &lt;div class="gc-avatar" id="gh-3966376462666330306134643435316333316262336236373532613061323434-avatar"&gt;
 &lt;svg viewBox="0 0 16 16" width="28" height="28" fill="currentColor"&gt;
 &lt;path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="gc-name-text"&gt;
 &lt;span class="gc-owner"&gt;aloneowo0&lt;/span&gt;
 &lt;span class="gc-slash"&gt;/&lt;/span&gt;
 &lt;span class="gc-repo"&gt;SuperDoH&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="gc-logo" title="View on GitHub"&gt;
 &lt;svg viewBox="0 0 16 16" width="36" height="36" fill="currentColor"&gt;
 &lt;path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="gc-desc" id="gh-3966376462666330306134643435316333316262336236373532613061323434-desc"&gt;正在读取仓库简介...&lt;/div&gt;

 &lt;div class="gc-meta" id="gh-3966376462666330306134643435316333316262336236373532613061323434-meta"&gt;
 &lt;div class="gc-stats"&gt;
 &lt;span class="gc-item" id="gh-3966376462666330306134643435316333316262336236373532613061323434-stars"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;--&lt;/span&gt;
 &lt;/span&gt;
 &lt;span class="gc-item" id="gh-3966376462666330306134643435316333316262336236373532613061323434-forks"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;--&lt;/span&gt;
 &lt;/span&gt;
 &lt;span class="gc-item" id="gh-3966376462666330306134643435316333316262336236373532613061323434-license" style="display:none;"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;&lt;/span&gt;
 &lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="gc-lang-wrap"&gt;
 &lt;span class="gc-item" id="gh-3966376462666330306134643435316333316262336236373532613061323434-lang" style="display:none;"&gt;
 &lt;span class="gc-dot"&gt;&lt;/span&gt;
 &lt;span class="val"&gt;&lt;/span&gt;
 &lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/a&gt;

 &lt;style&gt;
 .github-card-box {
 margin: 1.8rem 0;
 width: 100%;
 max-width: 585px;
 box-sizing: border-box;
 }
 .github-card-box .github-card-link {
 display: block;
 padding: 1.7rem 1.9rem;
 border-radius: 18px;
 background: var(--card-background, rgba(125, 125, 125, 0.05));
 border: 1px solid rgba(125, 125, 125, 0.18);
 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
 text-decoration: none !important;
 color: inherit;
 transition: all 0.2s ease;
 box-sizing: border-box;
 }
 .github-card-box .github-card-link:hover {
 background: rgba(125, 125, 125, 0.09);
 border-color: rgba(99, 102, 241, 0.45);
 transform: translateY(-2px);
 box-shadow: 0 10px 28px rgba(0, 0, 0, 0.09);
 }
 .github-card-box .gc-header {
 display: flex;
 align-items: center;
 justify-content: space-between;
 margin-bottom: 1.05rem;
 }
 .github-card-box .gc-title-wrap {
 display: flex;
 align-items: center;
 gap: 0.9rem;
 font-size: 1.58rem;
 line-height: 1.35;
 overflow: hidden;
 }
 .github-card-box .gc-avatar {
 width: 48px;
 height: 48px;
 border-radius: 50%;
 overflow: hidden;
 display: flex;
 align-items: center;
 justify-content: center;
 background: rgba(125, 125, 125, 0.2);
 flex-shrink: 0;
 }
 .github-card-box .gc-avatar img {
 width: 100%;
 height: 100%;
 object-fit: cover;
 margin: 0 !important;
 display: block;
 }
 .github-card-box .gc-name-text {
 display: flex;
 align-items: center;
 gap: 0.55rem;
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;
 }
 .github-card-box .gc-owner {
 opacity: 0.75;
 font-weight: 400;
 }
 .github-card-box .gc-slash {
 opacity: 0.35;
 }
 .github-card-box .gc-repo {
 font-weight: 600;
 color: #3b82f6;
 }
 .github-card-box .gc-logo {
 opacity: 0.55;
 display: flex;
 align-items: center;
 flex-shrink: 0;
 }
 .github-card-box .gc-desc {
 font-size: 1.22rem;
 line-height: 1.65;
 opacity: 0.84;
 margin: 0 0 1.2rem 0;
 display: -webkit-box;
 -webkit-line-clamp: 2;
 -webkit-box-orient: vertical;
 overflow: hidden;
 }
 .github-card-box .gc-meta {
 display: flex;
 align-items: center;
 justify-content: space-between;
 padding-top: 1.1rem;
 border-top: 1px solid rgba(125, 125, 125, 0.14);
 font-size: 1.14rem;
 opacity: 0.82;
 }
 .github-card-box .gc-stats {
 display: flex;
 align-items: center;
 gap: 1.75rem;
 }
 .github-card-box .gc-item {
 display: inline-flex;
 align-items: center;
 gap: 0.55rem;
 }
 .github-card-box .gc-dot {
 width: 14px;
 height: 14px;
 border-radius: 50%;
 background: #3b82f6;
 display: inline-block;
 }
 .github-card-box:not(.gc-loaded) .gc-desc {
 opacity: 0.4;
 animation: gc-pulse 1.5s infinite ease-in-out;
 }
 @keyframes gc-pulse {
 0% { opacity: 0.3; }
 50% { opacity: 0.65; }
 100% { opacity: 0.3; }
 }
 [data-scheme="dark"] .github-card-box .gc-repo {
 color: #60a5fa;
 }
 [data-scheme="dark"] .github-card-box .github-card-link {
 background: rgba(255, 255, 255, 0.04);
 border-color: rgba(255, 255, 255, 0.12);
 }
 [data-scheme="dark"] .github-card-box .github-card-link:hover {
 background: rgba(255, 255, 255, 0.08);
 border-color: rgba(96, 165, 250, 0.55);
 }
 [data-scheme="dark"] .github-card-box .gc-meta {
 border-top-color: rgba(255, 255, 255, 0.1);
 }
 &lt;/style&gt;

 &lt;script&gt;
 (function() {
 const box = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434");
 const desc = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-desc");
 const stars = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-stars");
 const forks = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-forks");
 const license = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-license");
 const lang = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-lang");
 const avatar = document.getElementById("gh-3966376462666330306134643435316333316262336236373532613061323434-avatar");

 fetch('https://api.github.com/repos/aloneowo0\/SuperDoH')
 .then(r =&gt; {
 if (!r.ok) throw new Error(r.status);
 return r.json();
 })
 .then(d =&gt; {
 desc.textContent = d.description || "暂无项目描述";
 if (d.stargazers_count != null) {
 stars.querySelector(".val").textContent = Intl.NumberFormat('en-US', { notation: "compact" }).format(d.stargazers_count);
 }
 if (d.forks_count != null) {
 forks.querySelector(".val").textContent = Intl.NumberFormat('en-US', { notation: "compact" }).format(d.forks_count);
 }
 if (d.license &amp;&amp; d.license.spdx_id &amp;&amp; d.license.spdx_id !== "NOASSERTION") {
 license.style.display = "inline-flex";
 license.querySelector(".val").textContent = d.license.spdx_id;
 }
 if (d.language) {
 lang.style.display = "inline-flex";
 lang.querySelector(".val").textContent = d.language;
 }
 if (d.owner &amp;&amp; d.owner.avatar_url) {
 avatar.innerHTML = '&lt;img src="' + d.owner.avatar_url + '" alt="aloneowo0" loading="lazy" /&gt;';
 }
 box.classList.add("gc-loaded");
 })
 .catch(() =&gt; {
 desc.textContent = "在 GitHub 上查看项目源码与文档";
 box.classList.add("gc-loaded");
 });
 })();
 &lt;/script&gt;
&lt;/div&gt;

&lt;h1 id="搭建一个个人-doh-服务"&gt;&lt;a href="#%e6%90%ad%e5%bb%ba%e4%b8%80%e4%b8%aa%e4%b8%aa%e4%ba%ba-doh-%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;搭建一个个人 DoH 服务
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Cloudflare 免费计划有每日额度限制，请不要随便公开自己的 DoH 端点。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;随便讲一下 DNS 的作用，和主题关系不大&lt;/p&gt;
&lt;p&gt;我们访问互联网时，通常会在浏览器里输入一个网址。但计算机真正用来连接网络资源的是 &lt;code&gt;IP 地址&lt;/code&gt;，而不是域名。因为 IP 地址不好记，所以才有了 &lt;code&gt;DNS&lt;/code&gt;：它负责把 &lt;code&gt;baidu.com&lt;/code&gt; 这样的域名转换成对应的 IP 地址。&lt;/p&gt;
&lt;p&gt;&lt;img alt="ipv6 真长……" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.hatsune01.de/images/posts/workers-doh/01.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;能硬背 32 位 IPv6 地址的也是个狠人&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;传统 DNS 通常运行在 &lt;code&gt;UDP 53&lt;/code&gt; 上，默认不加密，因此安全性和抗劫持能力都比较差。在早期 HTTP 环境下，DNS 劫持并不少见。为了解决这些问题，后来出现了几种加密 DNS 协议，比如 &lt;code&gt;DoT&lt;/code&gt;、&lt;code&gt;DoH&lt;/code&gt; 和 &lt;code&gt;DoQ&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="doh-有什么用"&gt;&lt;a href="#doh-%e6%9c%89%e4%bb%80%e4%b9%88%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;DoH 有什么用
&lt;/h2&gt;&lt;p&gt;DoH 全称是 &lt;code&gt;DNS over HTTPS&lt;/code&gt;。简单来说，它会把 DNS 查询封装进 HTTPS 请求里，并通过 SSL/TLS 证书来保证传输过程的安全性。这里引用两段来自 Wiki 的数字身份认证说明：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;“若注册者认定一个人的身份，是通过注册者信任的另外一个人来进行的。注册者信任的那个人就是身份认证机构（可以是一个自然人）。把数字身份比喻成一个证件，那么数字证书就是身份认证机构盖在数字身份证上的一个章或印（或者说加在数字身份证上的一个签名），这一行为表示身份认证机构已认定这个人。”&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;“身份认证机构是人们注册公钥的机构。注册之后，身份认证机构就向注册者发一数字证书，也就是说在注册者的数字身份证上加签。服务有免费，也有收费。身份认证机构也可以是一个自然人，就如 PGP 和 GPG 系统所倡导的。”&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;简单来说，因为 DoH 使用 HTTPS 作为传输层，我们可以降低 DNS 查询被监听或篡改的风险。比如某些喜欢往 DNS 结果里“投毒”、把域名解析到 &lt;code&gt;localhost&lt;/code&gt; 的情况，DoH 就能在一定程度上缓解。&lt;/p&gt;
&lt;h2 id="项目实现的功能-推销"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e5%ae%9e%e7%8e%b0%e7%9a%84%e5%8a%9f%e8%83%bd-%e6%8e%a8%e9%94%80" class="header-anchor"&gt;&lt;/a&gt;项目实现的功能 &lt;del&gt;（推销）&lt;/del&gt;
&lt;/h2&gt;&lt;p&gt;这个项目主要实现了下面几个功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过 &lt;code&gt;cf-forward-ip&lt;/code&gt; 实现 &lt;code&gt;ECS&lt;/code&gt; 的手动注入。翻译成人话就是：解析结果会尽量根据用户所在地区进行优化。&lt;/li&gt;
&lt;li&gt;使用并发请求加速解析，并返回最快的上游结果。&lt;/li&gt;
&lt;li&gt;为cloudflare，Meta提供了完整的ECH注入&lt;/li&gt;
&lt;li&gt;带有简单过滤逻辑，可以识别错误的 DNS 返回；返回 &lt;code&gt;localhost&lt;/code&gt; 的结果也会被过滤。&lt;/li&gt;
&lt;li&gt;为google解析的内容引用了Sheas Cealing的规则使其可以在国内访问&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="部署"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;部署
&lt;/h2&gt;&lt;p&gt;搭建这个服务需要准备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 Cloudflare 账号&lt;/li&gt;
&lt;li&gt;一个托管到 Cloudflare 的域名&lt;/li&gt;
&lt;li&gt;一个 GitHub 账号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部署步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork 我的项目。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class="github-card-box" id="gh-6239323836333039633332653433383137343065333366623731613163386239"&gt;
 &lt;a class="github-card-link" href="https://github.com/aloneowo0/Workers-DoH" target="_blank" rel="noopener noreferrer"&gt;
 &lt;div class="gc-header"&gt;
 &lt;div class="gc-title-wrap"&gt;
 &lt;div class="gc-avatar" id="gh-6239323836333039633332653433383137343065333366623731613163386239-avatar"&gt;
 &lt;svg viewBox="0 0 16 16" width="28" height="28" fill="currentColor"&gt;
 &lt;path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="gc-name-text"&gt;
 &lt;span class="gc-owner"&gt;aloneowo0&lt;/span&gt;
 &lt;span class="gc-slash"&gt;/&lt;/span&gt;
 &lt;span class="gc-repo"&gt;Workers-DoH&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="gc-logo" title="View on GitHub"&gt;
 &lt;svg viewBox="0 0 16 16" width="36" height="36" fill="currentColor"&gt;
 &lt;path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div class="gc-desc" id="gh-6239323836333039633332653433383137343065333366623731613163386239-desc"&gt;正在读取仓库简介...&lt;/div&gt;
 
 &lt;div class="gc-meta" id="gh-6239323836333039633332653433383137343065333366623731613163386239-meta"&gt;
 &lt;div class="gc-stats"&gt;
 &lt;span class="gc-item" id="gh-6239323836333039633332653433383137343065333366623731613163386239-stars"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;--&lt;/span&gt;
 &lt;/span&gt;
 &lt;span class="gc-item" id="gh-6239323836333039633332653433383137343065333366623731613163386239-forks"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;--&lt;/span&gt;
 &lt;/span&gt;
 &lt;span class="gc-item" id="gh-6239323836333039633332653433383137343065333366623731613163386239-license" style="display:none;"&gt;
 &lt;svg viewBox="0 0 16 16" width="22" height="22" fill="currentColor"&gt;&lt;path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"/&gt;&lt;/svg&gt;
 &lt;span class="val"&gt;&lt;/span&gt;
 &lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="gc-lang-wrap"&gt;
 &lt;span class="gc-item" id="gh-6239323836333039633332653433383137343065333366623731613163386239-lang" style="display:none;"&gt;
 &lt;span class="gc-dot"&gt;&lt;/span&gt;
 &lt;span class="val"&gt;&lt;/span&gt;
 &lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/a&gt;
 
 &lt;style&gt;
 .github-card-box {
 margin: 1.8rem 0;
 width: 100%;
 max-width: 585px;
 box-sizing: border-box;
 }
 .github-card-box .github-card-link {
 display: block;
 padding: 1.7rem 1.9rem;
 border-radius: 18px;
 background: var(--card-background, rgba(125, 125, 125, 0.05));
 border: 1px solid rgba(125, 125, 125, 0.18);
 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
 text-decoration: none !important;
 color: inherit;
 transition: all 0.2s ease;
 box-sizing: border-box;
 }
 .github-card-box .github-card-link:hover {
 background: rgba(125, 125, 125, 0.09);
 border-color: rgba(99, 102, 241, 0.45);
 transform: translateY(-2px);
 box-shadow: 0 10px 28px rgba(0, 0, 0, 0.09);
 }
 .github-card-box .gc-header {
 display: flex;
 align-items: center;
 justify-content: space-between;
 margin-bottom: 1.05rem;
 }
 .github-card-box .gc-title-wrap {
 display: flex;
 align-items: center;
 gap: 0.9rem;
 font-size: 1.58rem;
 line-height: 1.35;
 overflow: hidden;
 }
 .github-card-box .gc-avatar {
 width: 48px;
 height: 48px;
 border-radius: 50%;
 overflow: hidden;
 display: flex;
 align-items: center;
 justify-content: center;
 background: rgba(125, 125, 125, 0.2);
 flex-shrink: 0;
 }
 .github-card-box .gc-avatar img {
 width: 100%;
 height: 100%;
 object-fit: cover;
 margin: 0 !important;
 display: block;
 }
 .github-card-box .gc-name-text {
 display: flex;
 align-items: center;
 gap: 0.55rem;
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;
 }
 .github-card-box .gc-owner {
 opacity: 0.75;
 font-weight: 400;
 }
 .github-card-box .gc-slash {
 opacity: 0.35;
 }
 .github-card-box .gc-repo {
 font-weight: 600;
 color: #3b82f6;
 }
 .github-card-box .gc-logo {
 opacity: 0.55;
 display: flex;
 align-items: center;
 flex-shrink: 0;
 }
 .github-card-box .gc-desc {
 font-size: 1.22rem;
 line-height: 1.65;
 opacity: 0.84;
 margin: 0 0 1.2rem 0;
 display: -webkit-box;
 -webkit-line-clamp: 2;
 -webkit-box-orient: vertical;
 overflow: hidden;
 }
 .github-card-box .gc-meta {
 display: flex;
 align-items: center;
 justify-content: space-between;
 padding-top: 1.1rem;
 border-top: 1px solid rgba(125, 125, 125, 0.14);
 font-size: 1.14rem;
 opacity: 0.82;
 }
 .github-card-box .gc-stats {
 display: flex;
 align-items: center;
 gap: 1.75rem;
 }
 .github-card-box .gc-item {
 display: inline-flex;
 align-items: center;
 gap: 0.55rem;
 }
 .github-card-box .gc-dot {
 width: 14px;
 height: 14px;
 border-radius: 50%;
 background: #3b82f6;
 display: inline-block;
 }
 .github-card-box:not(.gc-loaded) .gc-desc {
 opacity: 0.4;
 animation: gc-pulse 1.5s infinite ease-in-out;
 }
 @keyframes gc-pulse {
 0% { opacity: 0.3; }
 50% { opacity: 0.65; }
 100% { opacity: 0.3; }
 }
 [data-scheme="dark"] .github-card-box .gc-repo {
 color: #60a5fa;
 }
 [data-scheme="dark"] .github-card-box .github-card-link {
 background: rgba(255, 255, 255, 0.04);
 border-color: rgba(255, 255, 255, 0.12);
 }
 [data-scheme="dark"] .github-card-box .github-card-link:hover {
 background: rgba(255, 255, 255, 0.08);
 border-color: rgba(96, 165, 250, 0.55);
 }
 [data-scheme="dark"] .github-card-box .gc-meta {
 border-top-color: rgba(255, 255, 255, 0.1);
 }
 &lt;/style&gt;
 
 &lt;script&gt;
 (function() {
 const box = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239");
 const desc = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-desc");
 const stars = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-stars");
 const forks = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-forks");
 const license = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-license");
 const lang = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-lang");
 const avatar = document.getElementById("gh-6239323836333039633332653433383137343065333366623731613163386239-avatar");
 
 fetch('https://api.github.com/repos/aloneowo0\/Workers-DoH')
 .then(r =&gt; {
 if (!r.ok) throw new Error(r.status);
 return r.json();
 })
 .then(d =&gt; {
 desc.textContent = d.description || "暂无项目描述";
 if (d.stargazers_count != null) {
 stars.querySelector(".val").textContent = Intl.NumberFormat('en-US', { notation: "compact" }).format(d.stargazers_count);
 }
 if (d.forks_count != null) {
 forks.querySelector(".val").textContent = Intl.NumberFormat('en-US', { notation: "compact" }).format(d.forks_count);
 }
 if (d.license &amp;&amp; d.license.spdx_id &amp;&amp; d.license.spdx_id !== "NOASSERTION") {
 license.style.display = "inline-flex";
 license.querySelector(".val").textContent = d.license.spdx_id;
 }
 if (d.language) {
 lang.style.display = "inline-flex";
 lang.querySelector(".val").textContent = d.language;
 }
 if (d.owner &amp;&amp; d.owner.avatar_url) {
 avatar.innerHTML = '&lt;img src="' + d.owner.avatar_url + '" alt="aloneowo0" loading="lazy" /&gt;';
 }
 box.classList.add("gc-loaded");
 })
 .catch(() =&gt; {
 desc.textContent = "在 GitHub 上查看项目源码与文档";
 box.classList.add("gc-loaded");
 });
 })();
 &lt;/script&gt;
 &lt;/div&gt;

2. 修改 &lt;code&gt;.env&lt;/code&gt; 文件里的内容并保存。如果没有特殊需求，保持默认配置即可。
3. 登录 Cloudflare，进入 &lt;strong&gt;Workers 和 Pages&lt;/strong&gt;，点击创建应用程序。
&lt;img alt="Cloudflare Workers 和 Pages 创建应用程序页面" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.hatsune01.de/images/posts/workers-doh/02.webp"&gt;
4. 选择连接到 GitHub，并选择刚刚 Fork 的项目。保持默认配置，直接部署。
5. 绑定一个域名。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;设置的域名或子域名尽量不要出现敏感词汇，否则容易被阻断。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;等待部署完成后，就可以开始使用了。&lt;/p&gt;
&lt;h2 id="使用"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;使用
&lt;/h2&gt;&lt;p&gt;目前我确认 Chrome、Firefox 浏览器和 Windows 11 系统都支持配置 DoH。其他客户端是否支持，建议自行测试。&lt;/p&gt;
&lt;h3 id="ech实现的原理"&gt;&lt;a href="#ech%e5%ae%9e%e7%8e%b0%e7%9a%84%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;ECH实现的原理
&lt;/h3&gt;&lt;p&gt;cloudflare的ECH其实是公开的，而且很离谱的是全部ECH的密钥是同一个，更离谱的是cf关闭ECH的方式是把DNS上HTTPS字段的解析里面的ECH给删掉，所以说如果我们通过构建一个带有正确ECH的DNS解析结果就可以实现通过ECH与网站链接&lt;/p&gt;
&lt;p&gt;Meta的情况会特殊一点。Meta本身是支持ECH的，但是由于不明的原因ECH没有公布在DNS中，跟cloudflare那些没有公布ECH的网站类似都是不公开ECH。问题是Meta的ECH是独立的，获取会比较麻烦。我在github的一个帖子中看到一个获取的方法，使用的是retry来实现ECH的获取。简单点说是如果你发送一个错误的ECH给服务器，如果服务器收到了会返回一个retry_config让你的浏览器重试，这个retry里面就包含正确的ECH字段，从而获取到正确的ECH。&lt;/p&gt;
&lt;p&gt;然后对上述网站进行dns结果重写并注入ECH就可以使用ECH访问了&lt;/p&gt;</description></item></channel></rss>