NAT 服务器如何将 ping ICMP 回显答复数据包转发给用户?

NAT 服务器如何将 ping ICMP 回显答复数据包转发给用户?

NAT使用 IP 地址端口号组合来散列传出的请求。由于请求由 ICMP 回应请求数据包组成,它们没有任何关联的端口号。NAT 服务器如何将回复转发到网络内的主机?

答案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 之前不会改变)。

相关内容