"要不要在前面挂一个 CDN?"是大多数人买下离岸服务器之后问的第一个问题,而它没有单一的答案,因为这其实是披着一件外套的两个问题。扛住攻击和保持不被找到,是两个有着不同解法的不同问题,解决其中一个的安排,往往会悄悄地毁掉另一个。
这种混淆两个方向都很昂贵。有人把一个庞大的美国 CDN 挂在自己特意选择忽略 DMCA 的主机服务来存放的内容前面,结果把投诉窗口又交还给了自己本想避开的那类中间方。也有人干脆什么都不做,被网络层过滤从设计上就看不到的应用层洪水打垮,然后断定 DDoS 防护是骗人的。本指南把这两个问题分开来谈,说明每一层真正能做到什么,并把大部分篇幅留给决定结果的那部分:即便其他一切都配置正确,源站地址依然会泄露的六种方式。
看似一个问题的两个问题
你放在服务器前面的任何东西,做的都是两件事之一:挡住攻击,或者不让它的地址被人知道。这两件事重叠得足以让人混淆,又区别得足以让你在解决错了那个问题时白花钱。
| 你担心的是什么 | 真正能解决它的是什么 | 解决不了它的是什么 |
|---|---|---|
| 填满你带宽管道的流量型洪水(三层和四层) | 主机侧的网络边缘过滤,这里的每个套餐都自带 | 你在服务器上安装的任何东西——等它生效时,管道早就满了 |
| 看起来像真实请求的应用层洪水(七层) | CDN 或 WAF、缓存、限速、更便宜的接口 | 包过滤——它只会看到合法的 HTTP 并放行 |
| 不应该有人能直接连到这台机器 | 一个前端(CDN 或你自己的节点)加上一道只放行它的防火墙 | 只有 CDN,而源站仍然回应整个互联网 |
| 不应该有人知道是谁在运营它 | 无需 KYC 的注册、支付隐私、账户纪律 | 再多的基础设施也无济于事——这是一个身份问题 |
| 内容必须扛得住投诉 | 司法辖区,以及一个不会对投诉采取行动的主机商 | CDN——它增加的是一条投诉渠道,而不是移除一条 |
最后一行值得读两遍,因为它正是让人栽跟头的地方。这个页面上其他的一切都是工程问题,唯独这一行不是。

