开篇:你是不是也遇到过网站突然“炸了”?

凌晨两点,你睡得正香,手机突然开始疯狂报警。打开一看,网站CPU飙到100%,带宽爆满,日志里全是同一个IP地址在反复请求同一个页面。或者更夸张,整个服务器都连不上,就像被堵在早高峰地铁站门口一样。
这就是CC攻击和DDoS攻击的经典场景。别慌,今天咱们就用最接地气的方式,聊聊怎么用手里现有的工具,花最少的钱,把这些烦人的攻击挡在门外。
先搞明白敌人长什么样
CC攻击:就像有人在你家门口反复敲门
CC(Challenge Collapsar)攻击说白了,就是用大量看起来正常的HTTP请求,把你服务器累趴下。攻击者不搞什么洪水猛兽,就模拟正常用户,不停地访问你的登录接口、搜索页面,或者不停地下载大图片。服务器一看,哟,有人来访问,得干活啊!于是CPU飙高,数据库忙到冒烟,最后正常用户也进不来了。
特点:请求很“合法”,伪装得好,传统防火墙不好识别。
DDoS攻击:直接把路给你堵死
DDoS(分布式拒绝服务)更狠,它调集成千上万的“肉鸡”(被控制的电脑),一起往你服务器上灌流量。网络层DDoS(比如SYN Flood)就是狂发连接请求,把你的连接池撑爆;应用层DDoS其实就是CC攻击。
特点:流量巨大,直接把带宽占满,服务器连响应都发不出去。
怎么发现被攻击了?
你不用整天盯着监控,但至少要留意这几个信号:
- 平时访问量500,突然飙到5000,还都是陌生IP。
- 执行
top一看,CPU 100%,而且都是Web进程在吃。 - 用
netstat -an | grep ESTABLISHED | wc -l查看连接数,正常几百,现在几千甚至几万。 - Nginx访问日志里,同一IP每分钟请求几十上百次,甚至几秒一次。
一旦发现,咱们就开始动手。
简单实用的防护四件套
咱们今天就用四招,把攻击挡在外面。这些招数不需要买什么硬件防火墙,也不用花钱买高级WAF,就用你服务器上本来就有的工具。
第一招:Nginx限流——最温柔的“劝退”
Nginx本身就有限流功能,配置简单,效果立竿见影。它就像给每个IP发了一个“通行证”,来太快了就让它等一下。
1. 限制请求频率(limit_req)
打开nginx.conf,在http块里加上这段:
http {
<em># 定义一个限流区域,基于IP地址,每秒最多10个请求</em>
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
listen 80;
server_name example.com;
location / {
<em># 应用限流,允许突发20个请求,超出的直接返回503</em>
limit_req zone=mylimit burst=20 nodelay;
limit_req_status 503;
proxy_pass http://你的后端;
}
<em># 对登录、注册这些敏感接口,更严格一点</em>
location /api/login {
limit_req zone=mylimit burst=5 nodelay;
limit_req_status 429;
proxy_pass http://你的后端;
}
}
}
2. 限制单个IP的连接数(limit_conn)
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
<em># 每个IP最多同时保持20个连接</em>
limit_conn addr 20;
proxy_pass http://你的后端;
}
}
}
配置完记得 nginx -s reload,立马生效。效果:攻击者再快也快不过限流器,服务器压力瞬间下来。
第二招:iptables——直接拉黑“惯犯”
如果某个IP明显不正常,比如每秒发几百个请求,咱们可以直接用防火墙把它封了。iptables是Linux自带的,不用额外装东西。
1. 限制单个IP最大连接数
<em># 对80端口,每个IP最多50个连接,超过就DROP</em>
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
2. 限制SYN包速率(防SYN Flood)
<em># 每秒最多允许10个SYN包,超过就扔</em>
iptables -A INPUT -p tcp --syn -m limit --limit 10/second --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
3. 手动添加黑名单
当你从日志里发现某个IP一直捣乱,直接封:
iptables -A INPUT -s 123.45.67.89 -j DROP
4. 保存规则,重启不丢失
iptables-save > /etc/iptables/rules.v4
这样,恶意IP就再也进不来了。
第三招:应用层限流——用PHP代码自己控制
有时候Nginx和iptables挡不住所有,比如攻击者用大量IP,每个IP只发少量请求,但总量很大。这时候可以在应用代码里加一层限流,比如基于Redis的计数器。
下面是一个简单的PHP限流器,你可以把它放到每个API入口:
<?php
<em>// rate_limiter.php</em>
class RateLimiter {
private $redis;
private $maxRequests;
private $timeWindow;
public function __construct($redis, $maxRequests = 30, $timeWindow = 10) {
$this->redis = $redis;
$this->maxRequests = $maxRequests;
$this->timeWindow = $timeWindow;
}
public function check($key) {
$now = time();
$windowStart = $now - $this->timeWindow;
<em>// 删除旧记录</em>
$this->redis->zRemRangeByScore($key, 0, $windowStart);
<em>// 当前窗口内请求数</em>
$count = $this->redis->zCard($key);
if ($count >= $this->maxRequests) {
return false; <em>// 超限</em>
}
<em>// 记录本次请求</em>
$this->redis->zAdd($key, $now, uniqid());
$this->redis->expire($key, $this->timeWindow);
return true;
}
}
<em>// 使用示例</em>
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$limiter = new RateLimiter($redis, 30, 10); <em>// 每10秒最多30次</em>
$clientIp = $_SERVER['REMOTE_ADDR'];
$key = "rate_limit:{$clientIp}";
if (!$limiter->check($key)) {
http_response_code(429);
echo json_encode(['error' => '请求太频繁,请稍后再试']);
exit;
}
<em>// 正常业务...</em>
这个方案特别适合登录、注册、短信验证码等容易被CC的接口。
第四招:Fail2ban——自动化的“巡逻兵”
手动封IP太累,Fail2ban可以帮你自动干这活。它会监控日志文件,发现某个IP反复触发错误(比如404、401或者短时间内请求太多),就自动调用iptables把它封掉。
1. 安装Fail2ban
apt-get install fail2ban <em># Ubuntu/Debian</em>
yum install fail2ban <em># CentOS</em>
2. 创建过滤器
新建文件 /etc/fail2ban/filter.d/nginx-cc.conf:
[Definition]
failregex = ^<HOST> .* "GET /.* HTTP/.*" 404 .*$
^<HOST> .* "POST /api/login HTTP/.*" 401 .*$
^<HOST> .* "GET /search\?.* HTTP/.*" 200 .*$
ignoreregex =
3. 配置监狱(jail)
编辑 /etc/fail2ban/jail.local:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
logpath = /var/log/nginx/access.log
maxretry = 60
findtime = 60
bantime = 3600
action = iptables-multiport[name=nginx-cc, port="http,https", protocol=tcp]
4. 重启Fail2ban
systemctl restart fail2ban
从此,哪个IP敢疯狂刷你日志,它就会自动被关小黑屋1小时。
进阶:万一流量太大怎么办?
上面这些方法能扛住中小规模攻击。但如果对方用上了成百上千台机器,流量大到把你带宽都打满,那就需要动用“外援”了。
方案一:上CDN/云WAF
像Cloudflare、阿里云WAF、腾讯云安全这些,在边缘节点就把流量清洗干净了。你只需要把DNS解析改到它们那里,配置一下回源,攻击流量就被挡在门外了,真正到你服务器的只有正常请求。
免费套餐就够很多小站用了,性价比超高。
方案二:弹性扩容 + 负载均衡
如果用的是云服务器,可以设置弹性伸缩:当CPU或带宽超过阈值,自动加机器分担压力。把静态资源扔到对象存储+CDN,动态请求走负载均衡集群,这样单台服务器扛不住时,多台一起扛。
总结:别怕,有招!
攻击就像感冒,谁都有可能遇到,但咱们有药就不慌。总结一下今天的核心思路:
- 日常防护:Nginx限流 + iptables基础规则 + Fail2ban,这三板斧配置好了,能挡住大部分中小规模攻击。
- 监控预警:时刻关注服务器负载、连接数、带宽,设置报警,第一时间发现异常。
- 快速响应:发现攻击后,可以临时拉黑恶意IP,调低限流阈值,或者直接切到云WAF。
- 进阶准备:云WAF、CDN、弹性伸缩这些,提前了解好,万一需要可以快速切换。
安全是个持久战,但咱们用简单的方法,也能把防线筑得挺结实。希望你永远用不上这些招,但一旦遇到,也知道该怎么干。
最后,动手试试吧!配置一下Nginx限流,装个Fail2ban,你的网站就比之前硬气多了。










暂无评论内容