# Linux如何禁止频繁访问的IP访问Nginx ## 目录 1. [前言](#前言) 2. [常见攻击类型与防御必要性](#常见攻击类型与防御必要性) 3. [Nginx基础防护机制](#nginx基础防护机制) 4. [使用fail2ban动态封禁IP](#使用fail2ban动态封禁ip) 5. [Nginx+Lua实现高级防护](#nginxlua实现高级防护) 6. [基于iptables的防护方案](#基于iptables的防护方案) 7. [Cloudflare等CDN解决方案](#cloudflare等cdn解决方案) 8. [监控与日志分析](#监控与日志分析) 9. [总结](#总结) ## 前言 在互联网服务运营过程中,恶意流量和自动化攻击已成为常态。根据Cloudflare的2023年网络安全报告,DDoS攻击频率同比增长了28%,其中针对Web应用的暴力破解和爬虫攻击占比高达63%。本文将深入探讨在Linux环境下,如何通过多种技术手段保护Nginx服务免受频繁访问的恶意IP侵扰。 ## 常见攻击类型与防御必要性 ### 1.1 主要攻击形式 - **CC攻击**:通过高频请求耗尽服务器资源 - **暴力破解**:针对登录页面的密码尝试 - **爬虫滥用**:内容抓取导致带宽浪费 - **漏洞扫描**:自动化工具探测漏洞 ### 1.2 防御指标参考 | 攻击类型 | 正常阈值 | 危险阈值 | |----------------|----------------|----------------| | 请求频率 | <10req/s | >50req/s | | 并发连接 | <100 | >500 | | 异常User-Agent | 0.1% | >5% | ## Nginx基础防护机制 ### 2.1 速率限制模块 ```nginx http { limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { location / { limit_req zone=req_limit burst=20 nodelay; } } }
参数说明: - 10m
:共享内存空间 - 10r/s
:每秒请求限制 - burst
:突发容量缓冲
http { limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { location / { limit_conn conn_limit 5; } } }
创建/etc/nginx/blockips.conf
:
deny 192.168.1.100; deny 203.0.113.0/24;
在nginx配置中引入:
include /etc/nginx/blockips.conf;
sudo apt install fail2ban # Debian sudo yum install fail2ban # CentOS
创建/etc/fail2ban/jail.d/nginx.conf
:
[nginx-limit-req] enabled = true filter = nginx-limit-req action = iptables-multiport[name=nginx, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log findtime = 300 maxretry = 30 bantime = 86400
/etc/fail2ban/filter.d/nginx-limit-req.conf
:
[Definition] failregex = limiting requests, excess:.*client: <HOST> ignoreregex =
wget https://openresty.org/package/centos/openresty.repo sudo mv openresty.repo /etc/yum.repos.d/ sudo yum install openresty
/usr/local/openresty/nginx/conf/lua/limit.lua
:
local limiter = require "resty.limit.req" local rate = 10 -- 10 req/s local burst = 20 local delay = 0.1 local lim, err = limiter.new("limit_req_store", rate, burst) if not lim then ngx.log(ngx.ERR, "failed to instantiate limiter: ", err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay and err == "rejected" then ngx.header["Content-Type"] = "text/html" ngx.status = ngx.HTTP_TOO_MANY_REQUESTS ngx.say("Request rate exceeded") return ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS) end
#!/bin/bash LOG_FILE="/var/log/nginx/access.log" THRESHOLD=100 BAN_TIME=3600 tail -n 10000 $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -nr | while read -r line; do COUNT=$(echo $line | awk '{print $1}') IP=$(echo $line | awk '{print $2}') if [[ $COUNT -gt $THRESHOLD ]]; then if ! iptables -L INPUT -v -n | grep -q "$IP"; then iptables -A INPUT -s $IP -j DROP echo "$(date) Banned IP: $IP ($COUNT requests)" >> /var/log/iptables-ban.log fi fi done
sudo crontab -e # 每10分钟执行一次 */10 * * * * /path/to/ban_script.sh
推荐配置: 1. 挑战所有可疑User-Agent 2. 拦截已知恶意IP段 3. 启用5秒盾防护
{ "action": "block", "threshold": 100, "period": 60, "match": { "request": { "schemes": ["HTTP", "HTTPS"], "methods": ["GET", "POST"] } } }
goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --output=report.html
filter { grok { match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\]" } } if [clientip] { geoip { source => "clientip" target => "geoip" } } }
综合防护方案建议: 1. 基础层:Nginx速率限制 + iptables 2. 动态防护:fail2ban自动封禁 3. 增强层:OpenResty+Lua精细控制 4. 云端防护:CDN防火墙+Rate Limiting 5. 监控体系:实时日志分析+告警机制
最佳实践提示:建议每月审查封禁IP列表,避免误封合法用户。对于企业级应用,应考虑部署WAF解决方案如ModSecurity。
附录: - Nginx官方文档 - fail2ban GitHub仓库 - OpenResty最佳实践 “`
该文档共计约4200字,包含技术实现细节、配置示例和行业最佳实践,采用Markdown格式便于维护和版本控制。实际部署时需根据具体业务需求调整参数阈值。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。