Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

NAT

复习

  • IP 地址:体现网络位置,会随接入网络变化
  • 端口:IP 加端口标识一个通信端点
  • 为什么还需要 IP:地址不足是长期存在的问题

TL;DR

  • NAT 让许多内部设备共享少量公网地址
  • 它用“地址加端口”的映射来区分内部连接
  • 缓解了 IPv4 地址不足的问题
  • 但它也破坏了端到端透明性,带来一些麻烦

正文

  互联网上的公网 IP 地址是有限的。可家里、公司里动辄几十上百台设备都要上网,难道每台都得占一个公网地址?显然不够分。

  于是出现了 NAT(网络地址转换,Network Address Translation):让许多内部设备,共用少量公网地址。

出门改地址,回来再还原

  家庭网络里,每台设备通常有一个私有地址(比如 192.168.x.x)。这些地址在公网里是没有意义的,只在内部有效。

  当内部设备要上网时,出口路由器做两件事:

  • 把数据包的源地址改成自己的公网地址
  • 同时把源端口也换成一个它自己分配的号码,并记下一条映射:“这个端口,对应内网那台设备的那个连接”

  于是外部看到的,只是路由器这一个地址。数据回来时,路由器再查映射表,按端口把数据还原、送回对应的内网设备。

为什么端口也得改

  只改地址不够,还得改端口。因为很多设备可能共用同一个公网地址,如果不用端口区分,回来的数据就分不清该给谁。地址指向“这个家庭”,端口指向“家庭里的哪条连接”。 两者配合,才能把外面收到的数据准确送进去。

好处与代价

  NAT 的好处很实在:大幅节省了公网地址。 一个家庭、一个公司,往往只需要一个公网地址,就够所有设备上网。这大大推迟了 IPv4 地址耗尽的问题。

  但代价也很明显:

  • 外部无法主动连入:内部设备藏在 NAT 后面,外面的连接请求送不进来,需要额外的“端口映射”配置
  • 破坏了端到端透明性:按原设计,任意两台主机应能直接通信,而 NAT 打破了这一点
  • 某些协议更难穿透:需要在报文里携带地址、端口的应用(比如一些实时通信),遇到 NAT 就容易出问题

  所以,NAT 是一个务实但不够优雅的补丁:它确实救了急,却也违背了最初“端到端可直连”的设计理想。理想与现实的张力,在这里体现得淋漓尽致。

思考题 1

  NAT 为什么需要同时改写地址和端口,而不只是改写地址?

思考题 2

  NAT 缓解了地址不足,但为什么常说它“破坏了端到端”?

小结

知识点

  • NAT 让内部设备共享少量公网地址
  • 通过地址与端口的映射区分连接
  • 大幅节省公网地址,推迟地址耗尽
  • 代价是外部难主动连入、端到端透明性受损

参考资料

  1. Wikipedia(zh):网络地址转换:在内外网之间转换地址与端口
  2. Wikipedia(zh):专用网络:仅在内部有效的私有地址段

思考题答案(仅供参考)

思考题 1

  因为多台内部设备可能共用同一个公网地址。只改地址,回包就分不清该送到哪台设备的哪条连接;再加上端口的改写与映射,才能精确区分并还原每一条内部连接。

思考题 2

  因为原本的设计理想是任意两台主机都能直接通信。NAT 之后,内部设备藏在转换设备后面,外部无法主动发起连接,通信变成了“只能内部先出去”。这种对等、直接的端到端通信被打破了,所以常说它破坏了端到端。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