Nginx代理内网服务需坚持最小暴露面、可控路径、强身份验证与实时约束:白名单IP、强制HTTPS、限制HTTP方法;隐藏敏感头、收敛代理路径、关闭server_tokens;接入JWT/OAuth2鉴权,限流限连;详记日志,拦截攻击特征。

用Nginx代理内网服务供外网访问,本质是把内部系统“暴露”在公网边界上,安全加固不能只靠加个密码或关掉目录浏览——关键在于最小暴露面 + 可控访问路径 + 有效身份验证 + 实时行为约束。
限制访问来源与协议强制
不加来源控制的反向代理等于敞开大门。必须明确只允许可信IP或IP段访问代理入口:
- 在server块中用allow/deny指令白名单化真实用户出口IP(如办公网出口、CDN回源段),末尾deny all兜底
- 强制HTTPS:监听443并返回301跳转,禁用80端口明文传输;证书建议用Let’s Encrypt自动续期,避免自签证书引发信任链问题
- 关闭不必要的HTTP方法,例如在location中添加limit_except GET HEAD POST { deny all; },防止PUT/DELETE等高危操作被滥用
剥离敏感头信息与路径收敛
Nginx默认可能透出后端真实信息,给攻击者提供线索:
- 用proxy_hide_header隐藏后端Server、X-Powered-By等响应头;用proxy_set_header统一设置X-Forwarded-For、X-Real-IP,但禁止透传原始Host头,改用固定值防Host头攻击
- 代理路径严格收敛:不要用location / { proxy_pass http://backend; }这种宽泛配置;应限定具体路径前缀,如location /app/v1/ { proxy_pass http://192.168.1.10:8080/; },注意结尾斜杠对路径重写的决定性影响
- 禁用Nginx自身服务标识:在http块中设server_tokens off;,减少指纹暴露
接入强身份验证与会话管控
单靠网络层隔离不够,需在应用入口前叠加认证层:
- 对管理类接口(如/api/admin、/login)启用auth_basic配合htpasswd,仅作临时应急;生产环境优先用JWT校验或OAuth2网关集成,由Nginx通过auth_request模块调用独立鉴权服务
- 限制单IP连接数与请求频率:用limit_conn防连接耗尽,limit_req防暴力探测(如每分钟最多10次登录尝试),突发流量可配burst+delay平滑处理
- 敏感操作(如配置导出、账号删除)建议额外绑定二次验证,Nginx本身不处理OTP,但可通过header透传MFA状态给后端做最终决策
日志审计与异常响应拦截
没有记录的访问等于没发生过,没有拦截的异常等于已成功:
- 开启详细access_log,记录$remote_addr、$http_x_forwarded_for、$request、$status、$body_bytes_sent、$request_time;错误日志级别至少设为warn,便于快速定位恶意扫描或超时请求
- 用map模块定义黑名单变量,结合geo或realip模块识别高危地区IP,再在server中return 444(关闭连接不响应)直接丢弃请求
- 对常见攻击特征做简单过滤:例如匹配args ~* "(union|select|insert|drop|sleep)"的URL参数,或request_uri ~* "\.\./"的路径遍历尝试,统一返回403


















