Nginx限流防刷與CC攻擊防護(hù)實(shí)戰(zhàn)配置
做過(guò)Web服務(wù)的都知道,接口裸奔是找死。
不設(shè)防的后果:羊毛黨刷爆優(yōu)惠券、爬蟲(chóng)拖垮服務(wù)器、CC攻擊搞癱業(yè)務(wù)。
整理一下Nginx層面的防護(hù)方案,都是生產(chǎn)環(huán)境驗(yàn)證過(guò)的配置。
一、限流基礎(chǔ)
Nginx有兩個(gè)核心限流模塊:
ngx_http_limit_req_module:限制請(qǐng)求速率ngx_http_limit_conn_module:限制連接數(shù)
1.1 限制請(qǐng)求速率
http {
# 定義限流區(qū)域
# $binary_remote_addr:按客戶端IP限流
# zone=req_limit:10m:共享內(nèi)存區(qū)域名和大小
# rate=10r/s:每秒10個(gè)請(qǐng)求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location /api/ {
# 應(yīng)用限流
# burst=20:允許突發(fā)20個(gè)請(qǐng)求
# nodelay:突發(fā)請(qǐng)求不延遲處理
limit_req zone=req_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
參數(shù)解釋:
rate=10r/s:平均每秒10個(gè)請(qǐng)求,即每100ms一個(gè)burst=20:桶大小,允許突發(fā)20個(gè)請(qǐng)求nodelay:突發(fā)請(qǐng)求立即處理,不排隊(duì)等待
1.2 限制連接數(shù)
http {
# 按IP限制連接數(shù)
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
# 每個(gè)IP最多10個(gè)連接
limit_conn conn_limit 10;
# 限制每個(gè)連接的速度
limit_rate 1m; # 1MB/s
}
}
}
適用場(chǎng)景:下載服務(wù)、視頻流媒體。
二、分場(chǎng)景限流
2.1 登錄接口防暴力破解
http {
# 登錄接口嚴(yán)格限流
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
server {
location /api/login {
limit_req zone=login_limit burst=5 nodelay;
# 超限返回429
limit_req_status 429;
proxy_pass http://backend;
}
}
}
每秒只允許1次登錄請(qǐng)求,防止暴力破解。
2.2 短信驗(yàn)證碼防刷
http {
# 驗(yàn)證碼接口更嚴(yán)格
limit_req_zone $binary_remote_addr zone=sms_limit:10m rate=1r/m;
server {
location /api/sms/send {
# 每分鐘1次
limit_req zone=sms_limit burst=3;
proxy_pass http://backend;
}
}
}
2.3 搜索接口防爬蟲(chóng)
http {
# 搜索接口中等限流
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=5r/s;
server {
location /api/search {
limit_req zone=search_limit burst=10 nodelay;
proxy_pass http://backend;
}
}
}
三、CC攻擊防護(hù)
CC攻擊就是用大量代理IP發(fā)請(qǐng)求,單IP限流不夠用。
3.1 請(qǐng)求頻率+并發(fā)連接雙重限制
http {
limit_req_zone $binary_remote_addr zone=cc_req:10m rate=30r/s;
limit_conn_zone $binary_remote_addr zone=cc_conn:10m;
server {
# 請(qǐng)求頻率限制
limit_req zone=cc_req burst=50 nodelay;
# 并發(fā)連接限制
limit_conn cc_conn 50;
# 超限狀態(tài)碼
limit_req_status 503;
limit_conn_status 503;
}
}
3.2 基于User-Agent過(guò)濾
server {
# 封禁空UA和常見(jiàn)爬蟲(chóng)UA
if ($http_user_agent = "") {
return 403;
}
if ($http_user_agent ~* "python|curl|wget|scrapy|httpclient") {
return 403;
}
# 封禁特定UA
if ($http_user_agent ~* "MJ12bot|AhrefsBot|SemrushBot") {
return 403;
}
}
3.3 基于Referer過(guò)濾
server {
location /api/ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
}
}
3.4 cookie驗(yàn)證
server {
location / {
# 檢查是否有驗(yàn)證cookie
if ($cookie_verified != "yes") {
# 返回驗(yàn)證頁(yè)面,通過(guò)JS設(shè)置cookie后重定向
return 302 /verify.html;
}
proxy_pass http://backend;
}
}
這個(gè)方法可以過(guò)濾掉不執(zhí)行JS的簡(jiǎn)單爬蟲(chóng)。
四、IP黑白名單
4.1 黑名單
http {
# 加載黑名單文件
geo $blocked_ip {
default 0;
include /etc/nginx/blacklist.conf;
}
server {
if ($blocked_ip) {
return 403;
}
}
}
黑名單文件:
# /etc/nginx/blacklist.conf 1.2.3.4 1; 5.6.7.0/24 1;
4.2 白名單
http {
geo $whitelist {
default 0;
10.0.0.0/8 1; # 內(nèi)網(wǎng)
192.168.0.0/16 1; # 內(nèi)網(wǎng)
}
server {
location /admin/ {
if ($whitelist = 0) {
return 403;
}
proxy_pass http://backend;
}
}
}
4.3 動(dòng)態(tài)封禁
配合fail2ban實(shí)現(xiàn)自動(dòng)封禁:
# /etc/fail2ban/filter.d/nginx-cc.conf [Definition] failregex = ^<HOST> .* "(GET|POST).* HTTP.*" (429|503) ignoreregex =
# /etc/fail2ban/jail.d/nginx-cc.conf [nginx-cc] enabled = true port = http,https filter = nginx-cc logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600
60秒內(nèi)觸發(fā)100次429/503就封禁1小時(shí)。
五、實(shí)戰(zhàn)配置模板
綜合以上方案的完整配置:
http {
# 限流區(qū)域定義
limit_req_zone $binary_remote_addr zone=global_limit:20m rate=50r/s;
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# 黑名單
geo $blocked_ip {
default 0;
include /etc/nginx/blacklist.conf;
}
# 白名單
geo $whitelist {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}
server {
listen 80;
server_name example.com;
# 黑名單攔截
if ($blocked_ip) {
return 403;
}
# 空UA攔截
if ($http_user_agent = "") {
return 403;
}
# 全局限流
limit_req zone=global_limit burst=100 nodelay;
limit_conn conn_limit 100;
# API接口限流
location /api/ {
limit_req zone=api_limit burst=30 nodelay;
proxy_pass http://backend;
}
# 登錄接口嚴(yán)格限流
location /api/login {
limit_req zone=login_limit burst=5 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
# 靜態(tài)資源不限流
location /static/ {
expires 7d;
add_header Cache-Control "public, immutable";
}
# 管理后臺(tái)白名單
location /admin/ {
if ($whitelist = 0) {
return 403;
}
proxy_pass http://backend;
}
}
}
六、監(jiān)控與告警
光限流不夠,還要能看到發(fā)生了什么。
6.1 日志格式
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$limit_req_status';
access_log /var/log/nginx/access.log detailed;
6.2 實(shí)時(shí)統(tǒng)計(jì)
# 統(tǒng)計(jì)429狀態(tài)碼
tail -f /var/log/nginx/access.log | grep " 429 " | wc -l
# 按IP統(tǒng)計(jì)請(qǐng)求數(shù)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
6.3 自定義限流日志
location /api/ {
limit_req zone=api_limit burst=30 nodelay;
# 限流日志
limit_req_log_level warn;
}
被限流的請(qǐng)求會(huì)記錄到error.log:
limiting requests, excess: 30.234 by zone "api_limit"
七、壓測(cè)驗(yàn)證
配置完要驗(yàn)證效果:
# 用ab壓測(cè) ab -n 1000 -c 100 http://example.com/api/test # 用wrk壓測(cè) wrk -t4 -c200 -d30s http://example.com/api/test
觀察:
- 正常請(qǐng)求能過(guò)
- 超限請(qǐng)求返回429或503
- 服務(wù)器資源沒(méi)被打滿
八、遠(yuǎn)程管理
我們有幾個(gè)邊緣節(jié)點(diǎn)部署了Nginx做CDN,分布在不同城市。之前更新配置很麻煩,現(xiàn)在用星空組網(wǎng)把所有節(jié)點(diǎn)組到一起,SSH直連更新配置很方便。
總結(jié)
Nginx防護(hù)策略:
| 攻擊類型 | 防護(hù)方案 | 核心配置 |
|---|---|---|
| 單IP刷接口 | 請(qǐng)求速率限制 | limit_req |
| 下載帶寬濫用 | 連接數(shù)+速度限制 | limit_conn + limit_rate |
| 暴力破解 | 嚴(yán)格限流 | rate=1r/s |
| CC攻擊 | 多層防護(hù) | 限流+UA過(guò)濾+黑名單 |
| 爬蟲(chóng) | UA+Referer過(guò)濾 | if判斷 |
防護(hù)策略要分層:
- 第一層:IP黑名單
- 第二層:速率限制
- 第三層:行為判斷
- 第四層:驗(yàn)證碼(業(yè)務(wù)層)
別等被攻擊了才想起來(lái)加防護(hù)。
到此這篇關(guān)于Nginx限流防刷與CC攻擊防護(hù)實(shí)戰(zhàn)配置的文章就介紹到這了,更多相關(guān)Nginx限流防刷與CC防護(hù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx中404頁(yè)面的配置及AJAX請(qǐng)求返回404頁(yè)面的方法
404是請(qǐng)求頁(yè)面不存在的錯(cuò)誤代碼,在Nginx中有時(shí)處理jQuery中的ajax方法雖然能返回404頁(yè)面但錯(cuò)誤代碼卻返回200,針對(duì)此問(wèn)題我們具體來(lái)看一下Nginx中404頁(yè)面的配置及AJAX請(qǐng)求返回404頁(yè)面的方法2016-05-05
詳解nginx靜態(tài)資源服務(wù)器簡(jiǎn)單配置
這篇文章主要介紹了詳解nginx靜態(tài)資源服務(wù)器簡(jiǎn)單配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Nginx禁止IP訪問(wèn)只允許域名訪問(wèn)及防盜鏈設(shè)置
我們?cè)谑褂玫臅r(shí)候會(huì)遇到很多的惡意IP攻擊,這個(gè)時(shí)候就要用到Nginx 禁止IP訪問(wèn)了,本文主要介紹了Nginx禁止IP訪問(wèn)只允許域名訪問(wèn)及Nginx防盜鏈設(shè)置,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Nginx路由匹配規(guī)則及優(yōu)先級(jí)詳解
Nginx作為一個(gè)高性能的Web服務(wù)器和反向代理服務(wù)器,廣泛用于負(fù)載均衡、請(qǐng)求轉(zhuǎn)發(fā)等場(chǎng)景,在配置Nginx時(shí),路由匹配規(guī)則是非常重要的概念,本文將詳細(xì)介紹Nginx的路由匹配規(guī)則及其優(yōu)先級(jí),需要的朋友可以參考下2025-05-05
windows下nginx服務(wù)關(guān)不掉問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于windows下nginx服務(wù)關(guān)不掉問(wèn)題解決的相關(guān)資料,nginx是一種網(wǎng)絡(luò)服務(wù)器,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
nginx?location指令(匹配順序匹配沖突)實(shí)戰(zhàn)示例詳解
這篇文章主要介紹了nginx?location指令(實(shí)戰(zhàn)示例匹配順序匹配沖突)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

