NAT、端口映射和反向代理都可能出现在“从公网访问家中服务器”的链路上,但它们工作的层次不同。把三者混在一起,会出现明明域名解析正确却仍然访问不了的情况。
一、NAT 与 NAPT
基础 NAT 负责在一组 IP 地址之间转换。家庭路由器更常用 NAPT/PAT:多台内网设备共享一个公网 IPv4,并用 TCP/UDP 端口区分连接。终端主动访问公网时,路由器建立状态表,让返回流量能回到正确的内网设备。
公网主动发起的新连接没有现成状态,路由器不知道该交给谁,所以需要端口映射(Port Forwarding/DNAT),例如:
公网 TCP 4430 → 192.168.2.20 TCP 443
公网 TCP 10443 → 192.168.2.30 TCP 443
端口映射只根据协议、地址和端口转发,不会理解 HTTP 域名或网页路径。外部使用非标准端口时,访问者通常必须写 https://域名:4430。
二、反向代理做什么
反向代理是应用层入口。Nginx 接收 HTTP/HTTPS 请求后,可以根据域名把请求送到不同后端:
server {
listen 443 ssl;
server_name blog.example.com;
location / {
proxy_pass http://192.168.2.20:2080;
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;
}
}
同一个 443 端口可以按 server_name 承载多个网站,并集中处理证书。但浏览器必须先到达这台反向代理;如果家庭宽带的 443 被封、没有公网地址或上级 NAT 不允许入站,仅配置 Nginx 不能突破网络限制。
三、DDNS 解决什么、不解决什么
动态 DNS 只是在公网 IP 改变后更新域名记录。它不负责开放端口,也不保证运营商允许入站。排查时比较路由器 WAN 地址与公网查询到的地址:如果 WAN 是私网或共享地址,可能存在光猫路由、上级路由或运营商 CGNAT。
双重 NAT 场景需要在每一层正确转发,或把其中一层改桥接/DMZ,但改动前要评估管理和安全。CGNAT 通常无法由用户自行做入站映射,可考虑有公网入口的云服务器、IPv6、VPN 组网或隧道方案。
四、怎样选架构
- 只有一个非 HTTP 服务:路由器端口映射最直接,但要严格限制来源并强化认证。
- 多个网站共用标准 HTTPS:让反向代理占用一个公网 443,再按域名分流。
- 家宽没有 80/443:使用
域名:非标准端口,或由具备标准端口的云服务器反代/隧道回家。 - 管理面板、路由器、虚拟化平台:优先通过 VPN 访问,不建议直接暴露全网。
反向代理到家庭网络时,连接方向、证书终止位置和健康检查要写清。若云端终止 TLS,再用明文 HTTP 穿越不可信公网,链路中段不再受 TLS 保护;应使用 VPN、加密隧道,或让代理到后端仍走 HTTPS。
五、按层检查
先用 nslookup/dig 确认域名,再用 nc -vz 域名 端口 或 Test-NetConnection 检查 TCP。到达代理后看访问日志和错误日志,再从代理机直接 curl 后端。最后检查应用是否生成了错误的跳转端口、Host 头和 X-Forwarded-Proto。
不要把“端口通”当成“服务安全”。公网入口应启用更新、强认证、访问控制、日志和备份;能放进 VPN 的管理服务尽量不直接发布。
本文为中文原创学习整理。地址与端口转换原理参考 IETF RFC 3022:Traditional NAT;反向代理指令参考 Nginx 官方 ngx_http_proxy_module。
评论一下?