nginx 本身不穿透内网,仅作反向代理;真正打通网络需依赖 frp、nps 或 ssh 反向隧道,nginx 负责将公网请求转发至本地已建立的隧道端口,并提供 https、域名路由与 ip 透传等功能。

Nginx 本身不能“穿透”内网,它只是反向代理;真正打通网络的是隧道工具(如 frp、nps)或 SSH 反向隧道。Nginx 的作用是把公网请求干净地转给本地已建立好的通道,并提供 HTTPS、域名路由、IP 透传等增强能力。
关键逻辑就一句话:先让内网服务能被公网服务器访问到,再用 Nginx 把外部请求转发过去。下面分三步讲清楚。
先确保公网服务器能访问你的内网服务
这是最容易卡住的环节。Nginx 不解决连通性问题,只负责转发。
-
如果你用 frp:
- 内网运行 frpc,把
192.168.1.100:8080映射到公网服务器的127.0.0.1:10080 - 确保 frps 已监听
10080,且该端口在云服务商安全组和系统防火墙中放行 - 在公网服务器上执行
curl http://127.0.0.1:10080能拿到响应,才算通了
- 内网运行 frpc,把
-
如果你用 SSH 反向隧道:
- 内网机器执行:
ssh -R 10080:localhost:8080 user@公网IP - 公网服务器需开启
GatewayPorts yes(修改/etc/ssh/sshd_config后重启 sshd) - 验证:
curl http://127.0.0.1:10080或curl http://0.0.0.0:10080
- 内网机器执行:
-
如果直接走内网 IP(仅限公网服务器和内网在同一局域网):
- 公网服务器 ping 得通
192.168.1.100,且curl http://192.168.1.100:8080成功
- 公网服务器 ping 得通
Nginx 配置必须指向本地可访问地址
proxy_pass 别写错成内网 IP(除非真能通),绝大多数情况应指向 127.0.0.1:端口:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:10080; # ← 关键:不是 192.168.x.x,而是本地隧道端口
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;
proxy_redirect off;
}
}
-
proxy_set_header Host $host:让后端服务知道原始域名,避免跳转出错 -
X-Real-IP和X-Forwarded-For:传递真实客户端 IP,日志和权限判断才准 -
proxy_redirect off:防止后端返回Location: http://127.0.0.1:10080/xxx这种错误重定向
加 HTTPS 和多域名支持(可选但推荐)
如果你有域名,建议用 Nginx 统一处理 HTTPS:
- 把证书放在
/etc/nginx/ssl/example.com.crt和.key - 修改配置监听 443:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
proxy_pass https://127.0.0.1:10080; # 注意这里也可以是 https(如果后端支持)
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;
}
}
多个子域名(如 api.example.com、admin.example.com)可分别指向不同本地端口(10081、10082),复用同一套证书或单独配。
不复杂但容易忽略











