NAT分片报文

network nat

前文我们聊到,在NAT地址转换中,NAT除了对IP地址转换外,还使用到TCP或UDP报文的端口号、ICMP报文的ICMP头中的identifier字段信息。当一个IP分片报文和TCP分段报文 1|IP报文被分成若干片之后,这些信息只有首片报文会携带,后续分片报文依靠报文ID、分片标志位、分片偏移量依次关联到前一个分片。

以ICMP分片报文为例,在ICMP报文分片后,只有在首片ICMP报文中包含ICMP头的identifier字段。在首片报文到达NAT设备后,可以按照正常的转换流程,根据源IP地址和identifier信息生成会话表并转发出去。但是在第二个及后续分片到达后,由于只包含IP地址却没有identifier信息,可能因此无法进行NAT转换。解决的办法有两种:

  1. 先重组再进行NAT转换,在分片报文到达后,先进缓存,等属于这个IP报文的所有分片到达后进行虚拟分片重组,再进行NAT地址转换。最后将NAT转换完成的IP报文发送出去。
  2. 在首片到达并转换后,NAT设备记录并保存转换首片使用的ip及分片identifier信息,并在后续分片到达后应用同样会话表对ip信息进行转换。

1. 重组转发

  1. 当NAT设备收到一个分片报文时,它会检查该报文是否属于一个已经开始重组的数据包,如果是,就将该报文放入对应的缓存区;如果不是,就为该数据包创建一个新的缓存区,并将该报文放入其中。
  2. NAT设备会定期检查缓存区中的分片报文是否已经完整,如果是,就将它们重组成一个完整的数据包,并进行NAT转换,然后将转换后的数据包发送出去;如果不是,就继续等待其他分片报文到达。
  3. 如果缓存区中的分片报文在一定时间内没有完整,或者超过了NAT设备能够处理的数量,那么NAT设备会丢弃这些分片报文,并向源主机发送一个ICMP错误消息。

1.1. 分片重组失败导致的ICMP查错报文

  1. 如果NAT设备丢弃分片报文是因为缓存区已满,那么它会向源主机发送一个ICMP目的不可达消息,类型为3,代码为4,表示分片重组失败。
  2. 如果NAT设备丢弃分片报文是因为超时,那么它会向源主机发送一个ICMP超时消息,类型为11,代码为1,表示分片重组超时。

1.2. 缺点

分片重组的方式由于需要缓存分片报文,导致增加了NAT设备的内存消耗,延长了分片报文的传输时间。

2. 会话记录ID

正常NAT会话使用五元组(srcIP,dstIp,srcPort,dstPort,protocol)来区别不同的流并匹配会话进行转发,分片报文由于没有port和protocol信息,因此可以在会话中添加identifier来识别统一条流的不同分片报文以完成后续分片报文的ip替换。