<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>EdgeOne on 狼的公告板 ver.Hugo</title><link>https://blog.tama.guru/tags/edgeone.html</link><description>Recent content in EdgeOne on 狼的公告板 ver.Hugo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>tamakyi</copyright><lastBuildDate>Fri, 04 Sep 2026 00:12:56 +0800</lastBuildDate><atom:link href="https://blog.tama.guru/tags/edgeone/index.xml" rel="self" type="application/rss+xml"/><item><title>以狼的提问箱为例-免备案双 CDN 分流实战教程：境内走 EdgeOne、境外走 Cloudflare</title><link>https://blog.tama.guru/record/tutorial-dual-cdn-split-routing.html</link><pubDate>Thu, 03 Sep 2026 15:26:54 +0800</pubDate><guid>https://blog.tama.guru/record/tutorial-dual-cdn-split-routing.html</guid><description>&lt;img src="https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp" alt="Featured image of post 以狼的提问箱为例-免备案双 CDN 分流实战教程：境内走 EdgeOne、境外走 Cloudflare" /&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;教程性质&lt;/strong&gt;：
本文以 狼的提问箱 项目为例，但所有原理与步骤对任何「不备案、有海外用户、想让境内/境外各走最优线路」的站点通用。&lt;/p&gt;
&lt;p&gt;场景速览：域名权威 DNS 托管在 &lt;strong&gt;DNSPod&lt;/strong&gt;（免费版支持按「境内 / 境外 / 默认」线路返回不同解析结果）；境内线路 CNAME 到&lt;strong&gt;腾讯 EdgeOne 国际站&lt;/strong&gt;（免备案区域，大陆用户落到香港等最近节点，走腾讯跨境骨干，比 Cloudflare 免费版大陆绕行明显更快）；境外/默认线路 CNAME 到 &lt;strong&gt;Cloudflare 优选 IP&lt;/strong&gt;（经 Cloudflare for SaaS 自定义主机名识别流量，由既有 Cloudflare Tunnel 回源）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-为什么能这么搭--三个关键认知"&gt;1. 为什么能这么搭 —— 三个关键认知
&lt;/h2&gt;&lt;p&gt;整套方案成立的前提，是先把三个「概念解耦」想清楚：&lt;/p&gt;
&lt;h3 id="11-cloudflare-for-saas让流量识别与dns-解析权解耦"&gt;1.1 Cloudflare for SaaS：让「流量识别」与「DNS 解析权」解耦
&lt;/h3&gt;&lt;p&gt;Cloudflare 普通接入（Free 套餐）要求把整域 NS 迁到 Cloudflare，这与「DNS 要放在 DNSPod 做分线路」&lt;strong&gt;天然冲突&lt;/strong&gt;——NS 在谁手里，谁才说了算。&lt;/p&gt;
&lt;p&gt;Cloudflare for SaaS（免费额度 100 个自定义主机名）绕开这个限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你有一个&lt;strong&gt;承载 zone&lt;/strong&gt;（例如 &lt;code&gt;cf-zone.example.net&lt;/code&gt;，托管在 Cloudflare）；&lt;/li&gt;
&lt;li&gt;在承载 zone 里把目标域名（&lt;code&gt;box.example.com&lt;/code&gt;）加为 &lt;strong&gt;Custom Hostname&lt;/strong&gt;，并验证归属；&lt;/li&gt;
&lt;li&gt;Cloudflare 边缘从此「认识」这个域名：&lt;strong&gt;任何带着 &lt;code&gt;Host: box.example.com&lt;/code&gt; 到达 CF 边缘的请求&lt;/strong&gt;，都会被匹配证书、按配置路由（本项目为 Tunnel 回源）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键结论：&lt;strong&gt;CF 侧只负责&amp;quot;来了流量怎么认、怎么转&amp;quot;，不负责&amp;quot;流量怎么来&amp;quot;&lt;/strong&gt;。流量能不能到 CF 边缘，取决于你自己的 DNS（DNSPod）把境外用户解析到哪。所以「境外走 CF」必须在 DNSPod 配一条境外线路指向 CF 的 IP/CNAME——CF 自己不会拉客。&lt;/p&gt;
&lt;h3 id="12-dnspod-分线路免费就能同一域名不同答案"&gt;1.2 DNSPod 分线路：免费就能「同一域名，不同答案」
&lt;/h3&gt;&lt;p&gt;腾讯云解析（DNSPod）免费版就支持按查询来源返回不同记录：线路可选「中国境内 / 境外 / 默认」，境内细分到省、运营商。&lt;strong&gt;默认线路是兜底&lt;/strong&gt;，任何未命中的查询都走它。&lt;/p&gt;
&lt;p&gt;要理解一个易错点：&lt;strong&gt;分线路的判定发生在 DNSPod 的权威服务器上&lt;/strong&gt;，依据是「递归 DNS 服务器的出口 IP 归属地」——所以「境外用户走境外线路」成立的前提是境外用户的递归 DNS（8.8.8.8 等）能真的问到 DNSPod 权威，且没被中间网络劫持/污染（第 6 节有实战案例）。&lt;/p&gt;
&lt;h3 id="13-edgeone-国际站选对加速区域就不用备案"&gt;1.3 EdgeOne 国际站：选对「加速区域」就不用备案
&lt;/h3&gt;&lt;p&gt;EdgeOne 分「中国大陆可用区 / 全球可用区（不含中国大陆）/ 海外可用区」等区域配置。官方口径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选 &lt;strong&gt;全球可用区（不含中国大陆）&lt;/strong&gt; 或海外区域 → &lt;strong&gt;不要求 ICP 备案&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;选中国大陆区域 → 必须备案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不备案的代价：大陆用户&lt;strong&gt;没有本地节点&lt;/strong&gt;，请求落到最近的海外节点（大陆一般落香港，也有日韩/新加坡等），由腾讯跨境骨干回源。实测体验通常仍明显优于 Cloudflare 免费版大陆线路（后者常绕美/日且抖动大）——所以「不备案也选 EO 当境内线路」是有实测前提的，切换前建议先测速对比。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;补充：Cloudflare for SaaS 启用通常需要账户先绑定支付方式，额度内不扣费。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="2-目标架构"&gt;2. 目标架构
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DNS 层 DNSPod（example.com 整域权威，免费版支持按线路返回）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NS = byron.dnspod.net / sunshine.dnspod.net（官方 NS）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; box CNAME 记录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 境内 ──▶ box.example.com.edgeone.example （EdgeOne 接入目标）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 境外 ──▶ cf-pref.example.net （CF 优选 IP 域名）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 默认 ──▶ cf-pref.example.net （兜底，语义同境外）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────┴──────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;大陆用户 ▶▶（命中境内线路） ◀◀ 海外用户（命中境外/默认线路）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EdgeOne 国际站 Cloudflare 边缘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;区域: 全球(不含中国大陆) 优选 IP: 198.51.100.x（示例段）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;证书: TrustAsia, CN=box.example.com 识别: for SaaS 自定义主机名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回源: EO 直连源站公网端口 回源: Cloudflare Tunnel（纯出站）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────┬──────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 源站防火墙 iptables+ipset（仅放行 EO 回源网段；cloudflared 走 127.0.0.1 不受影响）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HTTP 应用直接监听公网高位端口（本项目 TamaBox，无 nginx）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两条回源路径互不干扰：EO 是 &lt;strong&gt;入站直连&lt;/strong&gt;（需开放端口 + 白名单锁定），CF 是 &lt;strong&gt;Tunnel 出站&lt;/strong&gt;（无需任何入站规则）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-前置条件清单"&gt;3. 前置条件清单
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;一个域名（&lt;code&gt;example.com&lt;/code&gt;），权威 DNS 托管在 DNSPod&lt;/td&gt;
&lt;td&gt;免费版即可；注册局委派的 NS = byron/sunshine.dnspod.net&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;一个 Cloudflare 账户 + 承载 zone（&lt;code&gt;cf-zone.example.net&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;用于 for SaaS 与 Tunnel；&lt;strong&gt;域名本身的 DNS 不用迁给 CF&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;cloudflared Tunnel 已在跑&lt;/td&gt;
&lt;td&gt;服务器 → CF 纯出站连接，绑定承载域 &lt;code&gt;box.cf-zone.example.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;服务器有公网 IP，且能开一个高位入站端口&lt;/td&gt;
&lt;td&gt;给 EO 回源用；&lt;strong&gt;不需要 nginx&lt;/strong&gt;，应用直接监听即可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;EdgeOne 账户（本例国际站 edgeone.ai）&lt;/td&gt;
&lt;td&gt;选免备案区域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;CF 账户已绑支付方式&lt;/td&gt;
&lt;td&gt;启用 for SaaS 的前提（额度内不扣费）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;服务器 1C1G 级别即可&lt;/td&gt;
&lt;td&gt;iptables/ipset 是内核规则，无常驻进程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="4-分步实施"&gt;4. 分步实施
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;建议顺序：&lt;strong&gt;先 CF（步骤 A）→ 再 EO（步骤 B）→ 再 DNS（步骤 C）→ 最后服务器（步骤 D）&lt;/strong&gt;。
前两步做完，流量仍在旧路径上，随时可暂停；步骤 C/D 才真正切换与收敛。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="step-a--cloudflare-侧saas-自定义主机名--tunnel本次零改动讲解原理"&gt;Step A —— Cloudflare 侧：SaaS 自定义主机名 + Tunnel（本次零改动，讲解原理）
&lt;/h3&gt;&lt;p&gt;本项目 &lt;code&gt;box.example.com&lt;/code&gt; 的 SaaS 自定义主机名此前已配好（放在承载 zone &lt;code&gt;cf-zone.example.net&lt;/code&gt; 下），Tunnel 已正常回源。若从零配置，动作是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;承载 zone &lt;code&gt;cf-zone.example.net&lt;/code&gt; → &lt;strong&gt;SSL/TLS → Custom hostnames&lt;/strong&gt; → Add custom hostname，填 &lt;code&gt;box.example.com&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;按提示完成归属验证（加一条 TXT 或 CNAME 验证记录）；&lt;/li&gt;
&lt;li&gt;在 Tunnel 的路由里把 &lt;code&gt;box.example.com&lt;/code&gt; 指到本地 HTTP 服务（&lt;code&gt;http://127.0.0.1:端口&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;记录页里能拿到该主机名的 &lt;strong&gt;CNAME target&lt;/strong&gt;（形如 &lt;code&gt;&amp;lt;hash&amp;gt;.cdn.cloudflare.net&lt;/code&gt;）——它是「把流量引到 CF 边缘」的官方入口。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 本项目实际没用 SaaS CNAME target，而是用&lt;strong&gt;优选 IP CNAME（&lt;code&gt;cf-pref.example.net&lt;/code&gt;）&lt;/strong&gt;：一个第三方维护的、解析到 CF 低延迟边缘 IP 的域名。原理相同——解析结果落在 CF 边缘，CF 靠 &lt;code&gt;Host: box.example.com&lt;/code&gt; 识别出这是 SaaS 自定义主机名流量再按 Tunnel 路由。&lt;strong&gt;优选域名的可用性依赖第三方维护，失效时换回官方 CNAME target 即可&lt;/strong&gt;（第 7 节维护清单）。&lt;/p&gt;
&lt;p&gt;本项目 DNSPod 上境外/默认线路指向的是 &lt;code&gt;cf-pref.example.net&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="step-b--edgeone-侧添加站点cname-接入免备案区域"&gt;Step B —— EdgeOne 侧：添加站点（CNAME 接入，免备案区域）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;EO 控制台 → 添加站点 → 填 &lt;code&gt;box.example.com&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接入方式选 CNAME 接入&lt;/strong&gt;（⚠️ 不要选 NS 接入——NS 接入会要求把域名托管给 EO，与 DNSPod 分线路冲突，和「DNS 在 CF 手里没法分线路」是同一个问题）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加速区域选「全球可用区（不含中国大陆）」&lt;/strong&gt;（免备案的关键选择）；&lt;/li&gt;
&lt;li&gt;归属验证：按 EO 提示添加验证记录（本项目用 TXT：&lt;code&gt;edgeonereclaim.example.com TXT ...&lt;/code&gt;），&lt;strong&gt;记录加在 DNSPod 的默认线路&lt;/strong&gt;（CA/验证服务器多在境外，放默认线路全球可见最稳）；&lt;/li&gt;
&lt;li&gt;配置回源：源站地址 = 你的公网 IP + 高位端口，Host 头 = &lt;code&gt;box.example.com&lt;/code&gt;；回源协议按你的源站监听协议选（应用直监听 HTTP 就选 HTTP，TLS 由 EO 边缘终结）；&lt;/li&gt;
&lt;li&gt;免费证书：CNAME 验证通过 + 回源配置就绪后，EO 自动签发（本项目 TrustAsia，&lt;code&gt;CN=box.example.com&lt;/code&gt;）。签发需要几分钟到几小时——&lt;strong&gt;在证书签发完成前，443 会拿 &lt;code&gt;*.cdn.myqcloud.com&lt;/code&gt; 兜底证书应答&lt;/strong&gt;，浏览器会出现证书/HSTS 报错（第 6 节排障 6.1），属正常过程，等签发即可；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开启「客户端 IP 头」&lt;/strong&gt;（关键，默认关闭！）：站点 → 网络优化 / 规则引擎 → 客户端 IP 头部 → 开启，&lt;strong&gt;自定义头部名必须填 &lt;code&gt;EO-Client-IP&lt;/code&gt;&lt;/strong&gt;——应用侧固定读取这个名字；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除/改写伪造的 CF 头&lt;/strong&gt;：在 EO 加一条规则引擎规则，把客户端可能携带的 &lt;code&gt;CF-Connecting-IP&lt;/code&gt; / &lt;code&gt;X-Real-IP&lt;/code&gt; 等头删掉——否则大陆攻击者经 EO 带假 CF 头，会被应用当成 CF 流量优先信任（头信任模型见 Step D）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-c--dnspod-分线路三条记录"&gt;Step C —— DNSPod 分线路：三条记录
&lt;/h3&gt;&lt;p&gt;权威 DNS 在 DNSPod（整域 zone &lt;code&gt;example.com&lt;/code&gt;），所以&lt;strong&gt;直接在整域 zone 里配，不需要任何子域委派&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;主机记录&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;线路&lt;/th&gt;
&lt;th&gt;记录值&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;box&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;中国境内&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;box.example.com.edgeone.example&lt;/code&gt;（EO 分配的目标）&lt;/td&gt;
&lt;td&gt;120~600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;box&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;境外&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cf-pref.example.net&lt;/code&gt;（CF 优选 / 或 SaaS CNAME target）&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;box&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;默认&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cf-pref.example.net&lt;/code&gt;（兜底，语义同境外）&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EO 归属验证 TXT 保持「默认」线路&lt;/strong&gt;（全球可见），别只放境内；&lt;/li&gt;
&lt;li&gt;若之前误把 EO 的 CNAME 建在「默认」线路，会导致全球都走 EO——把它改成「中国境内」，境外/默认补 CF 两条；&lt;/li&gt;
&lt;li&gt;TTL 别太大，方便回滚与换优选域时快速生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-d--服务器侧应用监听--信任头--端口锁定"&gt;Step D —— 服务器侧：应用监听 + 信任头 + 端口锁定
&lt;/h3&gt;&lt;h4 id="d1-应用直接监听公网端口免-nginx"&gt;D1 应用直接监听公网端口（免 nginx）
&lt;/h4&gt;&lt;p&gt;本项目 TamaBox 自带 HTTP 服务器，改配置即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[server]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;listen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0:18080 ; 从仅本机 127.0.0.1 改为全网卡，EO 才能远程连入（18080 仅为示例端口）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;cloudflared 连的是 &lt;code&gt;127.0.0.1:端口&lt;/code&gt;，&lt;code&gt;0.0.0.0&lt;/code&gt; 监听兼容回环连入，&lt;strong&gt;Tunnel 分支不受影响&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;nginx 在本方案中从头到尾不是必需——防火墙（iptables/ufw）是内核规则，零常驻进程，比 nginx 轻得多，适合 1C1G 小机器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="d2-应用信任两家-cdn-的权威头"&gt;D2 应用信任两家 CDN 的权威头
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;conf/app.ini&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[security]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;trust_proxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配合代码层支持（本项目 &lt;code&gt;internal/shared/ip.go&lt;/code&gt; 的 &lt;code&gt;ResolveClientIP&lt;/code&gt;），信任顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CF-Connecting-IP&lt;/code&gt;（Cloudflare 权威头，海外分支）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EO-Client-IP&lt;/code&gt;（EdgeOne 权威头，境内分支）；&lt;/li&gt;
&lt;li&gt;兜底：TCP 对端 RemoteAddr。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;头信任的安全前提（缺一不可）&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;源站防火墙&lt;strong&gt;只放行两家 CDN 的回源来源&lt;/strong&gt;（EO 直连需要；CF 分支天然安全——Tunnel 是出站，外人到不了源站）；&lt;/li&gt;
&lt;li&gt;EO 侧已删除伪造的 CF 头（Step B-8）；&lt;/li&gt;
&lt;li&gt;若还有 CF 侧直连，同样在 CF 规则里删除伪造的 EO 头。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;任一缺失，「信任头」就会被攻击者直连源站 + 自带假头绕过——限流/封禁会拿到伪造 IP。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="d3-端口白名单iptables--ipset-自动维护eo-免费档没有官方回源段"&gt;D3 端口白名单：iptables + ipset 自动维护（EO 免费档没有官方回源段）
&lt;/h4&gt;&lt;p&gt;EO 官方回源清单由「源站防护 / Origin ACL」提供（配套 &lt;code&gt;DescribeOriginACL&lt;/code&gt; API），&lt;strong&gt;但该功能只支持付费套餐&lt;/strong&gt;——免费档在控制台找不到入口，也没有可拉取的清单 URL。因此免费档采用**「种子清单 + 连接观察学习 + 定期同步」**的方案：&lt;/p&gt;
&lt;p&gt;交付脚本 &lt;code&gt;scripts/edgeone-origin-whitelist.sh&lt;/code&gt;（bash，需 root，架构要点）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;白名单放 &lt;strong&gt;ipset 集合&lt;/strong&gt; &lt;code&gt;EO_ORIGIN&lt;/code&gt;，iptables 一条规则引用它：&lt;code&gt;自建链 EO_IN&lt;/code&gt; 内「放行 127.0.0.0/8（保 cloudflared 回环）→ 命中集合放行 → 其余 REJECT tcp-reset」；&lt;/li&gt;
&lt;li&gt;更新走「临时集填充 → &lt;code&gt;ipset swap&lt;/code&gt; 原子替换」：&lt;strong&gt;同步全程无规则清空窗口&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fail-safe&lt;/strong&gt;：拉取失败 / 清单为空 / 全非法 → 拒绝更新、保留现网，绝不误删导致端口裸奔；&lt;/li&gt;
&lt;li&gt;命令：&lt;code&gt;sync&lt;/code&gt;（周期入口）/ &lt;code&gt;learn&lt;/code&gt;（从连接表收集当前实际回源源 IP，做种子）/ &lt;code&gt;show&lt;/code&gt; / &lt;code&gt;flush&lt;/code&gt;（回滚）/ &lt;code&gt;--dry-run&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;清单来源：本地文件（&lt;code&gt;/etc/edgeone-origin/cidr.txt&lt;/code&gt;）+ 可选 URL，取并集。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;落地四步：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 改端口（默认 18080 → 你的实际端口）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 安装 ipset&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install -y ipset
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 生成种子：多跑几次 learn，把输出合并审阅后写入 cidr.txt（注意：种子是 EO 的&amp;#34;出口 IP&amp;#34;，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不是应用日志里的客户端 IP！日志里是 EO-Client-IP 客户端真实 IP，不能当白名单）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash edgeone-origin-whitelist.sh learn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash edgeone-origin-whitelist.sh sync --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash edgeone-origin-whitelist.sh sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 验证：外网机器 nc -zv &amp;lt;IP&amp;gt; 18080 应 refused；https://box.example.com 应正常&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 挂定时：cron「17 4 * * *」或 systemd timer，每日一次足够（EO 段 3~6 个月才变）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;日后升级付费套餐：把 &lt;code&gt;DescribeOriginACL&lt;/code&gt; API 的输出写入 &lt;code&gt;cidr.txt&lt;/code&gt; 即可，脚本零改动。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="5-验证方法含大陆-dns-劫持陷阱"&gt;5. 验证方法（含大陆 DNS 劫持陷阱）
&lt;/h2&gt;&lt;h3 id="51-分线路是否生效-重点别在大陆本机-nslookup-境外-dns"&gt;5.1 分线路是否生效（🔴 重点：别在大陆本机 nslookup 境外 DNS）
&lt;/h3&gt;&lt;p&gt;大陆网络对发往境外公共 DNS（8.8.8.8 / 1.1.1.1 / 9.9.9.9 / OpenDNS，&lt;strong&gt;UDP 53 和 TCP 53 都会被劫持&lt;/strong&gt;）的查询会返回&lt;strong&gt;按境内线路伪造的答案&lt;/strong&gt;——在本机 &lt;code&gt;nslookup box.example.com 8.8.8.8&lt;/code&gt; 永远显示 EO，即使境外线路早已配好。正确验证通道：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 境内视角（本机直接查即可，通道可信）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup box.example.com 223.5.5.5 &lt;span class="c1"&gt;# 期望 → CNAME edgeone.example → 203.0.113.x（EO 示例段）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup box.example.com 119.29.29.29 &lt;span class="c1"&gt;# 同上（DNSPod 自家 DNS）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 境外视角：用「境外服务器代为查询」，浏览器直接打开下面两个 API 之一&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://api.hackertarget.com/dnslookup/?q=box.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://networkcalc.com/api/dns/lookup/box.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望 → CNAME cf-pref.example.net → 198.51.100.x（CF 边缘 IP 示例段）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两条结果&lt;strong&gt;不一样 = 分线路生效&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="52-https-证书是否就绪"&gt;5.2 HTTPS 证书是否就绪
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; openssl s_client -connect box.example.com:443 -servername box.example.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; openssl x509 -noout -subject -issuer -dates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 期望 subject = CN=box.example.com（而不是 *.cdn.myqcloud.com 兜底证书）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="53-真实-ip-是否被正确识别"&gt;5.3 真实 IP 是否被正确识别
&lt;/h3&gt;&lt;p&gt;境内访问后看源站/EO 访问日志中的客户端 IP = 你的大陆公网出口 IP（说明 &lt;code&gt;EO-Client-IP&lt;/code&gt; 生效）；海外访问后同理应为你的海外出口 IP（&lt;code&gt;CF-Connecting-IP&lt;/code&gt;）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6-今日排障实录每个坑都值得记"&gt;6. 今日排障实录（每个坑都值得记）
&lt;/h2&gt;&lt;h3 id="61-网站使用-hsts报错--eo-证书还没签发不是配置错"&gt;6.1 「网站使用 HSTS」报错 = EO 证书还没签发（不是配置错）
&lt;/h3&gt;&lt;p&gt;现象：DNS 切到 EO 后浏览器报 HSTS 错误页。
原因链：之前走 CF HTTPS 时应用下发了 &lt;code&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains&lt;/code&gt;（按 ExternalURL 以 https 开头就对每个响应下发）→ 浏览器记录「一年内必须 HTTPS」→ 切到 EO 后证书尚未签发、443 拿 &lt;code&gt;*.cdn.myqcloud.com&lt;/code&gt; 兜底证书 → 证书与域名不匹配 → HSTS 错误页。
处理：等 EO 证书签发（几分钟~几小时）即可，&lt;strong&gt;域名不在 HSTS preload 列表，浏览器自动恢复，无需清缓存&lt;/strong&gt;。紧急回滚 = DNS 改回 CF。
（若在 preload 列表里才是真麻烦——需先修好证书再等 preload 移除，故平时别主动提交 preload。）&lt;/p&gt;
&lt;h3 id="62-误判权威-dns-在-cloudflare方向性错误"&gt;6.2 误判「权威 DNS 在 Cloudflare」（方向性错误）
&lt;/h3&gt;&lt;p&gt;现象：一度以为 &lt;code&gt;example.com&lt;/code&gt; 权威在 Cloudflare，推导出「需要子域 NS 委派」的复杂方案，差点让用户在 CF 做一堆不存在 zone 的操作。
根因：apex &lt;code&gt;example.com&lt;/code&gt; 本身是一条 CNAME → &lt;code&gt;your-project.pages.dev&lt;/code&gt;（Cloudflare Pages 项目）——nslookup 查 NS 时&lt;strong&gt;一路跟随 CNAME 链&lt;/strong&gt;走到 pages.dev 的 NS（CF），被误读为「example.com zone 在 CF」。
正确做法：&lt;strong&gt;查域名权威必须问注册局（RDAP）或直查 SOA&lt;/strong&gt;，不能信递归 CNAME 链：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RDAP（注册局铁证）：https://rdap.org/domain/example.com → 应返回 byron/sunshine.dnspod.net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或直查 SOA：nslookup -type=SOA example.com byron.dnspod.net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="63-境外也返回-eo的假象--大陆-dns-劫持连-tcp-53-都劫"&gt;6.3 「境外也返回 EO」的假象 = 大陆 DNS 劫持（连 TCP 53 都劫）
&lt;/h3&gt;&lt;p&gt;现象：从大陆本机用 nslookup 测 8.8.8.8 / 9.9.9.9 / OpenDNS（UDP 和 TCP 都试），境外视角全部返回 EO，一度以为分线路没生效、甚至怀疑 DNSPod 配置错了。
真相：大陆网络劫持出境 DNS 查询，返回按境内线路伪造的 EO 答案，请求根本没到境外服务器。
破案手段：用&lt;strong&gt;境外服务器&lt;/strong&gt;（hackertarget / networkcalc API）代为查询，立刻看到 CF 答案——DNSPod 三线路配置完全正确，从未出过错。教训见 5.1。&lt;/p&gt;
&lt;h3 id="64-残留的阿里云验证记录"&gt;6.4 残留的阿里云验证记录
&lt;/h3&gt;&lt;p&gt;实测发现 DNSPod 上有历史残留 &lt;code&gt;_dnsauth.box.example.com CNAME → xxxxxxxx...aliyunauth.certificate-validations.com&lt;/code&gt;（以前阿里云申请证书留下的）。&lt;code&gt;_dnsauth&lt;/code&gt; / &lt;code&gt;_acme-challenge&lt;/code&gt; 下的旧验证记录会干扰证书自动续期验证——&lt;strong&gt;证书验证记录的坑&lt;/strong&gt;，建议确认证书正常后删除。&lt;/p&gt;
&lt;h3 id="65-免费档没有源站防护回源-ip-段拿不到"&gt;6.5 免费档没有「源站防护」，回源 IP 段拿不到
&lt;/h3&gt;&lt;p&gt;见 Step D3：免费档无官方清单，用 learn 观察法兜底；付费后切 &lt;code&gt;DescribeOriginACL&lt;/code&gt;，脚本零改动。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="7-日常维护清单"&gt;7. 日常维护清单
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;周期&lt;/th&gt;
&lt;th&gt;事项&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;证书到期前&lt;/td&gt;
&lt;td&gt;EO 免费证书自动续期并&lt;strong&gt;重新做域名验证&lt;/strong&gt;——⚠️ CA 验证服务器多在境外，&lt;strong&gt;所有验证记录务必放默认线路&lt;/strong&gt;；到期前留意 EO 控制台证书状态，失败会提示重新验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每日（定时任务）&lt;/td&gt;
&lt;td&gt;白名单 sync（EO 回源段 3~6 个月才变，每日一次足够）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每月&lt;/td&gt;
&lt;td&gt;抽查 &lt;code&gt;learn&lt;/code&gt; 输出是否有新回源源 IP 需补种；确认优选域名 &lt;code&gt;cf-pref.example.net&lt;/code&gt; 仍解析到 CF 边缘（失效则换回官方 SaaS CNAME target，只改 DNSPod 一条记录）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EO 回源突然失败&lt;/td&gt;
&lt;td&gt;先临时放行全段定位，再按 learn 结果收紧——EO 免费档收不到段变更通知，要有这个预案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长期&lt;/td&gt;
&lt;td&gt;若升级 EO 付费套餐：启用源站防护拿官方段 → 接入 DescribeOriginACL 输出到 cidr.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="8-回滚"&gt;8. 回滚
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;快速回滚（境外也要回 CF 之外的兜底）&lt;/strong&gt;：DNSPod 把「境内」线路改指向 CF（或删掉境内线路，让默认兜底接管）→ 全球走 CF，分钟级生效；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;彻底回滚（回到纯 CF 时代）&lt;/strong&gt;：删除 EO 站点/记录、撤防火墙放行、DNSPod 三线路合并为默认→CF；&lt;/li&gt;
&lt;li&gt;EO 证书到期前回滚，记得去 EO 控制台删除站点避免残留验证记录干扰。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="附配置快照示例2026-09-03-实测定稿域名已脱敏"&gt;附：配置快照（示例，2026-09-03 实测定稿，域名已脱敏）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;域名: box.example.com（权威 DNS: DNSPod，NS=byron/sunshine.dnspod.net）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;境内: CNAME box.example.com.edgeone.example → 203.0.113.x （EdgeOne 国际站，区域不含大陆，示例段）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;境外/默认: CNAME cf-pref.example.net → 198.51.100.x （CF 优选 IP，示例段）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CF 侧: SaaS 自定义主机名（承载 zone cf-zone.example.net）+ Tunnel 出站回源
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EO 证书: TrustAsia, CN=box.example.com（签发后约 90 天到期，自动续期）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EO 归属验证: edgeonereclaim.example.com TXT（DNSPod 默认线路 ✅）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EO 客户端头: EO-Client-IP（手动开启，头名固定 EO-Client-IP）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;源站: TamaBox 直监听 0.0.0.0:高位端口（无 nginx）；iptables+ipset 白名单
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;应用信任: trust_proxy=true；ResolveClientIP 信任 CF-Connecting-IP → EO-Client-IP → RemoteAddr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>