Nginx可通过geo模块基于请求IP地址段(如10.0.0.0/8等私有网段)标记$client_type,结合upstream分组与proxy_pass动态路由,实现内外网流量隔离;亦可按端口、域名或X-Forwarded-For头增强识别。

可以通过Nginx的upstream模块配合不同server块、监听端口及请求头/来源IP判断,实现内网与外网流量的物理隔离与定向调度。
按客户端IP区分内外网流量
最直接可靠的方式是依据请求来源IP地址段做路由决策。内网通常使用私有地址(如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),外网则为公网IP。
- 在
http块中定义两个upstream组,分别对应内网服务集群和外网服务集群 - 在
server块中用if ($remote_addr)或geo指令预判IP归属,避免重复正则匹配 - 推荐用
geo模块提前标记变量,性能更优且逻辑清晰
用geo模块高效标记流量来源
geo指令在初始化阶段完成IP匹配,比运行时if更轻量。例如:
geo $client_type {
default "external";
10.0.0.0/8 "internal";
172.16.0.0/12 "internal";
192.168.0.0/16 "internal";
127.0.0.1 "internal";
}
之后可在location中直接引用$client_type选择上游:
location /api/ {
proxy_pass http://backend_$client_type;
}
绑定不同监听端口或域名实现硬隔离
若内网和外网访问路径天然分离(如内网走intranet.example.com或:8080,外网走www.example.com或:80),可直接用server块隔离:
- 一个
server监听8080端口,仅允许内网IP访问(allow/deny)并代理到内网后端 - 另一个
server监听80或443,处理外网HTTPS请求,代理到外网后端集群 - 两者共用同一套
upstream定义,但后端地址池可完全独立
结合HTTP头增强识别鲁棒性
当Nginx前置有WAF或云LB时,真实IP可能在X-Forwarded-For中,需配合set_real_ip_from和real_ip_header还原:
- 配置可信代理网段,确保
$remote_addr反映真实客户端IP - 必要时检查
$http_x_forwarded_for首IP,并与geo结果交叉验证 - 不建议仅依赖
User-Agent或自定义Header做核心分流,易被伪造
关键在于把“谁来访问”和“要发给谁”解耦:用geo或server明确来源,用upstream抽象后端,再用proxy_pass动态拼接或条件路由。整个过程不依赖外部组件,纯Nginx即可闭环。










