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 让内部设备共享少量公网地址
- 通过地址与端口的映射区分连接
- 大幅节省公网地址,推迟地址耗尽
- 代价是外部难主动连入、端到端透明性受损
参考资料
- Wikipedia(zh):网络地址转换:在内外网之间转换地址与端口
- Wikipedia(zh):专用网络:仅在内部有效的私有地址段
思考题答案(仅供参考)
思考题 1
因为多台内部设备可能共用同一个公网地址。只改地址,回包就分不清该送到哪台设备的哪条连接;再加上端口的改写与映射,才能精确区分并还原每一条内部连接。
思考题 2
因为原本的设计理想是任意两台主机都能直接通信。NAT 之后,内部设备藏在转换设备后面,外部无法主动发起连接,通信变成了“只能内部先出去”。这种对等、直接的端到端通信被打破了,所以常说它破坏了端到端。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