Nginx提供了limit_req_zone
和limit_req
指令来实现请求速率限制:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location /api/ {
limit_req zone=one burst=20 nodelay;
proxy_pass http://backend;
}
}
}
limit_req_zone
定义限制区域:
$binary_remote_addr
:基于客户端IP限制zone=one:10m
:创建名为"one"的共享内存区,10MB大小rate=10r/s
:限制每秒10个请求limit_req
应用限制:
burst=20
:允许突发20个请求nodelay
:不延迟处理突发请求http {
limit_req_zone $binary_remote_addr zone=strict:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=normal:10m rate=10r/s;
server {
location /login {
limit_req zone=strict burst=5 nodelay;
}
location /api/ {
limit_req zone=normal burst=20;
}
}
}
geo $limit {
default 1;
192.168.0.0/24 0;
10.0.0.0/8 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=api:10m rate=5r/s;
location / {
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
}
# 阻止SQL注入
location ~* "(\<|%3C).*script.*(\>|%3E)" {
return 403;
}
# 阻止目录遍历
location ~* (\.\./|\.\.\\) {
return 403;
}
# 阻止敏感文件访问
location ~* \.(htaccess|htpasswd|ini|log|sh|sql)$ {
return 403;
}
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 5;
}
}
}
http {
lua_shared_dict ip_blacklist 10m;
server {
location / {
access_by_lua_block {
local blacklist = ngx.shared.ip_blacklist
local client_ip = ngx.var.remote_addr
if blacklist:get(client_ip) then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
}
location /admin/blacklist {
content_by_lua_block {
-- 这里可以实现添加/移除IP的API
}
}
}
}
Fail2Ban可以分析Nginx日志并自动添加IP到黑名单:
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=nginx-req-limit, port="http,https"]
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 600
bantime = 3600
对于可疑请求返回验证挑战:
location / {
if ($http_user_agent ~* (wget|curl|httrack|nikto|sqlmap)) {
return 444;
}
if ($http_referer ~* (babes|click|diamond|forsale|girl|jewelry|love|nudit|organic|poker|porn|poweroversoftware|sex|teen|video|webcam|zippo)) {
return 444;
}
}
map $http_user_agent $bad_ua {
default 0;
~*(libwww-perl|python-requests|Go-http-client|Java|curl|Wget) 1;
}
server {
if ($bad_ua) {
set $block_ua 1;
}
if ($block_ua = 1) {
return 403;
}
}
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Rate: $limit_req_status Conn: $limit_conn_status';
access_log /var/log/nginx/security.log security;
使用Nginx Plus或第三方工具如Prometheus+Grafana监控: - 请求速率 - 被限制的请求数 - 黑名单IP数量 - 异常请求模式
通过合理配置这些策略,可以显著提高Web应用的安全性,同时确保正常用户的访问体验。