我正在研究 NAT 过程,对寻址有疑问。当 NAT 将私有 IP 地址转换为公共 IP 地址时,如果配置正确,它可以将不同的私有 IP 转换为相同的公共 IP。两个主机怎么可能使用相同的公共 IP?我的意思是,如果我 ping 该 IP,我会收到两个 IP 的响应吗?
答案1
NAT 有很多变体,您指的是 NAPT(网络地址端口转换),具体描述如下RFC 2663,IP 网络地址转换器 (NAT) 术语和注意事项:
4.1.2. 网络地址端口转换(NAPT)
NAPT 通过转换传输标识符(例如 TCP 和 UDP 端口号、ICMP 查询标识符)将转换的概念进一步扩展。这允许将多个私有主机的传输标识符多路复用到单个外部地址的传输标识符中。NAPT 允许一组主机共享单个外部地址。请注意,NAPT 可以与基本 NAT 结合使用,以便将外部地址池与端口转换结合使用。
对于从专用网络发出的数据包,NAPT 将转换源 IP 地址、源传输标识符和相关字段,例如 IP、TCP、UDP 和 ICMP 报头校验和。传输标识符可以是 TCP/UDP 端口或 ICMP 查询 ID 之一。对于入站数据包,将转换目标 IP 地址、目标传输标识符以及 IP 和传输报头校验和。
基本上,IPv4 和传输协议地址(TCP/UDP 端口或 ICMP 查询 ID)都会被转换,而不仅仅是 IPv4 地址。这意味着您会转换为单个 IPv4 地址,但也会转换为各种传输地址,因此它不依赖于 IPv4 地址。这会产生一个限制,即您只能将 NAPT 与 TCP、UDP 和 ICMP 一起使用。NAPT 会破坏其他现有或未来的传输协议,以及使用 TCP 或 UDP 的一些应用程序或应用层协议。
这在RFC 3022,传统 IP 网络地址转换器(传统 NAT):
2.2. NAPT概述
假设一个组织有一个私有 IP 网络和一个到服务提供商的 WAN 链路。私有网络的存根路由器在 WAN 链路上被分配一个全局有效的地址,而组织中的其余节点的 IP 地址仅具有本地意义。在这种情况下,可以允许私有网络上的节点在 NAPT 的帮助下使用单个注册 IP 地址同时访问外部网络。NAPT 允许将类型(本地 IP 地址、本地 TU 端口号)的元组映射到类型(注册 IP 地址、分配的 TU 端口号)的元组。
此模型适合大多数小型家庭办公室 (SOHO) 群体使用单个服务提供商分配的 IP 地址访问外部网络的需求。此模型可以扩展为允许入站访问,方法是静态映射注册 IP 地址的每个服务 TU 端口的本地节点。
在下图 3 的示例中,存根 A 在内部使用 A 类地址块 10.0.0.0/8。存根路由器的 WAN 接口由服务提供商分配 IP 地址 138.76.28.4。
\ | / +-----------------------+ |Service Provider Router| +-----------------------+ WAN | | Stub A .............|.... | ^{s=138.76.28.4,sport=1024, | v{s=138.76.29.7, sport = 23, ^ d=138.76.29.7,dport=23} | v d=138.76.28.4, dport = 1024} +------------------+ |Stub Router w/NAPT| +------------------+ | | LAN -------------------------------------------- | ^{s=10.0.0.10,sport=3017, | v{s=138.76.29.7, sport=23, | ^ d=138.76.29.7,dport=23} | v d=10.0.0.10, dport=3017} | | +--+ +--+ +--+ |--| |--| |--| /____\ /____\ /____\ 10.0.0.1 10.0.0.2 ..... 10.0.0.10 Figure 3: Network Address Port Translation (NAPT) Operation
当存根 A 主机 10.0.0.10 向主机 138.76.29.7 发送 telnet 数据包时,它使用全局唯一地址 138.76.29.7 作为目标,并将数据包发送到其主路由器。存根路由器具有子网 138.76.0.0/16 的静态路由,因此数据包被转发到 WAN 链路。但是,NAPT 会在转发数据包之前将 IP 和 TCP 标头中的源地址 10.0.0.10 和源 TCP 端口 3017 的三元组转换为全局唯一的 138.76.28.4 和唯一分配的 TCP 端口(例如 1024)。返回路径上的数据包会针对目标 IP 地址和目标 TCP 端口经历类似的地址和 TCP 端口转换。再次注意,这不需要对主机或路由器进行任何更改。转换是完全透明的。
在此设置中,只允许 TCP/UDP 会话,并且必须源自本地网络。但是,有些服务(例如 DNS)需要入站访问。组织可能希望允许其他服务进行入站会话访问。可以在存根路由器上静态配置众所周知的 TU 端口服务 [RFC 1700],以将其定向到专用网络中的特定节点。
除了 TCP/UDP 会话之外,NAPT 路由器还可以监控 ICMP 消息(REDIRECT 消息类型除外)。ICMP 查询类型数据包的转换方式与 TCP/UDP 数据包的转换方式类似,ICMP 消息头中的标识符字段将唯一地映射到已注册 IP 地址的查询标识符。ICMP 查询消息中的标识符字段由查询发送者设置,并在查询响应者的响应消息中不加改变地返回。因此,NAPT 路由器将 (本地 IP 地址、本地 ICMP 查询标识符) 的三元组映射到 (已注册 IP 地址、分配的 ICMP 查询标识符) 的三元组,以唯一地标识来自任何本地主机的所有类型的 ICMP 查询。后面的部分将讨论对 ICMP 错误消息的修改,因为这涉及对 ICMP 有效负载以及 IP 和 ICMP 报头的修改。
在 NAPT 设置中,注册的 IP 地址与末梢路由器 WAN 接口的 IP 地址相同,路由器必须确保区分源自自身的 TCP、UDP 或 ICMP 查询会话与源自本地网络节点的会话。所有入站会话(包括 TCP、UDP 和 ICMP 查询会话)都假定指向作为终端节点的 NAT 路由器,除非目标服务端口静态映射到本地网络中的其他节点。
由 NAPT 路由器提供服务的本地节点根本不允许进行除 TCP、UDP 和 ICMP 查询类型之外的会话。