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

IETF (RFC 4787) 定义的 NAT 行为要求 - 第 2 部分:过滤行为

作者头像
dpdk-vpp源码解读
发布2024-05-22 17:26:02
670
发布2024-05-22 17:26:02
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析
上一篇文章《IETF (RFC 4787) 定义的 NAT 行为要求 - 第 1 部

上一篇文章是关于映射出站数据包,这篇文章是关于过滤入站数据包。也就是说,上次我们讨论了 NAT 如何根据数据包的目标 IP 和目标端口值来映射/转换出站数据包的外部端口。这次,我们重点关注 NAT 在收到入站数据包时如何根据数据包的源 IP 和源端口值(上图蓝线框中的值)过滤数据包,并确定是否将其传递到内部网络。

端点无关过滤(Endpoint-Independent Filtering):这里的端点指的是外部端点。此过滤机制仅检查由外部端点发送的入站数据包的目标IP和目标端口,以决定是否放行,而不考虑外部端点的源IP或源端口号换句话说,对于入站数据包,其外部端点信息(源IP和源端口)不予考虑。

下图中,主机A向主机B发送数据包时,会生成以下绑定和过滤表项:

  • 绑定条目:{内部 IP : 内部端口} <-> {外部 IP : 外部端口} = {10.1.1.1:5000} <-> {5.5.5.1 : 1000}
  • 过滤条目:如果入站数据包 {任何 IP : 任何端口} 到 {5.5.5.1 : 1000}则允许

只要主机 B 或主机 C 发送到主机 A 的任何入站数据包的目标 IP 和目标端口为 5.5.5.1 和 1000,NAT 就会传递由主机 B 或主机 C 发送到主机 A 的任何入站数据包,无论其源 IP(1.1.1.1 或 2.2.2.2)或源端口( 80 或 8080)。

在VPP的NAT-EI模式中,我们查询过会话表i2o及o2i表的信息。其中i2o就是绑定条目,o2i就是过滤条目。VPP中的NAT-EI模式是基于报文Sip+Sport+协议号及Vrf-id来映射外部ip及端口号。

代码语言:javascript
复制
NAT-ei是根据报文三元组+fib索引查询的。下面是nat-ei模式下查询nat回话显示
+++++show nat44 ei sessions detail查询其中一条表项如下:
   i2o 172.169.1.2 proto icmp port 3 fib 0
 o2i 192.168.1.84 proto icmp port 63327 fib 0
      index 0
      last heard 4270.65
      total pkts 6890, total bytes 578760
      dynamic translation

地址相关过滤(Address-Dependent Filtering ):这里的地址是指外部端点的报文的源 IP 地址。 “地址相关过滤”仅检查外部端点发送的入站数据包的 目标 IP、目标端口 和 源 IP,以决定是否通过该数据包。它不关心外部端点的源端口的值(即任何端口都可以)。因此,只有来自外部端点(内部端点先前发送的出站数据包的目的地)的数据才会被传递。

下图中,主机A向主机B发送数据包时,会生成以下绑定和过滤表项:

  • 绑定条目:{内部 IP : 内部端口} <-> {外部 IP : 外部端口} = {10.1.1.1:5000} <-> {5.5.5.1 : 1000}
  • 过滤条目:如果入站数据包 { 1.1.1.1 : Any Port } 到 {5.5.5.1 : 1000} 则允许

NAT 会通过主机 B(源 IP=1.1.1.1)发送的入站报文(即目的 IP/目的端口=5.5.5.1/1000 的报文)。丢弃主机C发送主机A的报文。

上图红框,主机B到主机A的第二条流转换是存在问题的,转换后,端口号写的是80,应该是8080端口吧。

地址和端口相关过滤 Address and Port-Dependent Filtering :这里的地址和端口是指外部端点的地址和端口(源 IP 和源端口)。 “地址和端口相关过滤”会检查外部端点发送的入站数据包的目标 IP、目标端口、源IP和源端口,以决定是否传递该数据包。只有那些作为对内部端点先前发送的出站数据包的响应而发送的数据包(即具有所有四个匹配值的数据包)才会被传递。

下图中,主机A向主机B发送数据包时,会生成以下绑定和过滤表项:

  • 绑定条目:{内部 IP : 内部端口} <-> {外部 IP : 外部端口} = {10.1.1.1:5000} <-> {5.5.5.1 : 1000}
  • 过滤条目:如果入站数据包 { 1.1.1.1 : 80 } 到 {5.5.5.1 : 1000} 则允许。

