linux如何禁止频繁访问的ip访问nginx

发布时间:2022-01-21 09:50:54 作者:小新
来源:亿速云 阅读:625
# 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:突发容量缓冲

2.2 连接数限制

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

    server {
        location / {
            limit_conn conn_limit 5;
        }
    }
}

2.3 黑名单配置

创建/etc/nginx/blockips.conf

deny 192.168.1.100;
deny 203.0.113.0/24;

在nginx配置中引入:

include /etc/nginx/blockips.conf;

使用fail2ban动态封禁IP

3.1 安装与配置

sudo apt install fail2ban  # Debian
sudo yum install fail2ban  # CentOS

3.2 Nginx专属规则

创建/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

3.3 自定义过滤器

/etc/fail2ban/filter.d/nginx-limit-req.conf

[Definition]
failregex = limiting requests, excess:.*client: <HOST>
ignoreregex =

Nginx+Lua实现高级防护

4.1 OpenResty安装

wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
sudo yum install openresty

4.2 Lua限流脚本

/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

基于iptables的防护方案

5.1 自动封禁脚本

#!/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

5.2 定时任务

sudo crontab -e
# 每10分钟执行一次
*/10 * * * * /path/to/ban_script.sh

Cloudflare等CDN解决方案

6.1 防火墙规则配置

推荐配置: 1. 挑战所有可疑User-Agent 2. 拦截已知恶意IP段 3. 启用5秒盾防护

6.2 Rate Limiting配置

{
  "action": "block",
  "threshold": 100,
  "period": 60,
  "match": {
    "request": {
      "schemes": ["HTTP", "HTTPS"],
      "methods": ["GET", "POST"]
    }
  }
}

监控与日志分析

7.1 GoAccess实时分析

goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --output=report.html

7.2 ELK Stack配置建议

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格式便于维护和版本控制。实际部署时需根据具体业务需求调整参数阈值。

推荐阅读:
  1. Nginx 禁止IP访问 只允许域名访问
  2. tomcat限制用域名访问 禁止 ip访问

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux ip nginx

上一篇:Linux怎么自动检测服务器停机时间

下一篇:plsql可不可以连接mysql

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》