你的主机商已经做了什么,又止步于何处
三层和四层过滤是我们所有套餐都自带的,不额外收费,而且运行在网络边缘,而不是你的服务器上——这也是它唯一能生效的地方,因为一条已经被打满的上行链路,不是运行在它后面的任何东西能修好的。带宽不限量计费,所以一次攻击不会变成一张账单。对大多数人口中的"DDoS"来说,这就是全部故事。
它看不到的是另一种攻击。四万个住宅地址,每秒对一个搜索接口发起五百次请求,这不是畸形流量,这就是流量。Slowloris 连接每隔几秒才慢悠悠发一个请求头,单独看每一个都很"礼貌"。用真实的 POST 请求体狂轰一个登录表单,在数据包这一层和一个繁忙的周一没有任何区别。没有任何包过滤能帮上忙,因为这些数据包本身没有任何问题。
有一个方向的流量,我们确实会采取行动,这一点值得说清楚:源自我们网络的攻击和大规模垃圾邮件,可能会被空路由掉,以维持基础设施其他部分的健康运行。这是一项运维层面的措施,而不是内容层面的——我们的忽略 DMCA 主机指南更详细地讲了这个区别。
CDN 能隐藏什么,以及你因此继承来的投诉窗口
这套机制很简单,而且确实有效。你的域名解析到服务商的地址,客户端连接到那里,再由服务商回源到你的源站抓取内容。真实地址从不出现在客户端的连接里,所以只知道域名的人无法攻击到它。同样的手法也是 CDN 前置能用于抗审查代理的原因:审查方看到的是一个它承受不起封锁代价的地址。
随之而来的还有三件事,没有一件是藏在小字条款里的:
- 边缘节点会终止你的 TLS。按设计,流量在服务商网络内部是明文的——缓存和过滤正是靠这一点才能工作。你的用户输入的任何内容,都会先到达一个第三方,然后才到达你。
- 一条原本不存在的投诉渠道。投诉可以直接针对 CDN 提出,而 CDN 会回应这些投诉:转发给你、指认出你的主机商,或者终止对你的服务。如果你选择离岸的理由就是让投诉无处可去,那么在前面放一个美国中间方,就重新接上了你花钱打断的那条链条。
- 一个账户。邮箱地址、支付方式,往往还有电话号码,与你的域名绑定,并被无限期保留。下文会详细说这一点,因为它通常是整套安排里最薄弱的一环。
这些都不代表 CDN 是错误的选择。它只是一个有两面的决定:对于有真实用户、真实七层压力的商店或应用来说,CDN 非常出色;而对于会招来下架通知的发布行为来说,它反而适得其反。我们在忽略 DMCA 的主机页面上对这个问题一贯的回答,就是这句话的简版:要扛下架,用你已经有的网络过滤,跳过 CDN。
源站地址依然会泄露的六种方式
这一节才是真正重要的部分,因为隐藏不是一件你能买到的产品——它是一种你要么维持、要么失去的属性,而失去它通常只需要几天,原因就在下面六件事之中。每天都有源站在配置完全正确的 CDN 背后被找了出来。
- 证书透明度日志。为你的域名签发的每一张公开信任证书,都会在几分钟内被发布到公开、永久、可搜索的日志里。它们发布的不是你的地址,而是你的主机名——
staging、mail、vpn,还有你 2024 年随手建过一次的那个子域名。每一个都是一个待解析的候选项,只要其中一条记录没有指向前端,这场游戏就结束了。 - DNS 历史记录。被动 DNS 服务会存档你的域名曾经解析过的每一个地址。事后再搬到 CDN 后面,并不会让已经记录下来的内容撤销发布——隐藏必须在域名第一次解析之前就开始,否则你需要的是一个新地址,而不是一个新前端。
- 无法被代理的记录,以及你忘掉的那些记录。邮件交换记录必须指向一个可达的地方。只代理了 IPv4 时遗留下来的
AAAA记录也是如此,还有旧的 FTP 或面板主机名、一个泛域名,或者那个已经存在三年、名义上还叫"临时"的开发主机。 - 服务器发出的任何东西。源站发出的邮件会在
Received邮件头里带上它的地址——一封密码重置邮件就是一次自助式的信息泄露。Webhook、出站的图片抓取、链接预览、pingback、更新检查和崩溃报告,全都会从真实地址主动发出连接,任何能让你的应用连接到自己控制的主机的人,都能借此获知这个地址。 - 全网扫描。每一个 IPv4 地址都在被公开服务持续扫描和索引,结果几秒钟内就能查到。如果你的源站在 443 端口用你的证书应答,或者对任意 Host 头都返回你的首页,那么靠内容哈希、证书指纹或 favicon 哈希做一次匹配查询就够了。多数源站正是这样被找到的,而且查找者不需要付出任何成本。
- 应用自己泄的底。包含原始地址的绝对 URL 和重定向、被遗漏开放的状态或指标接口、点名内部主机的详细堆栈跟踪、暴露后端信息的响应头,以及那个只要有人按地址访问就乐呵呵地把你的网站奉上的默认虚拟主机。
锁死源站,只让前端能连到它
一种全靠没人猜中地址才能维持的隐藏,根本不是隐藏。只有当源站拒绝回应除前端之外的任何人时,这套安排才真正站得住脚——这样,一个泄露出去的地址顶多是个麻烦,而不会酿成事故。
- 先默认拒绝,再放行前端。80 和 443 端口只接受服务商公布的地址段,并且自动刷新这份名单——这些地址段会变,一份过期的名单要么在最要命的时刻误放行,要么误拦截。其他所有东西,包括 SSH,都应该放在隧道或管理地址上,就像我们的首小时加固清单里说的那样。
- 对前端做身份验证。CDN 和你源站之间的客户端证书——通常叫做经过身份验证的源站拉取——意味着即便有正确的地址加正确的 Host 头,没有证书也什么都拿不到。
- 更好的做法:完全不开放任何入站端口。从源站到边缘的纯出站隧道,不管是 CDN 自带的连接器,还是连到你自己运行的节点的 WireGuard,都能让源站永远不监听任何公网接口。扫描找不到一个不会应答的东西,这是这套安排里最强的一个版本。
- 一个虚拟主机,一个 Host 头。默认服务器应该什么有用的东西都不返回。如果你的网站靠地址就能加载出来,一周之内就会被扫描器匹配上。
- 把邮件从网站源站上挪走。邮件必须可达,而且必须表明自己的身份;把它放在单独的一台机器上,正如邮件服务器指南所假设的那样。
- 从外部验证。这份清单里的每一项检查,在服务器自己身上跑都毫无意义。要从一个不属于你的网络去测试。
用自己的前置节点代替 CDN
第三种选择常常被忽略,因为它没有营销预算:一台小型 VPS 作为对外的门面,一条加密隧道通向存放数据的那台机器,中间由 nginx 或 HAProxy 负责转发流量。从外面看,它和任何一台网站服务器没有区别。真正的那台在别处,完全不开放任何入站端口。
你得到的是不涉及任何第三方的隐藏——没有第三方账户,没有外部投诉窗口,没有陌生人替你终止 TLS。你还能得到一种原本很难买到的司法辖区拆分:前端放在用户所在的地方,数据放在对你有利的法律辖区,可以从我们的七个节点位置中选择。而且因为注册时没有绑定任何身份,前端是可以随意丢弃的——一个被烧掉的地址几分钟就能换掉,而不需要和谁谈判。
你得不到的是 anycast 那种容量。一个节点只有一个节点的容量,虽然我们的网络过滤会像保护其他任何服务器一样保护它,但一场真正大规模的流量型攻击,拼的是带宽,而这场比拼是全球网络才能赢的。诚实的定位是:前置节点是隐藏一个笨重或昂贵后端——存储阵列、GPU 主机、邮件服务器、数据库——以及拆分司法辖区的正确答案。它不能替代持续七层压力下的 CDN。
一张表说清楚怎么选
| 你的情况 | 安排 | 理由 |
|---|---|---|
| 会招来下架通知的发布行为 | 直连,不用 CDN,在特意选定的司法辖区 | CDN 会增加一个投诉窗口,而你的主机商刻意不设这个窗口 |
| 有真实用户和七层压力的商店或 SaaS | 前面挂 CDN,源站只对其地址段放行 | 七层正是 CDN 真正为之设计的问题 |
| 身处审查国家的翻墙接入点 | CDN 前置 | 审查方看到的是一个它承受不起封锁代价的地址 |
| 大量静态或媒体流量 | 用 CDN 分流缓存 | 重点是带宽和延迟;隐藏只是附带效果 |
| 匿名是首要需求 | 自己的前置节点,或者前面什么都不放 | 第三方账户是一份你原本不会留下的身份记录 |
| 值得隐藏的笨重后端 | 前置节点加纯出站隧道 | 这台昂贵的机器永远不会出现在公网上 |
账户通常才是最薄弱的一环
想一想,当基础设施做到完美、而手续没做到位时会发生什么。服务器用门罗币支付,没有身份证件,没有邮箱地址——这正是我们无 KYC 主机页面描述的那种安排。然后,有人用一张信用卡、一个私人地址和一个电话号码开了一个 CDN 账户,并在里面登记了它所保护的那个域名。这个账户比服务器上的任何东西都是更有力、更持久的身份记录,掌握在一家会配合传票的公司手里,它把支付隐私彻底毁掉了。
解决办法并不复杂,只是很容易被忘记:如果目标是匿名,那么前端要么归你自己所有,要么它前面的那个账户,要做到和它身后的服务器一样用完即弃、无法追溯身份。服务器 OpSec一文详细讲了这套纪律,我们对离岸主机匿名性的坦率回答也直言不讳地说明了这条链条里通常最先断裂的是哪一环。几乎从来都不是技术层面的那一环。
用十分钟自查你自己的暴露面
下面每一项,都是一个感兴趣的人在最初几分钟内就会去查的东西。在你需要这些答案之前,先自己动手,从一台不是这台服务器的机器上跑一遍。
- 列出你签发过的每一个主机名。在证书透明度搜索引擎里搜索你的顶级域名,把每一个结果都解析一遍。任何没有指向前端的结果都是一处泄露,包括你已经不再使用的主机。
- 读一读自己的 DNS 历史。一次被动 DNS 查询会显示你的域名在接入 CDN 之前解析到过的地址。如果昨天的源站还是今天的源站,那这份隐藏就从来没有真正生效过。
- 直接问一问源站。
curl -sI --resolve example.com:443:198.51.100.10 https://example.com/——如果网站应答了,说明你的防火墙没有限制只让前端连接,任何有候选地址的人,一次请求就能确认这一点。 - 粗暴地问一问它。
curl -skI https://198.51.100.10/应该什么可辨认的内容都不返回。用默认虚拟主机把你的首页奉送出去,是这个页面里最常见的单一错误。 - 检查每一种记录类型,不只是 A 记录。
dig +short AAAA example.com、dig +short MX example.com,以及透明度日志暴露出的每一个子域名的同样查询。没被代理的 IPv6 是个经典失误。 - 从应用给自己发一封邮件。触发一次密码重置,读一读完整的
Received链条。如果源站地址出现在里面,那么它也出现在你发送过的每一封邮件里。 - 确认端口已经关闭。从一个无关的网络,
nmap -Pn -p80,443 198.51.100.10应该显示为过滤状态,而不是开放。 - 去扫描索引里搜一搜。在一个公开的全网扫描索引里查一查你的证书指纹和首页的 favicon 哈希。如果你的源站已经被收录,这就是它会被找到的方式。
当地址已经被烧掉之后
要假设它会一直被烧着。一个已经出现在被动 DNS 和扫描索引里的地址,就成了永久性的公开记录,任何配置改动都撤不回来。应对方式是机械化的,而不是靠什么聪明的技巧。
- 先堵住泄露点。不先堵上漏洞就换一个新地址,几天之内就会重现同样的局面,你等于白折腾了一次迁移,什么都没学到。
- 然后再轮换。部署一台替代机器——如果原因是法律层面而不是技术层面,就换一个不同的司法辖区——恢复数据,再完成切换。因为第一台服务器从未绑定过任何身份,这是一次重新开始,而不是一场谈判,这正是购买没有账户历史的服务器所带来的实际的、不那么光鲜的好处。
- 在紧急情况发生之前就准备好切换方案。短 DNS TTL、能从代码仓库重新部署的配置,以及一次经过测试的恢复流程,能把一个糟糕的下午变成二十分钟。没有人会在攻击进行中才来安排这些。
- 妥善地退役旧地址。不要把旧服务器留在旧地址上、继续提供同样的内容;那等于给任何在盯着的人一次现场确认,还会让这条记录一直保持新鲜。