运营网站的人,大多遭遇过DDoS攻击,差别只是有的站点被攻击之后直接瘫痪,有的承受攻击之后几乎不受影响。防护效果好坏不靠运气,取决于前期准备工作。
首先要分清攻击目标。很多人第一想法是增大带宽就能解决,这个思路只对了一半。流量型攻击依靠海量数据包堵塞入口链路,UDP洪水、ICMP洪水就属于这类,依靠带宽硬扛。还有一类攻击消耗连接资源,SYN洪水发送大量半开连接,占满服务器连接表,正常用户连TCP握手都无法完成,就算带宽充足也无法接入。更隐蔽的是应用层攻击,CC攻击就是典型,请求特征和正常访客几乎一致,持续查询数据库、渲染页面,总流量不大,但快速耗尽服务器CPU和内存。三种攻击防护思路完全不同,用来抵御流量攻击的手段,无法应对CC攻击。

防护第一道,也是效果最好的手段,隐藏源站真实IP。很多网站遭到攻击,根源就是源站IP泄露。邮件头、历史DNS解析记录、第三方服务回调都有可能泄露IP地址。解决办法是域名解析指向高防IP或者CDN节点,所有公网流量先经过高防节点,源站只放行来自高防节点的回源流量,屏蔽其余外部IP。攻击者只能攻击高防节点,无法触达真实服务器。做好这一步,流量攻击和连接攻击基本被拦截在外。
高防节点执行流量清洗工作。节点带宽充足,部署在多个机房,攻击流量抵达之后,系统依靠数据包特征、访问速率、协议合规性区分恶意流量和正常流量,丢弃恶意数据包,合法流量转发至源站。整个过程用户基本感知不到,最多延迟小幅增加。BGP牵引是更加灵活的方案,通过路由宣告引流,在靠近攻击源的位置丢弃恶意流量,避免无效流量占用远距离带宽。Anycast原理相近,同一个IP在多个机房宣告,攻击流量被分散到各个节点,降低单点压力。
高防主要防护网络层与传输层攻击,应用层恶意请求依靠WAF防护。WAF分析HTTP请求内容,不只是统计流量大小。SQL注入、跨站脚本、恶意爬虫扫描,这类请求流量不大,但WAF能够识别请求内恶意特征并拦截。尤其CC攻击,攻击者模拟真人请求消耗后端资源,WAF依靠Cookie、Referer、访问频率等细粒度指标区分机器和真实用户。举个例子,登录接口设置每分钟最多五次请求,超出阈值触发验证码或者直接拦截。高防搭配WAF同时部署,网络层和应用层防护才算完整。
源站本身也要做加固优化。调整服务器TCP参数,开启SYN Cookie,缩短连接超时时间,限制并发连接数量。基础配置操作简单,能够有效提升抗攻击能力。Linux内核修改net.ipv4.tcp_syncookies参数为1,适当调大net.ipv4.tcp_max_syn_backlog,缩短net.ipv4.tcp_fin_timeout,修改完成执行sysctl -p生效。在Nginx配置limit_conn和limit_req模块,限制单个IP并发连接数和请求速率,可以拦截大量低水平攻击。定期检查防火墙规则,不要对外公网开放3306端口,关闭所有闲置端口。
监控与应急方案需要提前准备。建立流量基线,掌握正常状态下带宽、连接数数值,一旦指标偏离基线触发告警。应急预案写明DNS切换责任人、清洗策略调整人员、服务商对接人员。攻击发生之后按照预案执行,避免慌乱。运维值班人员要熟悉高防后台登录方式与清洗策略修改位置,不要等到出事才查阅文档。
有几个常见误区需要留意。第一,觉得小型网站不会被盯上。现实恰恰相反,中小型站点安全投入不足,防护薄弱,攻击者低成本就能打瘫站点,勒索或者同行竞争打压,经常选择这类目标下手。第二,部署CDN就等于安全。普通CDN主要做内容分发加速,抗DDoS能力有限,遭遇大流量攻击时CDN节点本身也会崩溃。第三,部署高防IP之后源站就不用做任何防护。高防只拦截外部流量,如果源站存在漏洞、端口随意开放,攻击者依旧可以绕过防护入侵。第四,配置好防护策略之后不再维护。攻击手段持续迭代,旧策略可能被绕过,WAF规则库定期更新,限速阈值依据业务流量调整,避免误拦截正常访客。
还有一处细节容易忽略,低速长连接攻击。系统没有合理设置连接超时与并发限制的情况下,攻击者依靠慢速请求持续占用连接池。这类攻击流量很小,看起来如同网络较差的用户,但破坏力很强。应对方案缩短连接超时,Nginx中将client_body_timeout和client_header_timeout设置到10秒以内,同时限制单IP最大并发连接。正常弱网用户可能偶尔被误拦截,但对比整个服务瘫痪,这样的取舍是可以接受的。
最后总结,DDoS防护不是单独购买一款产品就能彻底解决。属于分层拦截体系,高防拦截流量攻击,WAF拦截应用层攻击,源站加固兜底防护,监控告警持续监测,应急预案随时待命。每一层防护成本不算高,但只要缺少任意一层,就会留下安全缺口。攻击者寻找的就是这些没有封堵的漏洞。