前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IETF (RFC 4787) 定义的 NAT 行为要求 - 第 3 部分。确定性属性

IETF (RFC 4787) 定义的 NAT 行为要求 - 第 3 部分。确定性属性

作者头像
dpdk-vpp源码解读
发布2024-06-03 15:31:07
730
发布2024-06-03 15:31:07
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

前面我们介绍了NAT映射行为过滤行为本文进入第三部分 NAT 确定型属性。

非确定性NAT:在特定情况下改变其映射或过滤行为的NAT被称为“非确定性NAT”。RFC 4787中描述了一个这类NAT的例子,如下所示。

NAT通常实现具有端口保留的端点独立映射(Endpoint-Independent Mapping with Port Preservation)。因此,在下图中,无论是主机A向主机X发送数据包([1]),还是主机A向主机Y发送数据包([2]),NAT都会分配相同的外部端口(5000)(端点独立映射),并且将内部端口号5000映射到相同的外部端口,此种映射叫端口保持。

接下来,主机A和主机B分别向主机Y发送数据包([3]和[4]),此时两者都使用6000作为其内部端口号。由于NAT的外部地址池中仍有足够的IP地址可用,它可以继续维持端口保持的策略。

然而,当主机C随后向主机Y发送内部端口号也为6000的数据包[5]时,NAT发现:内部端口号6000已分配给了之前同样目的为该外部端点的数据包并且外部地址池中已经没有其他可用地址时,此时无法再维持端口保持的规则。于是,NAT转而采用“地址和端口依赖映射且不保持端口”的策略。因此,主机C发送给主机Y的数据包([5])其外部端口(7000)必然与内部端口(6000)不同,即没有进行端口保持。此外,主机C发送给主机X的数据包([6])其外部端口(7002)也将不同于之前发送给主机Y的数据包([5])的外部端口(7000)(地址和端口依赖映射),这进一步体现了映射的不确定性。

确定性NAT(Deterministic NAT)是一种网络地址转换(NAT)的行为模式,其中NAT设备在转换内部私有IP地址到外部公有IP地址时遵循固定的、可预测的规则。与非确定性NAT相比,确定性NAT的关键特征在于它为特定的内部源地址和端口号到外部地址和端口号的映射提供了一致性,确保相同内部源的流量总是被转换为同一外部地址和端口,除非外部地址池资源耗尽或其他明确的规则变更。

举例说明确定性NAT的工作原理:

假设有一个公司网络,内部使用私有IP地址,且拥有一个向外提供服务的内部服务器,其私有IP地址为192.168.1.100,端口为80。公司使用NAT设备连接到互联网,该NAT设备配置了确定性NAT规则,将服务器的私有地址映射到一个固定的公有IP地址203.0.113.10,同样将内部端口80映射到外部端口80。

在确定性NAT下,无论何时从互联网上任何位置向203.0.113.10的80端口发送请求,该请求都会被NAT设备一致地、确定性地转发给内部服务器192.168.1.100的80端口。即使存在多个并发连接,只要源IP地址和端口号相同,映射关系保持不变,保证了通信的连贯性和可预测性,这对于一些需要持续连接状态或会话保持的应用尤其重要,比如VoIP通话、在线游戏或某些类型的视频流服务。

NAT设备发送分片报文:在主机中,TCP/UDP应用程序发出的外出数据包的最大传输尺寸受限于规定的IP最大传输单元(MTU)大小。当IP的下一层(即第二层,L2)为以太网时,标准IP MTU为1500字节(巨型帧除外)。因此,正如下图所示,若UDP应用程序发送一个2000字节的数据包,网络地址转换器(NAT)会将该数据包分割成两个较小的部分——首部分包含完整的IP及UDP头部,第二部分则仅含IP头部。

因此NAT设备必须能够通过检查数据包IP头部中的MF(更多片段)和分片偏移字段来识别这些分片的数据包,这一点尤为关键。对于缺少UDP头部的第二部分数据包,NAT应能通过参考IP头部中的标识字段(例如0x1234)来辨认会话,并将内部地址(10.1.1.1)替换为外部地址(5.5.5.1)。如果NAT无法执行这些操作,则通信将无法进行(显然,这些被视为基本功能,因过于基础,IETF甚至未在RFC 4787中特意提及)。

数据包分片不仅发生在主机(设备或服务器)中,也发生在通用路由器和 NAT 设备中(NAT 可以被视为路由器,因为它们的数据包传递也基于数据包的目标 IP 地址)。 如今,几乎所有链路层都是以太网,而且 Wi-Fi 网络上的 MTU 大小为 1,500 字节(使用 Windows)。因此,NAT 很少真正执行数据包分片。但是,RFC 4787 仍然建议 NAT 在需要时发送以下 ICMP 消息:

RFC 4787建议(REQ-13):如果在内部IP地址上收到的数据包的DF=1,则NAT必须向主机发回ICMP消息“需要分片并设置DF”,如[RFC0792]中规定 a)如果数据包的DF=0,则NAT必须对数据包进行分段,并且应按顺序发送分段

NAT设备接收分片报文:数据包分片不仅发生在NAT设备内部端点触发,还可能由外部主机(例如下图中的主机 B)发送。如果是外部主机发送的分片报文,也必须满足上述要求。对于没有 UDP 报头的碎片数据包,NAT 应该能够通过参考 IP 报头的标识字段来识别会话,并将收到的外部地址替换为数据包的内部地址。

对于这种情况,RFC 4787 中提到了以下两种类型的 NAT 行为:

  • 按顺序接收分片报文:只有当数据包按照碎片的顺序接收时,NAT 才能转换碎片数据包的地址/端口并将其转发到内部端点。
  • 接收的无序的分片报文:即使数据包不是按照碎片的顺序接收的,NAT 也可以转换碎片数据包的地址 / 端口,并将其转发到内部端点(例如,外部端点按照碎片数据包 1、2 和 3 的顺序发送数据包,但 NAT 按照碎片数据包 1、3 和 2 的顺序接收它们)。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档