如何使用 Nginx 屏蔽恶意请求并防御基础攻击

最近一个图床服务总是打开特别慢,查看了下后台日志,发现在被频繁的攻击,而且获取到了我的管理员账号,一直在尝试登录管理员账号。

但是因为请求主要以 Bot 为主,就判断对方为正常的爬虫吧,这种情况一般 Nginx 就可以拦截。

在 Nginx 配置中,我们可以使用 map 规则、limit_conn 并发限制、limit_req 速率限制、IP 黑名单、User-Agent 屏蔽、Referer 过滤、防火墙规则 等方法来有效防止 恶意爬虫、DDoS 攻击、暴力扫描、垃圾流量 等问题。

1. 屏蔽恶意请求的核心手段

1.1. 屏蔽恶意 User-Agent

爬虫、自动化工具经常使用特定的 User-Agent,可以通过 map 规则屏蔽:

http {
    map $http_user_agent $block_user_agent {
        default 0;
        "~*semrush" 1;
        "~*AhrefsBot" 1;
        "~*MJ12bot" 1;
    }

    server {
        listen 80;
        server_name shejibiji.com;

        location / {
            if ($block_user_agent) { return 444; }
        }
    }
}

📌 解释

  • ~* 不区分大小写匹配 User-Agent。
  • return 444; 直接丢弃请求,不返回任何响应,防止恶意爬虫绕过。

1.2. 屏蔽恶意 Referer

防止垃圾外链、盗链、SEO 垃圾流量:

http {
    map $http_referer $block_referrer {
        default 0;
        "~*viagra" 1;
        "~*casino" 1;
        "~*porn" 1;
    }

    server {
        listen 80;
        server_name she ji bi ji;

        location / {
            if ($block_referrer) { return 403; }
        }
    }
}

📌 解释

  • 过滤 Referer 中包含违禁词的请求,防止垃圾外链流量。

1.3. 屏蔽特定 URL 访问

可以限制某些敏感路径,如 /admin/phpmyadmin/shejibiji

http {
    map $request_uri $block_url {
        default 0;
        "~*^/admin" 1;
        "~*^/phpmyadmin" 1;
        "~*^/shejibiji" 1;
    }

    server {
        listen 80;
        server_name shejibiji.com;

        location / {
            if ($block_url) { return 444; }
        }
    }
}

📌 解释

  • ^/admin 拦截所有访问 /admin 及其子路径的请求
  • return 444; 直接丢弃请求,防止探测扫描。

1.4. 屏蔽特定 IP

如果你发现某些 IP 频繁访问网站、攻击服务器,可以直接屏蔽:

http {
    map $remote_addr $block_ip {
        default 0;
        "192.168.1.100" 1;
        "203.0.113.50" 1;
    }

    server {
        listen 80;
        server_name shejibiji.com;

        location / {
            if ($block_ip) { return 444; }
        }
    }
}

📌 解释

  • 可以使用 map 集中管理 IP 黑名单,比 deny 更直观。

1.5. 屏蔽 Headers 伪造攻击

有些攻击者会伪造 HTTP 头部请求,我们可以拦截:

if ($http_content_type ~* "(?:multipart/mixed|application/x-shellscript)") {
    return 403;
}

📌 解释

  • 阻止伪造 Content-Type 的恶意请求(如 shell 上传)。

2. 限制并发连接 & 速率

2.1. 限制 IP 并发连接

限制 单个 IP 允许的最大连接数,防止占用服务器资源:

http {
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        listen 80;
        server_name shejibiji.com;

        location / {
            limit_conn conn_limit 50;
        }
    }
}

📌 解释

  • limit_conn_zone $binary_remote_addr 按 IP 计算连接数
  • limit_conn conn_limit 50; 单个 IP 最多 50 个并发连接

2.2. 限制请求速率

防止 DDoS 攻击、爬虫短时间内过多请求:

http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

    server {
        listen 80;
        server_name shejibiji.com;

        location / {
            limit_req zone=req_limit burst=20 nodelay;
        }
    }
}

📌 解释

  • rate=10r/s → 每个 IP 每秒最多 10 个请求
  • burst=20 → 允许突发 20 个请求(超出会被拒绝)。
  • nodelay → 立即丢弃超限请求,而不是排队执行

3. 使用 Nginx 特殊状态码

状态码 作用 用途
444 直接丢弃请求,不返回任何响应 屏蔽爬虫、攻击者
495 SSL 证书错误 阻止无效 SSL 证书
496 需要 SSL 证书 只允许可信客户端访问
497 HTTP 访问 HTTPS 端口 自动跳转到 HTTPS
499 客户端提前关闭连接 日志记录

📌 示例

error_page 495 =444;
error_page 496 =403;

4. 服务器端安全防护

4.1. 隐藏服务器信息

默认情况下,Nginx 会在 Server 头部暴露服务器信息:

server_tokens off;

📌 作用

  • 隐藏 Nginx 版本号,防止黑客利用已知漏洞攻击。

4.2. 防止 clickjacking

add_header X-Frame-Options DENY;

📌 作用

  • 防止网站被嵌套到 iframe 内,防止点击劫持。

4.3. 防止 XSS 攻击

add_header X-XSS-Protection "1; mode=block";

📌 作用

  • 启用浏览器 XSS 过滤,防止跨站脚本攻击

5. 结合 Fail2Ban 动态封禁

如果某些 IP 频繁攻击服务器,我们可以用 fail2ban 进行动态封禁:

  1. 创建过滤规则
    sudo nano /etc/fail2ban/filter.d/nginx-badbot.conf
    

    规则内容

    [Definition]
    failregex = .*"(GET|POST).*HTTP/.*" 403
    
  2. 添加到 jail.local
    sudo nano /etc/fail2ban/jail.local
    

    配置

    [nginx-badbot]
    enabled = true
    filter = nginx-badbot
    logpath = /var/log/nginx/access.log
    maxretry = 5
    findtime = 60
    bantime = 3600
    
  3. 启动 fail2ban
    sudo systemctl restart fail2ban
    

🎯 结论

✅ 屏蔽 User-Agent、Referer、IP、URL,防止恶意爬虫。

✅ 限制并发连接、请求速率,防止 DDoS 攻击。

✅ 使用 return 444 直接丢弃恶意请求

✅ 开启 Nginx 安全头、隐藏服务器信息,防止信息泄露

✅ 结合 fail2ban 进行动态封禁,自动屏蔽攻击 IP

🚀 通过这些方法,可以大幅提升 Nginx 服务器的安全性和稳定性

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

除特别注明外,本站所有文章均基于CC-BY-NC-SA 4.0原创,转载请注明出处。
文章名称:《如何使用 Nginx 屏蔽恶意请求并防御基础攻击》
文章链接:https://www.xlin.cn/xlbk/20409.html
分享到: 更多 (0)

热门文章

评论 抢沙发

切换注册

登录

忘记密码 ?

切换登录

注册