nginx中过滤垃圾流量需在proxy_pass前拦截:用if+return匹配恶意ua/参数,用map高效黑白名单,用limit_req限流防扫描,用geo+deny/allow控制ip访问。

在 Nginx 中,proxy_pass 本身不负责过滤请求,它只做转发。真正实现“过滤并丢弃无效垃圾流量”的工作,需在请求到达 proxy_pass 之前,通过 Nginx 的匹配、条件判断和响应控制机制完成。核心思路是:**提前拦截、拒绝响应、不进入代理环节**。
用 if + return 拦截明显异常的请求头或参数
适用于识别带恶意特征的 User-Agent、Referer、URL 参数(如含 phpmyadmin、wp-admin、/shell.php 等):
示例:拒绝已知扫描器 UA 和非法参数
if ($http_user_agent ~* "(sqlmap|nikto|wget|curl|python-requests|masscan)") {
return 403;
}
if ($args ~* "(phpmyadmin|wp-login|shell\.php|etc/passwd)") {
return 403;
}
if ($request_uri ~* "\.(php|asp|jsp|cgi|pl|exe)$") {
return 403;
}
注意:慎用 if,仅用于简单字符串匹配;避免在 if 中调用复杂变量或正则捕获,否则可能引发未定义行为。
用 map 构建高效黑白名单映射
比 if 更轻量、更推荐用于 UA、IP、Host 等字段的批量过滤:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
map $http_user_agent $bad_ua {
default 0;
"~*sqlmap" 1;
"~*nikto" 1;
"~*libwww-perl" 1;
}
<p>map $remote_addr $is_blocked {
default 0;
"192.168.1.100" 1;
"203.0.113.5" 1;
}</p><h1>在 server 或 location 中使用</h1><p>if ($bad_ua = 1) { return 403; }
if ($is_blocked = 1) { return 403; }
</p>
优点:预编译匹配逻辑,性能高;支持外部文件引入(如 include /etc/nginx/conf.d/blocked-ips.map;)。
用 limit_req 防暴力扫描和高频爬虫
对高频请求限流,超出即 503,间接“丢弃”大量自动化垃圾流量:
limit_req_zone $binary_remote_addr zone=scan:10m rate=5r/s;
limit_req zone=scan burst=10 nodelay;
<h1>可结合条件,只对特定路径限流</h1><p>location /api/ {
limit_req zone=scan burst=5;
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}
</p>
配合日志分析(如统计 403/503 日志),可动态更新黑名单,形成闭环防护。
用 geo + deny/allow 控制可信来源
限制仅允许指定 IP 段或国家地区访问敏感接口:
geo $allowed_ip {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
192.168.0.0/16 1;
}
<p>server {
location /admin/ {
if ($allowed_ip = 0) { return 403; }
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}
}
</p>
也可用 ngx_http_geoip2_module 做国家/地区级过滤(需编译支持)。










