网站被CC、DDoS攻击了怎么办?手把手教你用简单方法挡回去

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

网站被CC、DDoS攻击了怎么办?手把手教你用简单方法挡回去

凌晨两点,你睡得正香,手机突然开始疯狂报警。打开一看,网站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,你的网站就比之前硬气多了。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容