您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。