Nginx跨网段流量转发需按场景选模块:HTTP类用http模块proxy_pass,TCP/UDP类必须用stream模块;外网访内网须确保路由通、设正确proxy_pass和请求头;内网IP分流用stream中geo指令;内网出向代理需限制allow网段并配proxy_pass。

配置 Nginx 在不同网段间转发流量,核心在于明确转发方向(内→外、外→内、内网多节点间)并选用合适模块(http 或 stream),同时确保网络可达性与请求头完整性。关键不是“能不能转”,而是“怎么转得准、稳、可追溯”。
区分转发场景选对模块
Nginx 的 http 模块只处理 HTTP/HTTPS 流量,适合 Web 服务;而跨网段的非 HTTP 流量(如数据库 MySQL、Redis、自定义 TCP 服务)必须用 stream 模块——它工作在传输层,不解析应用层内容。
- HTTP 类服务(网站、API、前端代理)→ 用
http { server { location {} } }配置proxy_pass - TCP/UDP 类服务(MySQL、SSH 跳板、IoT 设备通信)→ 启用
stream { server { proxy_pass } },并在主配置中取消注释include /etc/nginx/stream-enabled/*.conf;
外网请求访问内网服务(典型反向代理)
这是最常见需求:让公网用户通过域名访问部署在 192.168.10.50:8080 的内网 Spring Boot 应用。前提是 Nginx 服务器本身能直连该内网 IP(路由通、防火墙放行)。
- 确保
server_name域名已 DNS 解析到 Nginx 公网 IP -
proxy_pass地址写内网服务的 实际 IP 和端口,不要写 localhost(否则走的是 Nginx 本机,不是目标内网机器) - 必须设置
proxy_set_header Host $host和X-Real-IP等头,否则后端日志看到的全是 Nginx 本机 IP
示例配置片段:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://192.168.10.50:8080/;
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;
}
}按客户端 IP 动态分流到不同内网节点
适用于多数据中心、灰度发布或安全隔离场景。例如:北京 IP 段走 192.168.20.10,广东 IP 段走 192.168.20.11,其余走默认节点。
- 仅
stream模块支持原生 IP 匹配(match+map不适用 TCP) - 需在
stream块中用geo指令预定义 IP 映射关系,再结合map或直接在server中用if判断(注意:stream 中if仅支持有限变量,推荐用geo) - 务必配置
proxy_timeout和proxy_responses,避免连接卡死
简化版 stream 示例(TCP 3306 端口):
stream {
geo $backend_server {
default 192.168.20.100:3306; # 默认节点
114.255.0.0/16 192.168.20.10:3306;
14.125.0.0/16 192.168.20.11:3306;
}
<pre class='brush:php;toolbar:false;'>server {
listen 3306;
proxy_pass $backend_server;
proxy_timeout 1s;
proxy_responses 1;
}}
内网主动调用外网资源(出向代理)
某些内网系统(如监控脚本、内部 API)需访问第三方 HTTPS 接口,但又不能直接暴露公网出口。此时可将 Nginx 配置为正向代理网关(注意:Nginx 官方不推荐做通用正向代理,仅限可控 HTTP 场景)。
- 不监听 80 端口,改用专用端口(如 8081),避免冲突
- 用
location /+proxy_pass指向目标域名,配合proxy_method GET和proxy_set_header构造合法请求 - 必须限制
allow内网网段,禁止公网 IP 访问该代理端口
示例(仅允许 192.168.10.0/24 使用):
server {
listen 8081;
location / {
allow 192.168.10.0/24;
deny all;
proxy_pass https://$host$request_uri;
proxy_set_header Host $host;
proxy_ssl_verify off; # 外部证书不可信时临时关闭(生产慎用)
}
}


















