中小企业网站遭遇DDoS攻击,往往面临一个残酷的现实:预算有限,但攻击造成的业务中断损失巨大。高防服务器动辄几千元一个月,专业清洗设备更是天价,这条路对中小企业来说根本走不通。但好消息是,通过合理的架构设计和工具组合,完全可以用每月几百元甚至更低的成本,构建起有效的防护体系。

先搞清楚攻击的本质,才能谈性价比。DDoS攻击不是魔法,它本质上就是用大量垃圾流量占满你的带宽或者服务器资源。对于中小企业网站,绝大多数攻击流量在5Gbps到20Gbps之间,超过50Gbps的并不多见,除非你得罪了某个有实力的团伙。这意味着我们不需要对抗几百G的流量,只需要解决中小规模攻击即可。

第一层防护:利用CDN隐藏源站IP

这是性价比最高的防护手段,没有之一。原理很简单,用户访问你的网站时,先经过CDN节点,CDN帮你过滤掉恶意流量,再把正常请求转发到你的源站。攻击者打的是CDN的IP,而不是你服务器的真实IP。国内像又拍云、七牛云、阿里云CDN等,都自带基础的DDoS防护能力,免费套餐就包含一定的清洗额度。

关键操作来了,光套CDN不够,必须彻底隐藏源站IP。很多人只做了域名解析到CDN,但源站IP早就暴露了。你需要检查这些地方:域名历史解析记录是否指向过真实IP,网站是否直接使用IP访问过,邮件服务器是否泄露了源站IP,SSL证书是否通过IP查询到。建议更换一个新的源站IP,然后严格限制只有CDN的回源IP才能访问你的服务器,其他所有IP直接丢弃。这一步在服务器防火墙上就能配置,零成本。

第二层防护:Nginx反向代理与限流

如果你的服务器是Linux系统,Nginx就是你的免费防护盾。通过合理配置,Nginx能扛住相当规模的CC攻击和慢速攻击。下面直接上配置,在nginx.conf中http块里添加限流规则:

# 定义限流区域,按客户端IP限制,每秒10个请求
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;

# 限制并发连接数
limit_conn_zone $binary_remote_addr zone=perconn:10m;

server {
    listen 80;
    server_name yourdomain.com;
    
    # 应用限流
    limit_req zone=perip burst=20 nodelay;
    limit_conn perconn 10;
    
    # 限制请求体大小,防止大包攻击
    client_max_body_size 10m;
    client_body_timeout 10s;
    client_header_timeout 10s;
    
    # 过滤掉明显的恶意User-Agent
    if ($http_user_agent ~* (scrapy|curl|wget|python|java|scan|spiderbot)) {
        return 403;
    }
    
    # 限制特定URL的访问频率
    location /api/ {
        limit_req zone=perip burst=5 nodelay;
        proxy_pass http://backend;
    }
    
    location / {
        proxy_pass http://backend;
    }
}

这个配置能拦截掉大部分自动化攻击工具。burst=20表示允许突发20个请求,超过的直接返回503,不会打到后端应用。nodelay参数让限流立即生效,不给攻击者缓冲时间。并发连接限制在10个,一个IP同时只能建立10个连接,这能有效防御慢速连接耗尽攻击。

第三层防护:云服务商的基础防护能力

国内主流云服务商都为ECS或轻量应用服务器提供免费的DDoS基础防护,通常在5Gbps左右。阿里云、腾讯云、华为云都有这个能力。当攻击流量超过免费阈值时,云服务商会进行黑洞处理,也就是暂时屏蔽你的IP。这听起来很糟糕,但结合CDN使用就完全没问题,因为用户走的是CDN,源站IP被黑洞不影响正常访问。

这里有一个容易被忽视的技巧:购买云服务器时选择按量付费的弹性IP,而不是固定IP。当源站IP被攻击黑洞后,可以迅速解绑并绑定一个新的弹性IP,然后在CDN后台更新回源地址,几分钟就能恢复。这个操作成本极低,弹性IP本身免费或者几块钱一天。

第四层防护:开源WAF的妙用

很多人觉得WAF很贵,其实开源方案完全够用。ModSecurity配合Nginx就是一套强大的免费WAF系统。它能检测SQL注入、XSS、恶意扫描等应用层攻击,这些往往是DDoS攻击的前奏或者混合攻击的一部分。

安装配置也不复杂,以CentOS为例:

