# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。