原文地址:https://blog.cloudflare.com/today-we-mitigated-1-1-1-1/
翻译水平有限,有不通顺的语句,请见谅。
原作者:Marek Majkowski
写于 01 Jun 2018

译者:驱蚊器喵#ΦωΦ


在2018年5月31日,我们的1.1.1.1解析器服务中断了17分钟; 这是我们自己导致的,而不是因为遭受到了攻击.

Cloudflare是受到 Gatebot DDoS 缓解程序保护的. Gatebot 每天执行数百条缓解程序, 保护我们的基础设施和客户不受到 L3/L4 和 L7 攻击. 以下是今年 Gatebot 每天执行的操作计数:

gatebot-stats
gatebot-stats

在过去, 我们曾在博客中讲到过我们的这套系统:

但是今天, 事情没有按照计划中那样发展.

Gatebot

gatebot-parts
gatebot-parts

Cloudflare的网络很庞大, 处理多种不同的网络流量,缓解多种已知和未知的攻击. The Gatebot 在三个单独的阶段处理这些复杂的事情 :

  • 攻击检测 - 收集全局的实时流量测量数据并检测攻击
  • 自动反应 - 选择合适的缓解措施
  • 缓解 - 在边缘服务器上执行缓解程序逻辑

良好的 “自动反应” 其实是整个工作流中最复杂的部分. 我们从一开始就预料到了, 这也是我们在这个阶段使用一个自定义的 功能性反应编程 (FRP) 框架的原因. 如果你想知道更多的详情, 查看 演讲介绍.

我们的缓解处理逻辑通常结合了多个不同的内部系统的输入, 来提出最佳的、最合适的缓解方案. 其中一个最重要的输入源是关于我们的ip地址分配的元数据: 我们缓解攻击HTTP和DNS IP范围的方式是不同的. 我们的 FRP 框架可以让我们用清晰易读的代码表达这一点. 比如, 这是一部分负责执行缓解DNS攻击的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
def action_gk_dns(...):

[...]

if port != 53:
return None

if whitelisted_ip.get(ip):
return None

if ip not in ANYCAST_IPS:
return None
[...]

It’s the last check in this code that we tried to improve today.

显然, 上面的代码对于缓解攻击的所有内容都过于简单化, 但是对于受到攻击的服务器是否为DNS服务器过早下结论很重要. 在今天这个检查出问题了. 如果这个ip所在的服务器是DNS 服务器,那么攻击的缓解方式和不是DNS服务器的攻击缓解方式不同.

Cloudflare 正在发展, Gatebot 也必须如此

Gatebot 是在 2015年的早些时候创建的. 三年可能听起来,不是很长的时间, 但从那时起我们就开始飞速发展,并添加了多层服务到我们的软件栈. 今天我们所依赖的很多内部集成服务,当时都不存在.

其中一个服务我们叫 Provision API. 当 Gatebot 看到一个 IP 地址, 他需要确定是否是Cloudflare的IP 地址. Provision API 是一个简单的RESTful API,用来提供这类信息.

这是一个相对较新的 API,在他的存在之前, Gatebot 必须从一个硬编码文件中读取哪些是 Cloudflare 的IP 地址. 在上面的代码片段中, ANYCAST_IPS 变量就是用这个文件填充的.

问题发生了

现在, 为了纠正一些技术欠缺, 我们部署了新的代码来引进 Gatebot 给Provision API.

我们没有考虑到, Provision API 不知道, 1.1.1.0/24 和 1.0.0.0/24 是特殊的 IP 范围. 坦率讲, 由于我们的IP 配置有点复杂,几乎每个 IP 范围都因为某些原因是 “特殊” 的. 但是我们的递归 DNS 解析器范围更加特殊: 因为他们是比较新的, 所以我们以独特的方式使用他们. 我们的硬编码Cloudflare地址列表包含了一个手动加入的例外的特殊地址.

正如你现在猜到的, 我们的集成工作中没有处理这个手工例外的地址. 请记住, 修复的全部思路是删除硬编码的地址!

造成影响

造成的影响就是, 在发布了新版的代码后, 我们的系统认为DNS解析器的流量是攻击.自动化系统为我们的DNS解析器部署了17分钟的缓解程序, UTC时间从3月31号的 17:58 到 18:13 . 这导致 1.1.1.1 DNS 解析服务器在全球无法访问.

获得的教训

Gatebot, DDoS 缓解系统, 有强大的力量, 但是我们没能彻底测试这些变化. 我们正在以今天的事故来改进我们的内部系统.

我们的团队一直为 1.1.1.1 和 Gatebot 感到非常自豪, 但是今天没有. 我们想对所有的客户道歉. 我们会汲取今天的教训,并深刻反思. 下一次我们缓解 1.1.1.1 的流量的时候, 我们会确认是否是在攻击我们.