答案1
对于 ICMP 查询/答复类型消息(例如 Echoes(ping)),NAPT 使用 ICMP 查询 ID(有时简称为 ICMP ID),方式与使用 TCP 或 UDP 端口号相同。
对于 ICMP 错误消息(例如“目标不可达”),它使用导致错误的帧头的 ICMP 数据包的内部副本来确定使用 NAT 表中的哪个映射来转换它。
这些程序在几个与 NAT 相关的 RFC 中被简要引用,但我很难找到一个明确阐述该程序的 RFC。请参阅“传统 NAT”,RFC3022,第 4.1 节。
这并不与任何 TCP 或 UDP 映射冲突,因为在良好的 NAPT 实现中,协议是 NAT 表条目中保存的信息之一,以使其具有唯一性。
答案2
我做了一个小模拟(基于 GSN3 Kali Linux CLI 设备),以检查当 ICMP 冲突时会发生什么(显然,它可能是特定于供应商的):
在NAT 之前的 ICMP 请求/响应显示的情形是,来自 2 个设备(IP 分别为 10.0.0.1 和 10.0.0.2)的 ICMP 请求的标识符相等。
同时NAT 后的 ICMP 请求/响应显示冲突的 ICMP 会话的标识符被 NAT 更改为 0,并且从那时起递增。
总而言之,可以说 Linux NAT 自行处理 ICMP 标识符冲突(因为 ICMP 标识符在 NAT 之前不会改变)。