NAT 与反向代理
内网 IP、DNAT、宝塔反代。
25 分钟
NAT 与反向代理
NAT(Network Address Translation)把私网地址与公网地址互相映射,让多台内网设备共用一个公网 IP。反向代理则在应用层替后端收请求——Nginx 同时承担「公网入口」角色,与 NAT 常一起出现在家庭路由与云 VPC 中。
学习目标
- 理解 SNAT/DNAT 与「端口转发」直觉
- 区分 NAT 与 Nginx 反向代理各解决什么问题
- 对照宝塔/Nginx 反代 CodeRoadMap 的配置思路
核心内容
NAT 两种方向
| 类型 | 方向 | 例子 |
|---|---|---|
| SNAT | 内网 → 公网 | 服务器访问 npm registry,源 IP 被换成公网 IP |
| DNAT | 公网 → 内网 | 路由器 :443 转发到内网 192.168.1.10:443 |
云 VPS 通常直接绑 公网 IP 到 eth0,Nginx 监听 0.0.0.0:443,不经过家用路由 DNAT;但 127.0.0.1 反代 仍是「逻辑上的内网转发」。
反向代理 vs NAT
【NAT / 端口转发】 【Nginx 反向代理】
改 IP/端口映射 懂 HTTP,改 Host/Path/头
通常 L3/L4 L7
客户端不知内网 IP 客户端只知 coderoadmap.cn
本站:https://coderoadmap.cn/api/* → Nginx 改写 upstream 为 http://127.0.0.1:8080(ngx-proxy)。
CodeRoadMap 路径
用户公网
│ TCP 公网IP:443
▼
Nginx(公网网卡)──── DNAT 式「转发」到回环 ────► 127.0.0.1:3000 / :8080
│ │
│ └──► 127.0.0.1:3306
└── TLS 证书在 Nginx 终止(http-https)
Spring Boot 不需要公网 IP;数据库更不应映射端口(linux-firewall)。
宝塔反代
面板 → 网站 → 反向代理:图形化生成 proxy_pass,等价于手写 Nginx location。改配置后 nginx -t 再 reload。
curl -H "Host: coderoadmap.cn" http://127.0.0.1/api/tracks -I
练习
- 解释为何 MySQL 不需要做「端口转发到公网」
- NAT 能否读懂 HTTP 路径
/api?Nginx 呢? - 画出「公网 :443 → Nginx → :8080」逻辑图