要防止CC攻击,一个关键步骤是立刻关掉服务器上那些可能被攻击者利用的危险功能。比如,很多网站后台默认开启的“目录遍历”或“不安全的HTTP方法”就是典型例子。攻击者会扫描这些开放功能,然后发起海量请求打垮你的服务器。别等被攻击了才处理,现在就去检查配置。
立即关闭危险的HTTP方法,只保留GET和POST
你的Web服务器(如Nginx、Apache)可能默认允许了OPTIONS、PUT、DELETE、TRACE等HTTP方法。这些方法在普通网站中很少用到,但攻击者能用它们探测服务器信息或直接上传恶意文件。关闭它们能立刻减少攻击面。
对于Nginx,你可以在对应站点的配置文件中添加以下规则,限制只允许GET、POST和HEAD方法:
location / {
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
# 其他配置...
}对于Apache,可以在.htaccess文件或主配置中使用:
Deny from all
修改后重启Web服务生效。这能直接阻断攻击者利用非常规方法进行的探测和攻击。
禁用服务器签名和目录遍历,隐藏关键信息
服务器默认返回的响应头里常包含“Server: Nginx/1.18.0”这样的签名,这等于告诉攻击者你的服务器类型和版本,方便他们查找对应漏洞。同样,目录遍历(Directory Listing)开启时,攻击者能直接浏览目录结构,发现敏感文件。这两项都必须关掉。
在Nginx中,关闭服务器签名:
server_tokens off;
关闭目录遍历:
location / {
autoindex off;
}在Apache中,找到httpd.conf,修改:
ServerSignature Off ServerTokens Prod
同时,确保目录配置中“Options Indexes”被移除或改为“Options -Indexes”。这些改动能让你的服务器在攻击者眼中“隐身”,增加他们的攻击难度。
严格限制连接数和请求速率,这是防CC的核心
CC攻击的本质是模拟大量用户并发请求,耗尽服务器资源。因此,必须在Web服务器或防火墙层面限制单个IP的连接数和请求速率。Nginx的limit_conn和limit_req模块就是为此而生。
在Nginx配置的http块中定义共享内存区:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=rate:10m rate=10r/s;
}然后在具体server或location块中应用:
location / {
limit_conn perip 10; # 每个IP同时最多10个连接
limit_req zone=rate burst=20 nodelay; # 每秒最多10请求,允许突发20个
}这样,当单个IP疯狂请求时,超出限制的请求会被直接拒绝(返回503错误),从而保护后端服务。具体数值需根据你的网站实际流量调整。
启用Web应用防火墙(WAF)并设置CC防护规则
仅靠Web服务器配置还不够,专业的WAF能基于更复杂的规则(如URI、User-Agent、Cookie识别)拦截CC攻击。如果你使用云服务商,通常有内置WAF(如阿里云、腾讯云的WAF产品),直接开启CC防护模式即可。如果是自建服务器,可以考虑ModSecurity(用于Apache/Nginx的开源WAF)。
安装ModSecurity后,在其规则文件(如OWASP CRS规则集)中,重点启用防洪水攻击规则:
SecRule REQUEST_URI "@gt 100" "id:1000,phase:1,deny,status:403,msg:'CC攻击嫌疑'"
同时,结合IP黑名单机制,自动封禁短时间内请求异常的IP。WAF能有效识别并拦截那些伪装成正常用户的CC攻击流量。
关闭不必要的API接口和调试模式
很多网站框架(如WordPress、ThinkPHP)默认开启REST API或调试接口,这些接口可能被攻击者批量调用。例如,WordPress的/wp-json/接口如果暴露,攻击者可通过它发起大量查询请求。在生产环境中,务必关闭调试模式,并限制API访问。
在WordPress的wp-config.php中添加:
define('WP_DEBUG', false);
define('REST_API_ENABLED', false); // 或通过插件限制访问对于其他CMS或自建程序,检查是否有类似“app_debug”或“trace_enabled”的配置项,确保其设为false。同时,使用身份验证保护管理后台和API路径,例如通过Nginx设置基础认证:
location /admin/ {
auth_basic "Restricted";
auth_basic_user_file /path/to/.htpasswd;
}配置正确的缓存策略,减轻服务器压力
合理的缓存能直接减少动态请求到达后端的机会,从而削弱CC攻击的影响。对于静态资源(如图片、CSS、JS),设置较长的浏览器缓存时间;对于动态页面,可使用Nginx的fastcgi_cache或反向代理缓存。
在Nginx中配置静态资源缓存:
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}对于动态页面缓存示例:
location ~ \.php$ {
fastcgi_cache zone_name;
fastcgi_cache_valid 200 10m; # 200状态码缓存10分钟
fastcgi_cache_key "$scheme$request_method$host$request_uri";
}这样,即使遭遇CC攻击,大部分请求也会被缓存响应,避免数据库和应用程序被拖垮。
监控和告警:第一时间发现异常流量
防CC攻击不能只靠被动防御,必须建立主动监控体系。使用服务器监控工具(如Prometheus+Grafana)或云监控服务,重点观察“每秒请求数(QPS)”、“连接数”、“CPU使用率”等指标。一旦发现某个IP的QPS突然飙升或总请求量异常,立即触发告警。
一个简单的日志监控脚本示例(通过分析Nginx日志实时报警):
#!/bin/bash
tail -f /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10此脚本实时显示请求最频繁的10个IP,如果某个IP请求数远超正常值(例如每秒上百次),很可能就是CC攻击源。结合iptables或云防火墙API,可实现自动封禁。
总结:形成多层防御体系
防止CC攻击没有“银弹”,必须多层布防:
(1)关掉危险功能(HTTP方法、目录遍历);
(2)限速限连接;
(3)启用WAF;
(4)关调试接口;
(5)加缓存;
(6)做监控。每层都能过滤一部分攻击流量。最后提醒,所有配置修改后务必充分测试,确保不影响正常用户访问。安全是一个持续过程,定期审查和更新规则才能让网站长期稳定运行。
