同一个说法,两种截然相反的行为
当洪水攻击到来时,主机商能做的事情只有两种,而业内把这两种都叫作"DDoS 防护"。第一种是吸收:流量被引入你服务器上游的 scrubbing 层,攻击包在那里被丢弃,合法流量继续通行,你的服务全程保持可达。第二种是blackholing——也叫 null-routing,或者按 RFC 5635 的说法叫 RTBH——你的 IP 地址被从路由表中撤下,导致什么都到不了它。洪水攻击不再打到机房,连带你的用户、你的监控和你的 SSH 会话也一起打不到了。攻击者恰好得到了他们花钱想要的结果。
两种都是真实的工程手段,单独来看也都不算欺骗。blackholing 之所以存在,是因为吸收大流量洪水攻击要花真金白银——转接带宽按流量计费,scrubbing 容量需要采购和部署——一家平价主机商为了让另外四百个客户保持在线而把一个客户 null-route 掉,这是一个站得住脚的取舍。玄机在于那个隐含的主语。"DDoS 防护"这四个字在两种情况下都成立;区别在于被保护的是谁的服务。看每一张套餐页面时,都带着这个问题去读。
| 响应方式 | 攻击流量 | 你的服务 | 常见说法 |
|---|---|---|---|
| Scrubbing / 吸收 | 在上游过滤,在边缘丢弃 | 保持在线,通常没有可察觉的变化 | "始终生效的缓解"、"anycast scrubbing" |
| Blackhole / null-route | 与你的合法流量一并丢弃 | 期间离线——通常为 1–24 h | "防护上限 X Gbps"、"IP 临时封停" |
| 仅边缘限速 | 部分丢弃,且带一定随机性 | 服务质量下降——真实用户会遇到丢包 | "含基础防护" |
| 无防护(由运营商决定) | 流量一直打到机架,直到上游对该前缀执行 blackhole | 离线,机架邻居也一起离线 | "提供 DDoS 防护" |
付款之前,读懂细则条款
措辞会出卖真相。"防护上限 10 Gbps"是一个天花板,紧跟在它后面的那句话——讲流量超出上限会怎样的那句——就是 null-route 条款。"防护 IP 可作为附加项购买"意味着你默认拿到的地址没有防护。"按次收费"意味着账单会在攻击结束之后寄到。挂在缓解服务上的"合理使用"意味着每月有攻击次数配额,超出之后就得自己想办法。这些说法没有一句是假话;它们只是被特意写得让人一扫而过。
举一个点名的、有据可查的例子,因为这是公开政策而非道听途说:BuyVM 把经过 DDoS 过滤的地址作为单独的附加项出售,每个 IP 每月 $3,未过滤的地址会在攻击进行期间被 null-route。我们在BuyVM 对比页面上对此几乎不作评论地做了说明,因为只要你清楚自己买的是什么,便宜的未过滤 IP 本身是完全合理的产品。失败模式是凌晨 3 点才发现,此时正有 booter 在打你。
在收到第一张账单之前,有四个问题值得先发给售前确认清楚。缓解容量是多少,这个数字是总量,还是单个接入点可用的数字?一个终结于单一 scrubbing 中心的"2 Tbps 网络",实际上只有一条管道要填满。这份套餐是否自带缓解服务,还是要另外加购?是按次收费,还是每月有被缓解事件次数的配额?到什么阈值会触发 null-route,又会持续多久?能用具体数字回答最后一个问题的主机商,比只会用形容词作答的主机商更可信。
三个层级,以及为什么层级决定了谁能解决问题
Layer 3/4 流量型攻击。SYN flood、UDP flood,以及通过开放的 NTP、DNS、memcached、CLDAP、SSDP 服务实现的反射或放大攻击。攻击者只花一点上游带宽,换回来的是打向你的数倍流量。这是带宽和 pps 的问题,而且从根本上无法在你的服务器上解决:等你的内核能丢掉这个包时,承载它的那条管道已经满了。这里 nftables 帮不了你,只有你上游的容量才管用。
Layer 4 状态耗尽型攻击。SYN、ACK 以及连接洪水,目标不是填满管道,而是填满一张表——内核的 SYN backlog、conntrack 表、你应用的 accept 队列。带宽可以小到可以忽略:几百 Mbps 就能打垮一台没调优的服务器,而主机商那边的流量图看起来跟平常没什么两样。这一层确实有一半要靠你自己:开启 tcp_syncookies、把 nf_conntrack_max 调到合适大小、加上按来源限速,就扛得住;不做这些,就扛不住。
Layer 7 应用层攻击。由一个个单独看都合法的请求组成的 HTTP flood——真实的 TLS 握手、看似可信的 User-Agent、有时甚至是真实浏览器——瞄准你网站上开销最大的部分:搜索、登录、购物车、依赖数据库的列表页。HTTP/2 Rapid Reset 这一类攻击就说明了,当每个请求给服务器造成的开销大于给客户端造成的开销时,只需要多小的带宽就够用。scrubbing 设备看不到它没有终结的 TLS 会话内部,所以这一层只能靠边缘规则或者你自己的反向代理来处理——单靠流量容量永远解决不了。
| 层级 | 典型攻击 | 典型规模 | 必须在哪里拦截 | 能否在自己服务器上解决 |
|---|---|---|---|---|
| L3/L4 流量型 | UDP flood、DNS/NTP/memcached 放大攻击 | 5 Gbps – 1+ Tbps | 上游边缘 | 不能——管道先被填满 |
| L4 状态耗尽型 | SYN / ACK flood、conntrack 耗尽 | 0.1 – 10 Gbps | 边缘,加上内核调优 | 部分可以——syncookies、调整 conntrack 大小 |
| L7 应用层 | HTTP(S) 请求洪水、慢速 POST、Rapid Reset | 通常低于 1 Gbps | 边缘规则或自己的反向代理 | 可以——限速、挑战验证、缓存 |
老实说,真实的攻击到底有多大?
打到小型离岸服务器上的攻击,大约十次里有九次来自 booter 或 stresser——一种每月收费 $10 到 $30 的订阅服务,按分钟转卖放大攻击容量。它们通常在几分钟的突发中打出 5 到 50 Gbps,而 Minecraft 服务器、IRC 网络、Tor 中继、有前版主怀恨在心的论坛,或者竞技游戏大厅,面对的实际上就是这个量级。这个量级完全扛得住,同时也完全足以打垮一台没有防护的 $5 VPS。
再往上一档——租用僵尸网络打出的 100 到 400 Gbps——出现的前提是有人对你怀恨在心,并且有预算。这一档针对小目标很罕见,但对博彩、流媒体和成人类网站来说是家常便饭。再往上就是各大缓解服务商报告的破纪录级事件,如今动辄以多个 Tbps 和数亿 pps 计;Cloudflare Radar 上的季度数据是通常引用的公开参考。你几乎肯定不会是那种级别攻击的目标。
但你仍然可能成为这类事件的殃及对象,而这一点没有任何主机商会写在套餐页面上:连带损害是按前缀传播的。如果主机商以 /24 的粒度执行 blackhole——很多确实如此,因为这是大多数运营商接受 RTBH 的最小前缀——那么针对你子网中某一个地址的攻击,会打掉这个子网里的每一个地址。你的在线率取决于一个陌生人有多少敌人。容量余量的作用,就是让主机商永远不必走到这一步。
给出我们自己的数字,是为了提供参照,而不是炫耀:1 Tbps 的 anycast L3/L4 scrubbing 容量分布在四个接入点,每个接入点单独就能吸收约 300 Gbps,自动检测在两秒以内完成。我们为客户吸收过的最大一次事件超过 600 Gbps,打在一台游戏服务器上,玩家连接没有掉线。具体架构记录在网络页面上。
包含在套餐内、按次收费,还是配额制——商业模式很重要
出售缓解服务大致有三种方式,账单结果天差地别。包含在套餐内:成本已经计入套餐价格,发生攻击不会改变你要付的钱。按次收费:每次被缓解的事件都要收费,有时按缓解时长按小时计。配额制:每月给定次数的事件,或者一条"合理使用"条款,由主机商自行判断你是否已经用够了。
按次收费模式并不是骗局。被 scrubbing 的流量在被丢弃之前,依然要经过主机商的转接线路,而转接是按 95 百分位或者按承诺速率计费的——针对一个客户的持续攻击,确实会变成某人账单上实实在在的一行。问题不在于公不公平,而在于是否可预测:在一场持续两周的攻击中,按次收费的主机商会把打向你的攻击变成寄给你的账单,这相当于多绕了几步的第二次攻击。在真正需要知道之前,先问清楚适用哪种模式。
我们的立场明说出来,方便你核实:从 $8.50 的 Starter 到 $299.50 的 Citadel,每个套餐默认都开启防护,不需要另行开启,没有按次收费,没有月度配额,缓解服务也没有附带"合理使用"条款。最便宜的 VPS 和最大的独立服务器用的是同一套架构——参见VPS 套餐和独立服务器档位。随档位变化的是上联带宽和可选的 Layer 7 规则集,而不是你到底有没有防护。
Anycast 分流,以及为什么检测速度比宣传的容量数字更重要
单一的 scrubbing 中心有一个硬性上限:进入那一栋楼的转接带宽。它还有延迟成本,因为在缓解期间,所有人的流量都要先被拉到那栋楼里——这就是为什么有些主机商一旦遭遇攻击,欧洲用户就能明显感觉到变慢,并且要一直慢到攻击结束。
Anycast 在任何硬件介入之前,就已经改变了这道算术题。同一个前缀从每个接入点同时宣告,于是一个全球分布的僵尸网络,单凭互联网拓扑本身就会被拆分到这些接入点上:一次源头遍布全球的 600 Gbps 攻击,会变成四个地方各自约 150 Gbps,而不是一个地方独扛 600 Gbps。分流已经完成了大部分工作;scrubbing 设备只需要处理地理拓扑分完之后剩下的那部分。
检测速度是一个被低估的数字。两秒内介入的缓解,对一个 TCP 会话来说几乎无感;六十秒才介入的缓解,等它生效时用户已经刷新了两次并离开,游戏大厅也已经空了。如果一家主机商只报容量数字,不报检测延迟,一定要追问第二个数字——决定你的用户到底会不会察觉的,正是它。
如果你自带前缀,blackholing 就会变成握在你自己手里的手术刀,而不是别人对你做的事。我们的 BGP communities 涵盖按运营商降优先级(cs:100:carrier)、按地区加前缀(cs:200:region)和选择性 blackhole(cs:666:prefix),你可以只对遭受攻击的那一个地址 null-route,同时让你名下其余地址继续对外提供服务。这才是正确使用 blackholing 的方式:精准、短暂,而且由你自己决定。
离岸场景下的麻烦:在前面套一层美国代理,会让你之前的努力全部白费
各大论坛上标准的建议都是"套一层 Cloudflare 就行,免费档就够了"。对一个普通网站来说,这确实是个好建议。但如果你选择离岸主机是出于司法管辖考量,这个建议会不动声色地把你甩掉的东西全部带回来:一家在美国注册的公司现在终结你的 TLS、看得到你的明文流量,自行按其政策接收并处理滥用与版权投诉,持有一个绑定邮箱、通常还绑定支付方式的账户,并且可以被送达美国的法律程序文件。当你的 CDN 会遵从 DMCA 通知时,主机商是否无视 DMCA 通知就没什么意义了——具体机制见DMCA-ignored 说明文章,司法辖区层面的风险敞口见14-Eyes 指南。
代理也无法隐藏你的源站,除非你把源站的防火墙只对代理的前缀放行,并且长期保持这样。即便如此,地址依然会通过被动 DNS 历史记录泄露,通过证书透明度日志泄露(如果源站曾用自己的域名应答过 TLS),通过直接从服务器发出的邮件泄露,通过一条从未删除的旧 A 记录泄露,以及通过任何回显服务器自身主机名的错误页面泄露。直接打到源站是"受保护"网站照样被打下线的常见方式。匿名建站操作手册梳理了完整的泄露面。
如果你想要代理层,又不想付出司法辖区上的代价,那就自己来:在相同或兼容的司法辖区再开一台小实例,用你自己的密钥终结 TLS,源站的防火墙只放行这一个地址。缓存和请求过滤这些好处你照样保留,而且没有第三方加入信任链。两台机器都在同一套 scrubbing 架构后面,所以这个代理本身不会成为一个新的软肋。
在服务器上,哪些事仍然要靠你自己
上游的 scrubbing 保护的是管道本身,它不会帮你调内核,而状态耗尽这一档,恰恰是没调优的服务器会死在一次网络那边几乎没什么反应的攻击上的地方。按照见效顺序,一份简短清单:开启 net.ipv4.tcp_syncookies,调高 net.ipv4.tcp_max_syn_backlog(相关参数记录在内核的 ip-sysctl 参考文档中);把 nf_conntrack_max 调整到你实际预期的连接数,或者对高速率的 UDP 游戏流量使用 notrack,让这张表根本不被查询;在 nftables 里加上按来源的限速,而不是指望边缘那边能做到精准。
在应用层这一侧,nginx 里的 limit_req 和 limit_conn 不花一分钱,就能挡住大多数没有刻意伪装成人类行为的 L7 洪水攻击。能缓存的都缓存起来,因为攻击者最好的目标,永远是那个每次请求都要重新查数据库生成的页面。SSH 和任何控制面板都不要放在对外提供公开服务的那个地址上,或者至少放在白名单后面。
有一个方向经常被忽略:不要让自己变成反射源。服务器上一个开放的 DNS resolver、一个没配置好的 NTP 守护进程,或者一个暴露在外的 memcached,都会让你成为别人放大攻击的一部分,而出站滥用的处理力度远比入站严厉——我们AUP 中公布的响应时间是两小时内 null-route 并封停。入站洪水是发生在你身上的事;出站洪水是你要负责任的事。
下单之前,值得过一遍的清单
九个问题,按最快能把主机商分出高下的顺序排列。缓解容量是多少,是单个接入点的数字还是总量?这个功能是套餐价格里包含的,还是按 IP 单独出售的?是按次收费,还是每月有被缓解事件的配额?检测延迟是多少?是否提供 Layer 7 过滤,哪些档位可用?到什么阈值、持续多久会执行 null-route,发生时会不会通知你?缓解生效期间会不会改变我的路由或延迟?我默认拿到的地址是否自带防护?还有一个几乎没人问的问题——缓解运行期间,我的流量会留存什么记录?
在这个市场里,最后那个问题比在任何其他市场都更重要。scrubbing 意味着上游有东西在查看你的数据包。要问清楚事件结束后还留下什么。我们的答案,在攻击期间也不会变:检测基于边缘的聚合计数器——按前缀统计的每秒包数和比特数——而不是保留的逐流记录,我们在隐私政策中公布的"不做 netflow、不做 PCAP、不做网卡镜像"的立场,在缓解期间和平时完全一样适用。答不上这个问题的主机商,其实已经说明了问题。
如果得到的答案都很空洞,退而求其次的办法很便宜:买最小套餐用一个月,挂一个监控探针上去,直接问客服服务器被打了会发生什么。这里没有合同,也没有开通费,所以一家在文字答复里回避问题的主机商,你只要花 $8.50 就能验出来。部署一台 Starter,或者如果你的负载大到答案会影响档位选择,读一读VPS 与独立服务器如何选。