本文最后更新于 2025-07-25,本文发布时间距今超过 90 天, 文章内容可能已经过时。最新内容请以官方内容为准

🔄 SNAT & DNAT 通俗解释 + 图解

一、SNAT(源地址转换)

➡️ 出门“换马甲”,内网设备集体上网

网络场景

  • 公司或家庭内网有多台设备(A、B、C),通过路由器/防火墙统一访问外网网站。

原理/过程

  1. 内网主机A(192.168.1.10)要访问外网服务器C(8.8.8.8),请求到达网关B。
  2. 网关B把请求包源地址改成自己的公网IP(1.2.3.4),发给C。
  3. 外网C看到的请求来自1.2.3.4,回复也发往这个地址。
  4. 网关B收到外网回复后,再把目标还原为A的内网IP,转交回A。

一句话总结

内网设备出网时统一“穿外衣”,外网只认识网关的公网IP,看不见真实内网地址。

应用场景

  • 家庭/公司路由器让所有设备“共享”一个公网IP上网。

文字图解

你家电脑(A:192.168.1.10) → 网关B(1.2.3.4) → 外网服务器C(8.8.8.8)
      │         [SNAT:源192.168.1.10→1.2.3.4]        │
      └───────────────────→【换马甲】──────────────────→
      ←───────────────────────【收回复】←───────────────
      │         [SNAT还原→192.168.1.10]                │

生活类比

  • 快递柜:你(内网设备)寄快递,柜员(网关)把你的地址换成小区门口统一编号(公网IP),朋友(外网)只能回信到快递柜,柜员再转交给你。

二、DNAT(目标地址转换)

⬅️ 门口“挂招牌”,外部访问内网服务

网络场景

  • 外部用户要访问公司/家庭内网服务器(如远程桌面、搭网站等)。

原理/过程

  1. 外部用户C请求公网IP(B:1.2.3.4:80)。
  2. 网关B在PREROUTING阶段把包的目标地址改成内网服务器A(192.168.1.10:80),并转发。
  3. 内网A响应,B再把响应包的源地址改回公网IP(即B:1.2.3.4),发回C。

一句话总结

外部访问时“门卫带路”,用公网IP把外部请求引到内网服务器,外部看不见真实内网地址。

应用场景

  • 在公网开放内网服务(如家用NAS、公司WEB服务器、远程桌面)。

文字图解

外部用户C(8.8.8.8) → 网关B(1.2.3.4:80) → 内网服务器A(192.168.1.10:80)
      │  [DNAT:目标→192.168.1.10:80]    │
      └──────→【门卫引路】───────────────→
      ←────────【收服务响应】←────────────
      │        [源还原→1.2.3.4]          │

生活类比

  • 门口招牌:你家(内网)开了个超市(服务),小区门口(网关)挂了招牌(公网IP),外人(外网)找超市,门卫把他引导到你家。外人只认识门口招牌,不知道你家真实门牌号。

三、SNAT vs DNAT 快速对比表

类型方向修改内容场景
SNAT内网 → 外网源地址多设备共享上网
DNAT外网 → 内网目标地址内网服务对外开放
  • SNAT:一般用于POSTROUTING(出网前),改“源地址”。
  • DNAT:一般用于PREROUTING(入网前),改“目标地址”。

四、和Nginx等反向代理的区别和联系

  • DNAT反向代理(如Nginx、Caddy)都能把公网请求转发到内网服务,区别在于:
    • DNAT是在网络层(直接改IP)自动完成,客户端“以为”自己直连服务。
    • 反向代理是在应用层,可以做更多处理(缓存、认证、负载均衡等)。
  • 你用Nginx反代内网网站,本质上和DNAT的思路很像:都是“门口接待、内部转发”。

五、总结归纳

  • SNAT = 内网“统一马甲”,所有出网流量看起来来自一个公网IP。
  • DNAT = 公网“门口引路”,所有进来的请求被门卫转发到内网真实地址。
  • 理解了这两个NAT技术,你就能理解绝大多数路由器/防火墙是怎么实现内外网互通和服务暴露的。