我们遭受 DDoS 攻击,但我们水火不侵

几周以来,有人一直在尝试对我们进行 DDoS。 他们向我们的服务器发送了数亿个请求,并尝试下载我们的安装文件数百万次。 (仅在过去 5 天里,他们尝试下载的次数就超过 80 万次 - 我们的安装文件每次下载大约为 200MB。)
  • 大部分流量来自欧盟,特别是德国和英国,这里是最近 30 天内的 API 调用(不包括下载请求和 CDN 流量)。

  • 他们尝试下载安装文件数百万次(过去 5 天内 800,126 次,最近 30 天内总计约 600 万次)。
  • 在我们撰写这篇博文时,攻击仍在继续。

在这种炎热的情况下我们做什么

我们什么都不做,除了看着他们 DDoS

  • 我们尚未阻止任何攻击者 IP 地址。
  • 虽然我们使用 Cloudflare,但我们尚未激活“受到攻击”模式。
  • 我们的服务器 CPU 几乎处于闲置状态,在攻击期间大部分时间的使用率通常为 0-1%。
  • 一般来说,我们几乎什么也不做。

为什么?

  • 因为我们的服务每月能够毫无问题地处理数十亿个请求,而且成本并不高。
  • 我们拥有大约 8 个 API 服务及其数据库,每月都能处理数十亿个请求,无需缓存。
  • 我们通过 Cloudflare 获得无限带宽。

如何?

  • 我们的 TablePlus 应用程序设计很简单,这一理念延伸到我们的后端服务,我们将事情尽可能简化。
  • 我们避免使用 Vercel 或 Netlify 等第三方服务进行渲染,因为它们可能会成为瓶颈,并在攻击期间产生让您大吃一惊的账单。 相反,我们使用我们的网络服务器,它没有任何限制。
  • 过去,由于 VPS/处理器较弱,单体应用成为瓶颈。 然而,凭借当今强大的 VPS:多核处理器、高 RAM 和快速 SSD(快速 SSD/RAM 加速数据库很多),如果实施正确,整体服务可以在单个实例中每月处理数十亿个请求。

=> 因此,我们为每个应用程序构建了一个易于部署和维护的整体服务。 没有 Docker、没有 Kubernetes、没有依赖项、没有运行时环境 - 只是一个可以部署在任何新创建的 VPS 上的二进制文件。

我们来谈谈巨石

  • 每个人都倾向于使事情变得过于复杂,除非你面临压力或限制,否则这不是问题。
  • 我们“高度”复杂性,所以我们选择单体。 我们将应用程序所需的所有内容整合到一项服务中:API、网站、电子邮件、支付……一切都集中在一项服务中。
  • 部署非常简单:只需一个配置文件、构建和部署。 将服务部署或迁移到另一个云供应商时速度快如闪电。
  • 较少的依赖项使调试和识别瓶颈变得更加容易。 当出现错误时,您不需要检查太多,因为只有一个服务或其中几个服务。

您可以选择的整体框架包括:

  • Golang:Echo、Gin……
  • PHP:Laravel...
  • 红宝石:轨道...
  • Rust:Actix、Rocket、Warp……

如果做得好,Go 或 Rust 的单个 Web 框架每月可以处理数十亿个请求

  • 选择高性能框架; 我们更喜欢 Golang 和 Rust。
  • 对数据库建立索引以减少获取时间,尤其是随着数据集的增长。
  • 将主数据库(保持不变或不会随着时间的推移而增加大小)与日志/使用数据库(随着时间的推移而增长)分开,以确保您的核心业务不会受到性能问题的影响。
  • 使用反向代理来处理请求并将请求分发到您的核心 API。 如果您需要多台服务器,它将极大地帮助您。 我们使用 Nginx——它很强大。
  • 将所有内容放在 Cloudflare 后面并正确配置(启用缓存、Argo、Cloudfare 和您的服务器之间的完整 SSL...)。
  • 使用具有 DDoS 防护的 CDN。 与 Amazon CloudFront + S3 相比,我们更喜欢 Cloudflare R2 及其 CDN,以节省成本并提供保护。
  • 不要在没有 CDN 或缓存的 VPS 上放置任何大的可下载文件,因为它会很快消耗您的带宽。 我们使用的是具有无限带宽的 Cloudflare CDN。 (如果您在同一个域上启用 Cloudflare CDN,它将通过 Argo。要小心,因为 Argo 带宽不是免费的,这会花费您很多钱)。
  • 通过限制保护您的邮件程序(当用户发送需要从服务器发送电子邮件的请求时,例如忘记密码功能)

我们来谈谈部署

  • 在 TablePlus,我们尽可能简化了部署过程。 我们不使用 Docker、Kubernetes 或任何容器,也不需要设置环境。
  • 我们使用二进制文件。 二进制文件非常棒; 只需将它们复制到任何 Linux 服务器并将它们作为进程运行,就像在 macOS 上运行 TablePlus 应用程序一样!
  • 使用二进制文件时,您可以让 Linux Systemctl 处理进程(通过监视进程并在发生任何致命错误时重新启动它)。 我们原生地使用一切; 这是优化性能的最佳方法。 虚拟机、虚拟化或第三方基础设施管理器等中间层不会浪费 CPU/RAM。
  • 我们选择 Go 和 Rust,因为它们是高性能语言,并且可以生成用于部署的二进制文件。

更新

Vercel 联系了我们,他们想澄清这一点

我们现在拥有在这些情况下保护您的网站的功能。 首先是支出管理,它允许您设置软或硬支出上限,然后是攻击挑战模式,类似于 CF 的“受到攻击”模式。

=> 因此,如果您正在使用这些功能,请不要忘记打开它们。


© GVGNN 2013-2026