Nginx作为高性能的HTTP反向代理和网关服务器,是Web服务的第一道防线。通过针对性的配置优化,仅需3个核心步骤就能封堵SQL注入、XSS跨站、CSRF跨站请求伪造、文件包含、恶意爬虫等90%的常见Web漏洞,同时兼顾性能与安全性。本文将从环境准备到实战配置,手把手教你搭建安全的Nginx网关。
yum install nginx(CentOS)或apt install nginx(Ubuntu)快速安装。/etc/nginx/目录)。Nginx安全网关的核心是**“过滤恶意请求+限制非法访问+加固服务本身”**,通过内置模块(如ngx_http_core_module、ngx_http_rewrite_module)和少量第三方模块(可选)实现,无需复杂开发。
Web漏洞的根源大多是恶意请求参数(如SQL注入的union select、XSS的<script>)或非法请求方法(如PUT/DELETE)。通过Nginx的if指令、正则匹配和请求方法限制,直接在网关层拦截此类请求。
仅允许业务必需的GET、POST、HEAD方法,拒绝PUT、DELETE、OPTIONS等高危方法(若业务不需要),防止通过非常规方法发起攻击。
修改Nginx主配置文件/etc/nginx/nginx.conf或站点配置文件(如/etc/nginx/conf.d/your_site.conf),在server块中添加:
# 限制HTTP请求方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 403; # 拒绝非法方法,返回403 Forbidden
}
通过正则匹配,拦截包含SQL注入、XSS、文件包含等恶意特征的请求URI或参数,直接返回403。
在server块中添加恶意参数过滤规则:
# 定义恶意特征匹配变量
set $block_sql_injection 0;
set $block_xss 0;
set $block_file_include 0;
# 匹配SQL注入特征(可根据业务扩展)
if ($request_uri ~* "(union|select|insert|update|delete|drop|truncate|or|and|exec|xp_cmdshell)") {
set $block_sql_injection 1;
}
if ($args ~* "(union|select|insert|update|delete|drop|truncate|or|and|exec|xp_cmdshell)") {
set $block_sql_injection 1;
}
# 匹配XSS跨站脚本特征
if ($request_uri ~* "<script>|<iframe>|<img src=|onclick=|onload=|javascript:") {
set $block_xss 1;
}
if ($args ~* "<script>|<iframe>|<img src=|onclick=|onload=|javascript:") {
set $block_xss 1;
}
# 匹配文件包含/路径遍历特征
if ($request_uri ~* "\.\./|\.\./|/etc/passwd|/proc/self/environ") {
set $block_file_include 1;
}
# 触发拦截:任意恶意特征匹配成功则返回403
if ($block_sql_injection = 1 || $block_xss = 1 || $block_file_include = 1) {
return 403;
}
拦截恶意爬虫、扫描器的异常User-Agent(如sqlmap、nmap、BurpSuite),防止自动化攻击。
在server块中添加:
# 拦截恶意User-Agent
if ($http_user_agent ~* (sqlmap|nmap|burp|scanner|crawler|spider|bot|curl/7\.47\.0) ) {
return 403;
}
# 拦截空User-Agent(可选,部分正常请求也可能为空,需根据业务调整)
if ($http_user_agent = "") {
return 403;
}
重启Nginx(systemctl restart nginx)后,尝试访问包含恶意参数的URL(如http://your_domain/?id=1 union select 1,2,3),应返回403 Forbidden。
通过IP白名单/黑名单、请求频率限制,防止暴力破解、DDoS攻击、CSRF等漏洞利用,同时限制敏感接口的访问范围。
假设管理后台路径为/admin,仅允许内网192.168.1.0/24和公网IP1.2.3.4访问:
# 敏感路径IP白名单
location /admin {
# 允许的IP
allow 192.168.1.0/24;
allow 1.2.3.4;
# 拒绝其他所有IP
deny all;
# 反向代理后端服务(若有)
proxy_pass http://backend_admin;
}
创建IP黑名单文件/etc/nginx/blacklist_ip.conf,添加恶意IP:
deny 10.0.0.1;
deny 20.0.0.0/24;
在nginx.conf的http块中引入该文件,全局拦截:
http {
include /etc/nginx/blacklist_ip.conf;
# 其他配置...
}
使用Nginx的ngx_http_limit_req_module模块限制单IP的请求频率,防止暴力破解登录接口、批量请求等攻击。
在nginx.conf的http块中添加:
# 定义请求频率限制的共享内存区(key为IP,大小10M,可存储约16万IP)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 解释:rate=10r/s 表示单IP每秒最多10个请求,可根据业务调整(如5r/s、20r/m)
在server块或location块中添加:
# 对登录接口限制频率
location /api/login {
# 应用频率限制,burst=20表示允许20个突发请求(超出则排队),nodelay表示不排队直接拒绝
limit_req zone=req_limit burst=20 nodelay;
proxy_pass http://backend_api;
}
# 全局频率限制(可选,对整个站点生效)
location / {
limit_req zone=req_limit burst=50 nodelay;
proxy_pass http://backend;
}
Nginx层可通过验证Referer/Origin请求头,防止跨站请求伪造(CSRF),要求请求必须来自本站。
在server块中添加:
# 验证Referer,仅允许本站请求(适用于POST接口)
location /api/ {
if ($request_method = POST) {
if ($http_referer !~* (your_domain.com|your_subdomain.com) ) {
return 403;
}
}
proxy_pass http://backend_api;
}
注意:部分合法请求(如移动端APP)可能无
Referer,需结合后端Token验证。
通过关闭Nginx版本暴露、配置安全响应头、限制文件上传等,减少攻击面,防止攻击者利用服务本身的漏洞或敏感信息进行攻击。
攻击者常通过Server响应头获取Nginx版本,进而利用对应版本的漏洞。修改nginx.conf的http块:
http {
# 关闭版本号显示
server_tokens off;
# 其他配置...
}
通过add_header添加安全头,防御XSS、点击劫持、MIME类型嗅探等漏洞,主流浏览器会根据这些头启用安全机制。
在server块或location块中添加:
# 安全响应头配置
add_header X-Frame-Options "DENY"; # 禁止页面被嵌入iframe,防点击劫持
add_header X-XSS-Protection "1; mode=block"; # 启用XSS保护,检测到XSS则阻止页面加载
add_header X-Content-Type-Options "nosniff"; # 禁止MIME类型嗅探
add_header Content-Security-Policy "default-src 'self'; script-src 'self'"; # 内容安全策略(CSP),严格限制资源加载(需根据业务调整)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; # HSTS,强制使用HTTPS(仅在配置SSL后添加)
若业务包含文件上传功能,需在Nginx层限制上传文件的类型、大小,并禁止访问上传目录中的可执行文件(如.php、.sh),防止文件上传漏洞利用。
假设上传目录为/upload,后端存储路径为/var/www/upload:
location /upload {
# 限制上传文件大小(结合后端)
client_max_body_size 10M;
# 禁止访问可执行文件
location ~* \.(php|sh|py|pl|jsp|asp)$ {
deny all;
}
# 仅允许访问图片、文档等合法类型
location ~* \.(jpg|jpeg|png|gif|pdf|doc|docx)$ {
root /var/www;
expires 7d;
}
}
拦截对/etc/passwd、.htaccess、config.php等敏感文件的访问,防止配置泄露。
在server块中添加:
# 禁止访问敏感文件
location ~* (\.htaccess|\.htpasswd|config\.php|/etc/passwd|/proc/self/environ) {
deny all;
}
# 禁止访问隐藏文件(以.开头)
location ~ /\. {
deny all;
}
若未配置HTTPS,所有请求均为明文传输,易被窃听、篡改。需配置SSL证书(可通过Let’s Encrypt免费获取),并禁用弱加密算法。
server {
listen 80;
server_name your_domain.com;
# 强制跳转到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your_domain.com;
# SSL证书路径
ssl_certificate /etc/nginx/ssl/your_domain.crt;
ssl_certificate_key /etc/nginx/ssl/your_domain.key;
# 禁用弱SSL/TLS协议,仅启用TLS 1.2+
ssl_protocols TLSv1.2 TLSv1.3;
# 强加密算法
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 其他安全配置...
}
若需更高级的安全能力,可编译安装Nginx第三方模块:
nginx -t验证配置文件是否有语法错误。/var/log/nginx/access.log)和错误日志(/var/log/nginx/error.log),分析拦截的恶意请求。通过请求过滤、访问控制、服务加固这3个核心步骤,Nginx安全网关可封堵90%的常见Web漏洞,成为Web服务的坚固防线。需注意的是,Nginx防护是第一道防线,后端服务仍需做好输入验证、参数过滤、权限控制等安全措施,形成“网关+后端”的双层防护体系。