DDoS 基本原理和简单防御
在安全领域,DDoS(分布式拒绝服务攻击)简单粗暴,是常见攻击方法。而网站型应用,由于公开的域名和 IP,并使用特定的协议(TCP),很容易被 DDoS 攻击。友好速搭上线 9 个月以来,遭受 DDoS 攻击超过 20 次,有些攻击流量规模超过 100Gbps。
用来区分 DDoS 攻击的名词很多。从使用的网络协议来看,可以区分为 TCP 类的 SYN Flood、ACK Flood,UDP 类的 DNS Query Flood、ICMP Flood 等。 从防护角度看,主要可以分为两种类型:带宽消耗型 和 资源消耗型。
带宽消耗型攻击
带宽消耗型攻击,目的是封堵系统的网络出入口,大都是基于简单网络协议,比如 UDP 或 ICMP,向指定 IP 发送大量数据包。这类攻击,只能通过增加网络带宽来防御,如果流量特别大,超过了机房网络的承受范围,那只能使用第三方的流量清洗服务,例如安全宝、腾讯大禹系统等。
这类清洗服务,主要提供两类帮助:
域名通过 CNAME 解析,隐藏应用真实 IP
域名解析的 IP 结果,是防护IP地址,攻击的流量只先到防护的机房,应用的真实 IP,只对防护服务商可见。流量清洗,筛选健康流量发回源站
服务商会通过技术手段,将攻击流量拦截,并筛选出健康流量发给应用。
资源消耗型攻击
资源消耗型攻击,主要目的是耗尽系统资源,比如 SYN Flood,会导致主机建立大量 TCP 连接,耗尽系统句柄,CC 攻击发起大量正常请求,超出业务应用的处理上限。这类攻击的流量大小,与攻击者使用的肉鸡数量有关。如果流量特别大,也需要使用上面提到的流量清洗服务。如果流量规模不大,可以通过简单的脚本,识别出攻击代理的 IP,并进行屏蔽来防御。
网站使用的 HTTP 或 SSL 协议,都是基于传输层TCP协议的应用,TCP 协议中的状态变化如下: 可以通过识别不同状态的 TCP 连接数量,来判断是否攻击 IP。
例如,SYN Flood 攻击,就是通过建立处于 SYN 状态的 TCP 连接,消耗服务器的句柄,遭受这种攻击时,服务器可以查看到,很多 TCP 连接处于syn-recv
状态。
而 CC 攻击,通常都是向网站发起大量请求,与服务器建立大量 TCP 连接,状态大都处于established,time-wait,close-wait
。
通过 Linux 系统中的ss
命令,可以查看各种状态的 TCP 连接:
ss -ntu state syn-recv state established state time-wait
通过查看 IP 的 TCP 连接状态和数量,就能判断出这个 IP 是否用于 DDoS 攻击。
基于这个思路,针对资源消耗型攻击,我们开发了一个简单的脚本工具:AntiDDoS。在服务器上部署启动后,会定时查看 TCP 连接,超过指定连接数量的 IP,会被加入iptables
屏蔽一段时间,并发邮件通知系统管理员。
遭遇 DDoS 攻击怎么办?
遭受 DDoS 攻击,要防御需要增加带宽或清洗流量的支出,并且产品的稳定性,会受到影响。 那如何让攻击者付出代价?尽可能记录详实的日志信息,包括流量记录、Web Server 的访问日志等,留下证据很关键。
如果攻击源都在国内,那报警是最佳选择。可以在公司所在地报警,也可以在服务器所在地报警。警方可以使用行政手段,找出元凶,并法办。中国警察对网络攻击的立案标准是:
- 造成 5000 元以上的损失
- 瘫痪网络超过 1 小时
- 非法控制 20 台以上的计算机
如果攻击源都在国外,那中国警察没办法。那只能通过黑客手段,追查元凶。用来发起攻击的设备,本身是被入侵,上面的漏洞,也可以被其他人利用。可以通过那些漏洞,进入攻击设备,再逐层追查凶手。这种方式,需要专业的黑客技术,也许你可以去乌云找人帮忙。