在VPP的NAT-ED模式中,我们查询过会话表i2o及o2i表的信息。其中i20就是绑定条目,o2i就是过滤条目。VPP中的NAT-ED模式是基于报文五元组Sip+Sport+协议号+Dip+Dport及Vrf-id来映射外部ip及端口号的。下图中i2o flow描述出站时的转换关系。o2i描述入站时的过滤规则。

代码语言:javascript
复制
NAT44 ED是根据报文五元组+fib索引查询的。
NAT44 ED sessions:
-------- thread 0 vpp_main: 1 sessions --------
   i2o 172.169.1.2 proto ICMP port 5 fib 0
   o2i 192.168.1.84 proto ICMP port 63327 fib 0
      external host 114.114.114.114:5
      i2o flow: match: saddr 172.169.1.2 sport 5 daddr 114.114.114.114 dport 5 proto ICMP fib_idx 0 rewrite: saddr 192.168.1.84 daddr 114.114.114.114 icmp-id 63327 txfib 0
      o2i flow: match: saddr 114.114.114.114 sport 63327 daddr 192.168.1.84 dport 63327 proto ICMP fib_idx 0 rewrite: daddr 172.169.1.2 icmp-id 5 txfib 0
      index 0
      last heard 14833.22
      total pkts 54, total bytes 4536
      dynamic translation

Hairpinning Behavior: Hairpinning 功能使得处在同一NAT内部的两个终端能够直接相互通讯,打破了传统NAT的限制。一个典型的应用场景便是Skype,它允许两台移动设备即便身处各自的3G/LTE网络环境——这些网络广泛采用了大规模NAT(LSN,也被称作运营商级NAT, CGN)——也能实现顺畅的通信。Hairpinning 的运作模式可细分为两种不同类型:

  • 外部源 IP 地址和端口

考虑主机 A 发送到主机 B(并由 NAT 接收)的以下数据包:

  • 目标 IP = 主机 B 的外部地址 (5.5.5.2)
  • 目标端口 = 主机 B 的外部端口 (1001)
  • 源IP = 主机A的内部地址(10.1.1.1)
  • 源端口=主机A的内部端口(5000)

当NAT收到报文后,根据绑定表进行如下修改后将报文传递给Host B。这里需要注意的是,现在使用主机A的外部地址和端口作为源IP和源端口。

  • 目标IP =主机B的内部地址(10.1.1.2)
  • 目标端口 = 主机 B 的内部端口 (5001)
  • 源 IP =主机 A 的外部地址 (5.5.5.1)
  • 源端口=主机A的外部端口(1000)

上述情况可以认为是一种理想的 NAT 行为,主机 A(发送方)收到来自数据包的目的 IP/端口(5.5.5.2/1001)的响应数据包(源 IP/端口=5.5.5.2/1001)它早些时候发送的。这样一来,两人的沟通就没有问题了。

尽管下图中主机 A 和主机 B 具有不同的外部地址(5.5.5.1 和 5.5.5.2),但根据 NAT 的行为方式,它们可能具有相同的值。

  • 内部源 IP 地址和端口 再次考虑主机 A 发送到主机 B(并由 NAT 接收)的相同数据包。当NAT收到报文后,根据绑定表进行如下修改后将报文传递给Host B。与之前的数据包不同的是,现在使用主机A的内部地址和端口作为源IP和源端口。
  • 目标IP =主机B的内部地址(10.1.1.2)
  • 目标端口 = 主机 B 的内部端口 (5001)
  • 源IP =主机A的内部地址(10.1.1.1)
  • 源端口=主机A的内部端口(5000)

在这种情况下,主机A(发送方)收到响应数据包(源IP/端口=10.1.1.2/5001),该响应数据包不是来自其先前发送的数据包的目标IP/端口(5.5.5.2/1001)。因此,数据包在内核的 TCP/IP 堆栈中被丢弃。

总结,本文详细阐述了网络地址转换(NAT)设备的过滤行为规范,依据IETF的RFC 4787标准。重点讨论了针对入站数据包,NAT如何基于源IP和源端口进行过滤,并决定是否转发至内部端点。其中,"Endpoint-Independent Filtering"是一个关键概念,它仅检查入站数据包的目的IP和目的端口,忽略源IP和源端口,允许任何外部源的响应到达已建立通信的内部端点。文章还提及,这种过滤行为对支持P2P通信至关重要,影响着应用透明度和是否需要借助中继服务器(如TURN服务器)进行通信。此外,文章简述了“Hairpinning”现象,即NAT使同一NAT后的两个内部端点能通过NAT相互通讯的能力,这对于现代通信应用如Skype尤为重要,尤其是在大型NAT(LSN/CGN)环境下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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