使

使用 Nginx 屏蔽恶意请求

Captain 网络 2024-11-02

爬虫横行造成服务器访问卡顿,这种情况一般 Nginx 就可以拦截。

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

屏蔽恶意请求的核心手段

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

     http {
     map $http_user_agent $block_user_agent {
         default 0;
         "~*AspiegelBot" 1;
         "~*semrush" 1;
         "~*AhrefsBot" 1;
         "~*MJ12bot" 1;
     }    
     server {
         listen 80;
         server_name laitai.top;
    
         location / {
             if ($block_user_agent) { return 444; }
         }
      }
    }
    

解释

~* 不区分大小写匹配 User-Agent。
return 444; 直接丢弃请求,不返回任何响应,防止恶意爬虫绕过。
  1. 屏蔽恶意 Referer
    防止垃圾外链、盗链、SEO 垃圾流量:

     http {
     map $http_referer $block_referrer {
         default 0;
         "~*viagra" 1;
         "~*casino" 1;
         "~*porn" 1;
     }
    
     server {
         listen 80;
         server_name laitai;
    
         location / {
             if ($block_referrer) { return 403; }
         }
       }
     }
    

解释

过滤 Referer 中包含违禁词的请求,防止垃圾外链流量。
  1. 屏蔽特定 URL 访问
    可以限制某些敏感路径,如 /admin、/phpmyadmin、/wp-admin

     http {
     map $request_uri $block_url {
         default 0;
         "~*^/admin" 1;
         "~*^/phpmyadmin" 1;
         "~*^/wp-admin" 1;
     }
    
     server {
         listen 80;
         server_name laitai.top;
    
         location / {
             if ($block_url) { return 444; }
         }
       }
     }
    

解释

^/admin 拦截所有访问 /admin 及其子路径的请求。
return 444; 直接丢弃请求,防止探测扫描。
  1. 屏蔽特定 IP
    如果你发现某些 IP 频繁访问网站、攻击服务器,可以直接屏蔽:

     http {
     map $remote_addr $block_ip {
         default 0;
         "95.102.21.29" 1;
         "103.0.98.23" 1;
     }
    
     server {
         listen 80;
         server_name laitai.top;
    
         location / {
             if ($block_ip) { return 444; }
         }
        }
     }
    

解释

可以使用 map 集中管理 IP 黑名单,比 deny 更直观。
  1. 屏蔽 Headers 伪造攻击
    有些攻击者会伪造 HTTP 头部请求,可以这样拦截:

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

解释

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

限制并发连接、速率

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

     http {
     limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    
     server {
         listen 80;
         server_name laitai.top;
    
         location / {
             limit_conn conn_limit 50;
         }
        }
      }
    

解释

limit_conn_zone $binary_remote_addr 按 IP 计算连接数。
limit_conn conn_limit 50; 单个 IP 最多 50 个并发连接。
  1. 限制请求速率
    防止 DDoS 攻击、爬虫短时间内过多请求:

     http {
     limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    
     server {
         listen 80;
         server_name laitai.top;
    
         location / {
             limit_req zone=req_limit burst=20 nodelay;
         }
        }
      }
    

解释

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

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

示例

error_page 495 =444;
error_page 496 =403;

服务器端安全防护

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

    server_tokens off;
    

作用

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

    add_header X-Frame-Options DENY;
    

作用

防止网站被嵌套到 iframe 内,防止点击劫持。
  1. 防止 XSS 攻击

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

作用

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

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

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

规则内容

[Definition]
failregex = .*"(GET|POST).*HTTP/.*" 403

添加到 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

启动 fail2ban

sudo systemctl restart fail2ban

结论

· 屏蔽 User-Agent、Referer、IP、URL,防止恶意爬虫。
· 限制并发连接、请求速率,防止 DDoS 攻击。
· 使用 return 444 直接丢弃恶意请求。
· 开启 Nginx 安全头、隐藏服务器信息,防止信息泄露。
· 同时使用 fail2ban 进行动态封禁,自动屏蔽攻击 IP。