关键在于防火墙网络层放行、nginx应用层校验与部署位置物理约束三层协同:防火墙精确控制端口访问(如仅允内网段访问8080),nginx绑定不同网卡ip实现入口分离(如外网203.0.113.10:443、内网192.168.10.5:8443),并在server块中叠加allow/deny、realip模块和固定proxy_pass地址,杜绝反向穿透与host头伪造。

用 Nginx 的 Virtual Host 配合防火墙规则实现内外网隔离,关键不在“虚拟主机”本身,而在于网络层放行 + 应用层校验 + 部署位置约束三层协同。单纯靠 server_name 或端口监听无法真正隔离——外网请求仍可能伪造 Host 头或直连内网端口。必须让防火墙先拦住非法来源,再由 Nginx 做二次识别和拒绝。
防火墙按方向精确控制端口访问
这是第一道硬隔离。不能只靠 Nginx 的 allow/deny,必须在系统层面切断非授权流量路径:
- 外网服务(如官网、API)走标准端口:只放行 80/443,且不限制源 IP(面向公网)
- 内网服务(如管理后台、内部接口)走独立端口(如 8080、8443):仅允许指定内网段访问,例如:
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP - 使用 firewalld 时,推荐建自定义 zone 或加 rich rule,避免影响默认策略
Nginx Virtual Host 按监听地址与端口物理分离
不要依赖 Host 头做唯一判断。应让内外网服务绑定不同网卡 IP 或明确端口,从入口就分流:
- 外网站点:listen 203.0.113.10:443 ssl;(对应公网弹性 IP)
- 内网站点:listen 192.168.10.5:8443 ssl;(仅运维跳板机可达)
- 两块网卡物理分离(eth0 接外网交换机,eth1 接内网),系统路由表不打通,Nginx 不做跨网段转发
- 即使配置错误,流量也无法从外网网卡误入内网服务
在 server 块中叠加 IP 白名单与可信上下文
防火墙可能被绕过(比如内网失陷后横向扫描),所以 Nginx 必须主动校验:
- 用 allow/deny 限制内网专属 location,例如:
location /admin/ {
allow 192.168.10.0/24;
deny all;
proxy_pass http://192.168.10.100:8000;
} - 启用 realip 模块,准确获取客户端真实 IP:
set_real_ip_from 192.168.10.0/24;
real_ip_header X-Forwarded-For; - 用 map 指令标记来源类型,驱动日志、响应头或条件拦截:
map $realip_remote_addr $client_zone {
default "external";
~^192\.168\. "internal";
~^10\. "internal";
}
禁止反向穿透,严格限定后端目标
内网 Virtual Host 的 proxy_pass 必须指向可信内网地址,杜绝 DNS 解析或变量注入风险:
- ✅ 正确写法:proxy_pass https://192.168.10.100:8443;(固定 IP + 端口)
- ❌ 危险写法:proxy_pass http://$host; 或 proxy_pass http://backend;(后者若 upstream 含公网域名则失效)
- 建议配合 resolver 禁用,或用 set $upstream "192.168.10.100"; proxy_pass https://$upstream:8443; 防止变量污染











