上周我的网络遭受 DDoS 攻击这彻底淹没了我们 100 MBps 的互联网链接,并且几乎关闭了我们托管的所有网站和服务。
我理解(从这次经历以及其他答案) 我无法处理此类 DDoS 攻击,因为即使我们丢弃数据包,它们仍然会通过我们的链路发送并饱和我们的连接。
然而,当这种情况发生时,我的 ISP(奇怪的是)无法告诉我攻击来自哪里。他们说,如果我能确定来源(例如通过tcpdump
),我可以给他们 IP 地址来阻止。但是事情太过繁忙,tcpdump
无法运行。我只是无法查看输出。
我们几乎所有的服务器都位于 pfSense 路由器后面。如何使用 pfSense 检测 DDoS 攻击,以便告诉我的 ISP 应该阻止谁?我不想自己阻止攻击,我只想收到警报/能够查看使用比正常情况下多得多的带宽的 IP 地址列表。
pfSense 路由器正在运行 Snort,如果它能以任何方式提供帮助。
答案1
DDoS 有多种类型,因此有关它们的任何通用信息可能只适用于一种特定类型。例如,认为 DDoS 总是会耗尽您的带宽的想法是错误的。您需要做的是分析(部分)流量,确定它破坏您网站的原因,找到识别它的方法,然后决定采取什么措施来阻止流量。
DDoS 流量大概看起来不像是真正的流量,但其不同之处并不一定是数量。在最近一次 DDoS 攻击中,我们的托管服务提供商决定封锁连接数最高的前 10 个 IP 地址。当然,这些 IP 地址都与 DDoS 无关,其中一个实际上是 Google 机器人。如果不是他们认出了这个 IP 地址,他们本会封锁我们的办公室。使用并找到最高连接数netstat
的标准建议不一定是好建议。sort
uniq
我们的 DDoS 是一种 SYN 洪水攻击,这对于检测来说意味着以下几点:
- 这些不是完全打开的连接,因此根据您测量连接的方式,您甚至可能看不到这些。
- 没有太多可识别的信息。几乎只有源 IP 地址和源端口。
- 源地址可能(并且几乎肯定会)被欺骗,因为它们不期待响应。
- 您可能会很幸运地发现设置了不寻常的 TCP 标志。
您可能只会看到每个 IP 地址一次,因此阻止您已经看到过的 IP 地址毫无意义。实际上,我们在 10 分钟内看到了 100,000 个唯一源 IP 地址,每秒有 140,000 个数据包,这意味着(平均)每个 IP 地址每秒返回一次。在我们的案例中,阻止 IP 地址是有效的。总带宽只有 70Mb/s,由于源地址被欺骗,整个 DDoS 很容易由某个地方的单个服务器发起。
由于每个 IP 地址每秒仅发送大约一个数据包,因此这比任何其他合法 IP 地址都要低得多。我们许多网站的主页大小高达 1 MB,这意味着用户看到的单个请求有数千个数据包。
大部分源端口都是随机的,但几个小时后它就发生了变化,并且源端口始终是 1234。这使得识别流量变得非常容易。
在我们的案例中,问题每秒的数据包数量超过了防火墙的处理能力。在我们的防火墙上阻止这些 IP 地址不会起作用,因为防火墙是问题所在,但如果流量通过防火墙,而 Web 盒是问题所在,那么在防火墙上进行阻止可能会有所帮助。当源端口切换到 1234 时,我们的托管服务提供商能够阻止来自我们防火墙的上游流量。
还有其他类型的 DDoS,其中一些会占用您的带宽。我们的 DDoS 破坏了我们的防火墙,这意味着我们无法访问我们基础设施的任何部分。对于您的具体问题,您需要某种带外方式与您的防火墙和/或盒子进行通信,这样如果您的互联网管道被填满,您仍然可以进入来诊断问题。这通常是一个好主意,因为您的管道可能因许多其他原因而中断。当我走在数据中心周围时,我往往会在其他人的机架中看到很多 ADSL 调制解调器,如果其中一些用于带外通信,我不会感到惊讶。
我见过的另外两种 DDoS 类型是反射 DNS 请求和昂贵的 HTTP 请求。如果您运行 DNS 解析器,反射 DNS 请求尤其麻烦,因为您不想阻止这些 IP 地址,以防您想从其中一个地址收到真正的答案。我会将我的主机更改为使用新的 DNS 解析器(可能是免费的公共解析器)并阻止所有其他 DNS 流量。
昂贵的 HTTP 请求往往针对您的 CPU/内存/IOPS。它们还附带大量识别信息,例如 HTTP 标头,并且源地址无法伪造。mod_security 之类的工具可以做一些很棒的事情,识别和阻止这些类型的请求。它甚至可以丢弃 tcp 连接,而不是发回 HTTP 响应。
简而言之:
- 获取带外访问权限。
- 彻底了解您的协议。(TCP、IP、HTTP,无论您使用什么协议。)
- 彻底了解您的工具。(pfSense、tcpdump、mod_security 等)
- 了解您的选择。(HTTP 403、pfSense 阻止、ISP 防火墙阻止、空路由等)