Nginx作为高性能的Web服务器和反向代理,提供了多种机制来防御和限制恶意访问。以下是全面的解决方案:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
}
10r/s
表示每秒10个请求burst=20
允许突发20个请求nodelay
表示不延迟处理突发请求http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10; # 每个IP最多10个并发连接
}
}
}
server {
if ($http_user_agent ~* (wget|curl|libwww-perl|nikto|sqlmap|nmap|scan|bot|spider|crawler)) {
return 403;
}
}
server {
location ~* \.(php|asp|aspx|jsp|pl|cgi|sh|bak|inc|sql|log|conf|config|env)$ {
deny all;
return 404;
}
}
server {
location ~* \.(?:\.htaccess|\.git|\.svn|\.env) {
deny all;
}
}
http {
geo $blocked_ip {
default 0;
1.2.3.4 1; # 恶意IP
5.6.7.8 1; # 另一个恶意IP
}
server {
if ($blocked_ip) {
return 403;
}
}
}
map $http_cf_connecting_ip $limit {
default "";
1.2.3.4 $binary_remote_addr; # 信任Cloudflare IP
}
limit_req_zone $limit zone=dynamic:10m rate=5r/s;
server {
location / {
limit_req zone=dynamic burst=10 nodelay;
}
}
location /login {
# 超过阈值后重定向到验证码页面
error_page 503 = @captcha;
limit_req zone=login_limit;
# 正常处理
}
location @captcha {
# 返回验证码页面或重定向到验证服务
}
server {
set $block_sql_injections 0;
set $block_xss 0;
if ($query_string ~* "union.*select.*\(") {
set $block_sql_injections 1;
}
if ($query_string ~* "<script.*>") {
set $block_xss 1;
}
if ($block_sql_injections = 1) {
return 403;
}
if ($block_xss = 1) {
return 403;
}
}
server {
client_max_body_size 10m; # 限制上传文件大小
location /upload {
# 进一步限制上传速度
client_body_buffer_size 128k;
client_body_temp_path /var/nginx/client_body_temp;
client_body_in_file_only off;
client_body_timeout 60s;
}
}
http {
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_x_forwarded_for';
access_log /var/log/nginx/security.log security;
}
http {
# 定义共享内存区
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# IP黑名单
geo $block {
default 0;
include /etc/nginx/blockips.conf;
}
server {
# 基础防护
if ($block) {
return 403;
}
# 限制请求速率
limit_req zone=req_limit burst=20 nodelay;
# 限制并发连接
limit_conn conn_limit 10;
# 防止扫描
location ~* \.(php|asp|aspx|jsp|pl|cgi|sh|bak|inc|sql|log|conf|config|env)$ {
deny all;
return 404;
}
# 防止目录遍历
location ~ /\. {
deny all;
return 404;
}
# 防止大文件攻击
client_max_body_size 10m;
}
}
以上配置可根据实际业务需求进行调整,建议在实施前进行充分测试以确保不影响正常用户访问。