nginx 不穿透防火墙或 nat,仅作反向代理;需先通过 ssh 隧道、frp 等打通公网服务器到内网服务的连接,再用 nginx 安全转发请求,并配置 https、安全头、限流等加固措施。

Nginx 本身不“穿透”防火墙或 NAT,它只做反向代理。要实现安全的内网穿透访问,关键是:公网服务器能连上内网服务(靠 SSH 隧道、frp、cpolar 等打通),再用 Nginx 把外部请求干净、可控地转过去,并加上必要安全控制。
确保内网服务可被公网服务器访问
这是前提,否则 Nginx 再配也没用:
- 如果内网服务在
192.168.1.100:3000,先从公网服务器执行curl http://192.168.1.100:3000看是否通 - 不通就建通道:常用 SSH 反向隧道(
ssh -R 3000:localhost:3000 user@public-ip),此时内网服务就“映射”到公网服务器的127.0.0.1:3000 - 或者用 frp/cpolar 等工具,在公网服务器上暴露一个本地地址(如
http://127.0.0.1:7000)指向你的内网服务
基础 server 块配置(带安全头和限制)
以下是一个兼顾可用性与基础安全的 HTTP 代理配置示例:
server {
listen 80;
server_name app.example.com;
<pre class="brush:php;toolbar:false;"># 拒绝非 Host 头访问,防恶意请求
if ($host !~ ^(app\.example\.com)$) {
return 444;
}
location / {
proxy_pass http://127.0.0.1:3000; # 替换为实际可达的内网地址或隧道端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 防止后端被直接访问(如绕过 Nginx 直连 3000 端口)
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
# 超时设置,避免长连接拖垮
proxy_connect_timeout 10;
proxy_send_timeout 30;
proxy_read_timeout 30;
}}
升级 HTTPS + 强制跳转(推荐生产环境)
加 SSL 不仅加密传输,还能配合证书验证身份,提升可信度:
- 申请免费证书(如 Let’s Encrypt),把
fullchain.pem和privkey.pem放到/etc/nginx/ssl/ - 配置 443 端口并重定向 80 流量:
server {
listen 80;
server_name app.example.com;
return 301 https://$server_name$request_uri;
}
<p>server {
listen 443 ssl http2;
server_name app.example.com;</p><pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 启用 HSTS,强制浏览器后续只走 HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}}
可选增强:访问控制与限流
若服务敏感,可进一步加白名单或速率限制:
- 按 IP 白名单(适合固定办公出口):
allow 203.0.113.42;deny all; - 全局限流(防暴力刷接口):
在http块中定义:limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
在location中启用:limit_req zone=api burst=20 nodelay;
配置完别忘了测试语法:nginx -t,再重载:nginx -s reload。整个过程不复杂但容易忽略网络连通性和头信息透传,稳住这两点,代理就基本可靠了。











