先搞清楚:你遇到的是不是DDoS
网站突然打不开了,先别急着下结论说被DDoS了。先排查这几个可能:服务器宕机了?数据库连接数满了?带宽跑满了?域名解析出问题了?
怎么判断是不是DDoS?登录云服务商控制台看流量监控。正常情况下你的网站日均流量可能就几Mbps,突然飙到几百Mbps甚至几个Gbps,那基本就是了。新乡牧野区一个做B2B批发市场的客户,日常流量3Mbps,被攻击时峰值达到5.2Gbps,直接把云服务器的公网带宽打满。
另一个判断方法是看Nginx访问日志,如果短时间内大量不同IP请求同一个URL,而且User-Agent都很类似,那就是CC类型的DDoS攻击。如果是TCP层的大量SYN包,那就是流量型DDoS,你的应用日志里可能看不到任何异常,但服务器已经无法响应了。
应急处理:先活下来再说
遇到DDoS攻击,前5分钟最关键。云服务器一般有"黑洞"机制——当流量超过阈值时,云服务商直接把你的公网IP封掉,持续2-24小时不等。这不是坑你,是在保护你,否则整个机房都受影响。
黑洞期间你能做的有限,但有几件事必须立刻做:
第一,联系云服务商确认黑洞时长,申请提前解封。有些服务商提供"黑洞解除"服务,费用几百到几千不等。第二,如果域名DNS解析可以修改,把A记录指向CDN或高防IP。第三,通知你的客户和业务方,说网站遭遇网络攻击正在处理,预计X小时恢复。别让人觉得你人间蒸发了。
长垣一家起重机械厂在参加行业展会期间被DDoS了,官网和在线产品展示全挂了。他们第一时间切到了备用页面(静态HTML放在对象存储上),至少保证潜在客户搜索公司名能看到基本信息。这招值得学。
长期防护:分流量、扛攻击、做限流
DDoS防护要分三层来建:
第一层:CDN分流。 把网站静态资源(图片、CSS、JS)放到CDN上,攻击流量大部分会被CDN节点吸收。国内CDN服务商如阿里云CDN、腾讯云CDN,按量计费,小站点一个月几十块钱。CDN还能隐藏源站真实IP,攻击者打不到你的服务器。
第二层:高防IP。 如果你的业务经常被攻击(比如游戏、金融行业),建议直接上高防IP。高防IP本质是一个带大流量清洗能力的代理,把所有流量先引到它那里,清洗掉恶意流量再把干净流量回源给你。新乡高新区有家做线上教育的公司,被人连续DDoS了一周,每天下午两点准时来一波。买了20G高防IP后,攻击流量被清洗掉,网站正常访问。
第三层:应用层限流。 在Nginx层做请求限流,防止CC攻击耗尽服务器资源。配置示例:
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
limit_req zone=general burst=20 nodelay;
limit_conn conn 10;
}
这段配置的意思是:每个IP每秒最多10个请求,突发最多20个;同时最多10个并发连接。超过的直接返回503。
关于成本,说点实在的
DDoS防护的成本跟你的攻击量级正相关。小打小闹的CC攻击,CDN+Nginx限流基本够用,月成本不超过100块。中等强度(10G以下),高防IP月费500-2000元。超过20G的大流量攻击,高防IP按防护峰值计费,一次攻击可能就烧掉几千块。
如果攻击频繁,建议考虑直接用云服务商的高防ECS实例,把防护能力做进基础设施里。阿里云、腾讯云都有DDoS高防包,按月付费,比临时买高防IP便宜得多。
还有一种思路——打不过就躲。如果你的业务对实时性要求不高,攻击期间把网站切到静态模式(只展示基本信息,关闭搜索、登录等动态功能),等攻击过了再恢复。成本低,效果好。说白了,不是每个攻击都需要硬扛的。