网站突然变得异常缓慢甚至完全无法访问,服务器CPU和带宽使用率飙升,而日志里充斥着大量来自不同IP地址、针对同一页面的重复请求——这很可能就是遭遇了CC攻击。CC攻击通过模拟大量正常用户访问,消耗服务器资源,其成本低、隐蔽性强。面对这种紧急情况,等待不是办法,你需要立即在服务器或应用层面进行关键配置来缓解和防御。以下是四种可以紧急部署的防御配置策略。
一、紧急启用连接数限制与频率控制
CC攻击的本质是建立大量并发连接或高频请求。因此,最直接有效的紧急手段就是限制单个IP地址的连接数和请求频率。你可以在Web服务器软件或防火墙层面进行配置。
以Nginx为例,你可以通过其内置的limit_conn_zone和limit_req_zone模块来实现。首先,在http区块中定义限制区域。对于连接数限制,你需要定义一个共享内存区来存储IP连接状态。
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=req_perip:10m rate=10r/s;
...
}这里,zone=perip:10m创建了一个名为perip、大小为10MB的存储区,用于记录每个IP的连接数。10MB空间大约可以处理约16万个IP地址的状态。zone=req_perip:10m rate=10r/s则定义了请求频率限制,即每个IP每秒最多允许10个请求。
定义好后,在具体的server或location区块中应用这些规则。
server {
location / {
limit_conn perip 20; # 每个IP同时最多20个连接
limit_req zone=req_perip burst=20 nodelay; # 每秒10请求,突发队列20个,无延迟
...
}
}burst=20参数允许处理突发流量,超出速率的请求会被放入一个大小为20的队列中延迟处理;nodelay则意味着队列中的请求也会被立即处理,但超过“速率+突发”的请求将被直接拒绝(返回503错误)。在攻击期间,你可以临时将rate值调低(如1r/s),并减少burst值,以更严格地限制异常IP。
二、部署WAF(Web应用防火墙)的挑战检测规则
单纯的频率限制可能会误伤正常用户,尤其是来自公司网络或校园网出口的流量。此时,部署在应用层前的WAF可以通过更智能的规则识别攻击流量。紧急情况下,你可以手动或通过管理后台启用以下关键规则。
1. 启用JavaScript挑战: 这是防御CC攻击非常有效的一招。当某个IP的请求频率超过阈值时,WAF不会直接封禁,而是向其返回一段JavaScript计算挑战。真正的浏览器会执行并返回正确结果,而大多数简单的CC攻击脚本(如那些基于curl、wget或简单多线程程序的攻击)无法解析和执行JS,从而被拦截。这能在不影响真实用户的前提下,过滤掉大量自动化攻击流量。
2. 强化人机验证: 对于攻击特征非常明显的IP段,可以紧急升级验证级别,临时启用严格的验证码挑战。虽然这会增加用户操作成本,但在攻击峰值期是保护服务可用的必要权衡。
3. 自定义规则匹配攻击特征: 分析攻击日志,寻找特征。例如,攻击可能集中在某个特定URL(如登录页面/api/login)、使用非常规的User-Agent字符串、或缺少正常浏览器应有的Referer、Accept-Language等头信息。你可以在WAF中紧急创建一条规则:如果请求目标为特定敏感路径,且QPS(每秒查询率)来自单一IP超过阈值,则触发拦截或挑战动作。
三、调整服务器内核与软件参数以提升承载力
在遭受攻击时,服务器本身可能因为默认参数限制而迅速耗尽资源。调整这些系统级参数,可以提升服务器在高压下的生存能力,为实施其他防御措施争取时间。
1. 调整TCP/IP协议栈参数: CC攻击会消耗大量TCP连接。你可以临时优化以下Linux内核参数(通过sysctl.conf或sysctl -w命令):
net.ipv4.tcp_syncookies = 1:启用SYN Cookie,防止SYN Flood攻击耗尽连接。net.ipv4.tcp_max_syn_backlog:增大SYN队列长度(如2048)。net.core.somaxconn:提高监听队列的最大长度(如2048)。net.ipv4.tcp_fin_timeout和net.ipv4.tcp_tw_reuse:降低TIME_WAIT状态持续时间并允许重用,加速连接回收。
2. 调整Web服务器工作进程和连接参数: 以Nginx为例,检查nginx.conf中的以下配置:
worker_processes auto; # 设为与CPU核心数一致 worker_connections 10240; # 每个工作进程允许的最大连接数,可酌情调高 use epoll; # 使用高效的事件驱动模型(Linux下) multi_accept on; # 允许一个工作进程同时接受多个新连接
同时,确保worker_rlimit_nofile(进程可打开文件描述符数)的值大于worker_connections。修改后需重启Nginx生效。
四、启用基于源IP的自动化封禁与灰度放行
当攻击持续进行时,你需要一个能够自动识别并处置恶意IP的机制。这可以通过编写简单的脚本结合服务器防火墙(如iptables)或使用Fail2ban这类工具来实现。
1. 使用Fail2ban紧急封禁: Fail2ban可以监控日志文件,当某个IP在短时间内产生的错误请求(如404、503)或任何请求超过预定阈值时,自动调用iptables封禁该IP一段时间。紧急防御CC攻击,你可以创建一个自定义的过滤规则(/etc/fail2ban/filter.d/cc-attack.conf):
[Definition] failregex = ^<HOST> -.*"(GET|POST).*" (200|503|404).*$ ignoreregex =
然后,在监狱配置(/etc/fail2ban/jail.local)中启用它:
[cc-attack] enabled = true port = http,https filter = cc-attack logpath = /var/log/nginx/access.log # 你的访问日志路径 maxretry = 100 # 在10秒内超过100次请求则触发 findtime = 10 bantime = 3600 # 封禁1小时 action = iptables-multiport[name=CC, port="http,https"]
重启Fail2ban后,该规则将立即生效。
2. 结合CDN或高防IP进行源站隐藏与清洗: 这是最彻底但可能需要一点部署时间的紧急方案。将网站域名解析切换到提供DDoS/CC防护的内容分发网络或高防IP服务。这些服务拥有海量的带宽和分布式节点,攻击流量会在其边缘节点被识别和清洗,只有正常的流量会被回源到你的真实服务器。在控制台,通常可以紧急开启“CC防护”模式,并设置超严格的频率阈值。此举不仅能立即缓解攻击,还能隐藏你的真实服务器IP,避免后续的直接攻击。
以上四种配置策略,从应用层限制、智能挑战、系统优化到自动化封禁,构成了一个从缓到急、层层递进的紧急防御体系。在实战中,建议按照顺序快速实施:首先立即调整Nginx限制和内核参数,为服务器“减压”;同时启用WAF的JS挑战,过滤低端攻击脚本;并行配置Fail2ban,自动化处理持续攻击的IP;最后,如果攻击规模巨大且持续,果断启用高防服务进行流量清洗。记住,在实施任何可能影响正常访问的严格限制后,需要密切监控访问日志和业务指标,并根据情况动态调整规则,在安全与可用性之间找到最佳平衡点。
