NAT是否在ICMP数据包的有效载荷中重写ipAddress?

今天当我testing运行一个tracert命令(windows + Wireshark)时,我看到一个出站ICMP_ECHO_REQUEST数据包,其sourceIP为“192.168.1.55” – 我的本地IP地址。

紧接着一个ICMP_TTL_EXCEEDED数据包从互联网野生主机发送回复给我,我的EchoRequest数据包中途死亡。 应答包在有效载荷部分“引用”我的“原始数据包”的前28个字节,在这里我可以看到sourceIP保留“192.168.1.55” – 我的本地ipAddress

一个问题立刻从我脑海中跳出来:“NAT没有在IP-Header中重写”本地“sourceIP,还是用”payload“重写了它?

AFAIK在TCP或UDP数据包的情况下,NAT将在数据包的IP报头中用外部“IP:PORT”代替本地“ip:port”。 所以我想知道:

1 – NAT是否在数据包的有效载荷部分中replace它们? (或者只使用types为TTL_Exceeded的ICMP数据包来做这件事?)

2 – 如果1不是真的,这是一种安全威胁吗?

答案是,这取决于。

我收到来自带有NAT设备的系统的ICMP消息,通过ICMP消息让内部IP地址泄漏。

但是,为了使ICMP消息的接收者可靠地将其与先前发送的分组相关联,ICMP消息需要包含触发分组,其基本上与其最初看起来一样。 这意味着如果数据包在被NAT修改后触发ICMP消息,则NAT必须反转ICMP有效载荷内的修改。 还有一些NAT正确。

还有更微妙的方面需要注意。 当NAT修改IP地址时,还必须修改数据包内的校验和。 但是,ICMP有效载荷通常是截断的IP数据包,因此传输层校验和无法validation。 出于这个原因,它们很less被使用,并且ICMP有效载荷内的校验和不被修改就不会造成破坏。 但是,这会导致校验和在一个方向而不是另一个方向被修改。 这样,有关内部IP地址的信息可能会泄漏。

这些泄漏可以被认为是安全漏洞。 这只是一种NAT可能导致的泄露。 更严重的泄漏也是可能的,包括将分组碎片发送到另一个主机而不是预期的接收者的可能性。 这些是NAT不是一个好主意的一些原因。 用不带NAT的防火墙replaceNAT将提供更好的安全性。 但是这当然需要更多的IP地址。

NAT不会触及数据包的有效负载。 它只涉及IP和TCP / UDP标头。 IP地址包含在IP报头(源和目标)中。 TCP头部包括源头和目的地端口,类似于UDP头部。

对于ICMP的情况,你可以看看这个页面 。 它指出,如果出现错误消息(例如TTL超时),则数据包包含IP标头(20个字节)+ 8个字节(净荷)= 28个字节。