# 安装ModSecurity
yum install -y mod_security mod_security_crs

# 在nginx.conf中引入规则
location / {
    ModSecurityEnabled on;
    ModSecurityConfig /etc/nginx/modsecurity.conf;
    proxy_pass http://backend;
}

OWASP提供的核心规则集是免费的,涵盖了常见的Web攻击模式。开启后,大量恶意请求会在到达应用之前被拦截,减轻后端压力。需要注意的是,默认规则可能误杀一些正常请求,花一两天时间根据日志调整白名单,之后就能稳定运行。

第五层防护:利用DNS实现流量调度

如果你的网站用户主要集中在国内,可以考虑使用智能DNS解析。DNSPod、阿里云DNS的免费版都支持按运营商和地域解析。当某个线路遭受攻击时,可以快速将该线路的解析切换到高防IP或者直接暂停解析,其他线路不受影响。

更进一步的方案是自建简易的流量清洗系统。思路是这样的:准备两台服务器,一台是正常服务器,另一台是配置稍高的清洗服务器。清洗服务器上部署Nginx流控模块,专门用于接收和过滤流量。正常状态下,域名解析到清洗服务器,清洗服务器转发到源站。当攻击发生时,清洗服务器承担压力,源站躲在后面安然无恙。清洗服务器可以选择按量付费的云服务器,攻击结束后释放,成本可控。

第六层防护:应用层的代码级优化

很多中小网站的代码存在性能漏洞,一个简单的数据库查询就能拖垮整个服务器。攻击者不需要多大的流量,只要找到这些慢查询接口,反复请求就能造成服务瘫痪。检查你的代码,确保所有数据库查询都有索引,列表接口必须分页,搜索功能加上频率限制,图片和静态资源全部走CDN。

缓存是抗击DDoS的利器。在应用层使用Redis缓存热点数据,在Nginx层使用proxy_cache缓存页面,甚至可以配置fastcgi_cache直接缓存动态页面。一个被完整缓存的页面,Nginx直接返回,完全不经过PHP或后端应用,单台服务器扛住几万QPS不成问题。

组合方案:花小钱办大事

把上面的手段组合起来,一个典型的性价比方案是这样的:

首先,域名使用CDN加速并隐藏源站,CDN选择带基础防护的国内服务商,免费套餐即可。其次,源站使用云服务器,利用其免费的基础DDoS防护,同时配置Nginx限流和ModSecurity规则。再次,应用层做好缓存和代码优化,确保正常请求能快速响应。最后,准备一个弹性IP作为备用,一旦源站IP被攻击黑洞,快速切换。

这套方案的总成本:CDN免费额度通常够用,超出部分按流量计费也很便宜。云服务器选择2核4G的配置,月费百元左右。弹性IP按量付费,几乎可以忽略。如果攻击频繁,可以额外购买一个高防IP作为清洗服务器,国内有些服务商提供20Gbps防护的高防IP,月费在300到500元之间,只在攻击时启用。

对比一下,直接购买高防服务器或者专业DDoS清洗服务,月费至少两三千起步。而通过架构优化和工具组合,成本压缩到十分之一甚至更低,防护效果对于中小规模攻击完全够用。

实战中的注意事项

监控是防护的眼睛。配置好之后,一定要搭建监控告警系统。免费的Zabbix或者Prometheus配合Grafana,监控服务器的CPU、内存、网络流量、Nginx请求数等指标。当流量异常升高时,第一时间收到通知,才能快速响应。

日志分析也很关键。攻击结束后,分析Nginx日志和ModSecurity日志,找出攻击特征,更新防护规则。这个习惯能让你在下一次攻击中更从容。使用goaccess这类免费工具,可以实时分析日志并生成可视化报表。

还有一个容易被忽视的点:业务层面的降级策略。当攻击量级超出防护能力时,至少保证核心业务可用。比如电商网站,商品浏览页面可以做成静态化,即使登录和下单功能暂时不可用,用户还能看到商品信息。提前规划好哪些功能可以降级,哪些必须死保,攻击来临时就不会手忙脚乱。

最后强调一点,不要等到被攻击了才想起防护。DDoS攻击往往是突然的,可能是竞争对手恶意攻击,也可能是黑客敲诈勒索。提前把基础防护做好,攻击发生时你只需要微调策略,而不是从零开始搭建。花一个下午的时间,按照上面的步骤配置好,这可能是你为网站安全做的最划算的一笔投资。