Skip to content

苹果手机使用 ​

家中的 nas 经过多口转发然后使用 ddns 绑定域名后,使用外网可以访问,为什么在家中使用域名就无法访问了?

NAT = Network Address Translation 网络地址转换,修改IP 包头里的地址。

  • SNAT:改【源 IP】 Source NAT
  • DNAT:改【目标 IP】 Destination NAT

Hairpin NAT例子(重点!) ​

内网 PC:192.168.1.10,NAS:192.168.1.20,路由 WAN:223.5.5.5 PC 访问域名(解析到 223.5.5.5:8080)

  1. PC 发出包:Src=192.168.1.10,Dst=223.5.5.5:8080

  2. DNAT:目标地址修改 → Dst=192.168.1.20:8080

    此时包变成 Src=192.168.1.10,Dst=192.168.1.20:8080 ⚠️ 如果只做 DNAT,不做 SNAT: NAS 收到这个包,看到源 IP 是同网段 PC 192.168.1.10。NAS 判断:同网段,直接通过交换机回包给 PC,不走路由器。 路由器的连接跟踪表没有收到回包,TCP 会话断裂,连接失败。

  3. Hairpin NAT 必须额外加 SNAT: 在 DNAT 同时,SNAT 修改源 IP,把源 IP 192.168.1.10 → 路由器 LAN 口 IP 192.168.1.1 包变成:Src=192.168.1.1,Dst=192.168.1.20:8080

    • NAS 收到包,目标回复对象是

    • NAS 回包一定会发给路由器

    • 路由器查表,还原地址,再转发回 PC ✅ 握手成功。

用户的内网电脑 IP 段和 nas 的 ip 段一致,用户访问 nas,NAT 表是怎么变化的

核心触发条件(满足就会执行 SNAT) ​

前提:数据包从【内网 LAN 口】进入路由器,要从【WAN 口】转发出去

  1. 源 IP 是内网私有网段(10/172.16/192.168.x.x)
  2. 目的 IP不在本机 LAN 网段(需要转发到 WAN / 公网)
  3. 路由器开启了 NAT(家用路由器默认开启,就是常说的「上网」功能)

一句话:内网设备访问外面,出 WAN 口的时候,触发 SNAT。

场景前提 ​

PC 在 A 内网,NAS 在 B 内网,两个独立路由器,流量走公网

  • 路由器 A(PC 网关) LAN 网段:192.168.1.0/24 PC:192.168.1.10/24 R_A LAN:192.168.1.1 R_A WAN:111.1.1.1(公网 IP)

  • 路由器 B(NAS 网关)

    LAN 网段:192.168.1.0/24 NAS:192.168.1.20/24 R_B LAN:192.168.1.1 R_B WAN:223.5.5.5(DDNS 域名绑定这个公网 IP) R_B 配置 DNAT 端口转发:223.5.5.5:8080 → 192.168.1.20:8080

PC 访问域名,域名解析得到公网 IP:223.5.5.5:8080

⚠️核心陷阱:A 内网 PC 的 IP 是 192.168.1.10,B 内网 NAS 的 IP 是 192.168.1.20,网段完全一样,但属于两个完全隔离的局域网。 很多人误以为网段一样就会二层互通,不会,中间隔着公网路由;但会带来路由判断混淆问题。

公网访问 ​

场景 A(外网访问正常) ​

场景 B(故障:无 Hairpin) ​

场景 C(开启 Hairpin NAT) ​

最近更新