zl程序教程

您现在的位置是:首页 >  其他

当前栏目

learning: nat 插件说明(1)

2023-02-19 12:21:05 时间

本文内容是基于vpp maste分支(22.02版本)进行验证和分析,Nat模块应该是vpp代码变更比较大的模块,但相对以往版本更加容易阅读和理解了;而且还增加一个cnat的插件主要是在云环境中使用的。建议在阅读nat模块前,详细了解一下nat的基本概念及发展历史,建议重点阅读一下文章参考资料中的2,5,6,对理解vpp nat实现有一定的帮助。

先声明一下:本人也是第一次阅读nat模块,对nat的知识也了解比较少,如有错误之处,请谅解。

VPP Nat相关简介

阅读vpp nat模块简介《https://wiki.fd.io/view/VPP/NAT》可以了解到nat模块相关功能的使用场景及目前已经支持的程度,这里不再说明了。 首先来看一下nat代码目录结构及特性介绍:

├── CMakeLists.txt  #nat插件编译文件
├── det44   #确定性nat模块
├── dslite  #ipv4向ipv6过渡使用的技术,不太了解,后续慢慢研究吧
├── extras  #主要是一些测试脚本
├── FEATURE.yaml #nat特性介绍
├── lib     #nat基础库
├── nat44-ed #关心对端地址和端口转换模式,默认nat模式,五元组+fib index 模式
├── nat44-ei #不关心对端地址和端口转换模式,也就是三元组+fib index nat
├── nat64 # ipv6和ipv4之间nat转换
├── nat66 #ipv6 nat
└── pnat  #Policy 1:1 NAT,待研究

关于nat44的命令行配置新版本也是有点晕,先介绍说一下特性介绍:

name: Network Address Translation
maintainer:
  - Ole Troan <ot@cisco.com>
  - Filip Varga <fivarga@cisco.com>
features:
  - NAT44-EI - IPv4 Endpoint Independent NAT
      - 1:1 NAT
      - 1:1 NAT with ports
      - VRF awareness
      - Multiple inside interfaces
      - Hairpinning
      - IPFIX
      - Syslog
      - TCP MSS clamping
      - Local bypass (DHCP)
  - NAT44-ED - IPv4 Endpoint Dependent NAT
      - 1:1 NAT
      - 1:1 NAT with ports
      - VRF awareness
      - Multiple inside interfaces
      - Hairpinning
      - IPFIX
      - Syslog
      - TCP MSS clamping
      - Local bypass (DHCP)
  - DET44 - deterministic NAT (CGN)
  - NAT64
  - NAT66
  - DSLITE
  - 464XLAT
description: "网络地址转换(NAT)插件提供了一个多地址转换功能。"
 "这些可以在许多不同的场景中使用。CPE、CGN等等"
state: production #这个状态没有明白具体是什么阶段。
properties: [API, CLI, STATS, MULTITHREAD]

主要是Nat44-ei和nat44-ed的,个人觉得主要是两种nat类型吧。nat44-ei应该是锥形nat,nat44-ed是对称型nat吧。下图显示了RFC 5780中定义的九种NAT类型和RFC 3489中定义的四种NAT类型,以及RFC 3489中的NAT类型如何与RFC 5780中的对应类型匹配。

图片来源于https://netmanias.com/en/post/techdocs/6065/nat-network-protocol/stun-rfc-3489-vs-stun-rfc-5389-5780

Endpoint-Independent Mapping(不关心对端地址和端口转换模式):只要是来自相同源地址和源端口号的报文,不论其目的地址是否相同,通过PAT映射后,其源地址和源端口号都被转换为同一个外部地址和端口号,该映射关系会被记录下来并生成一个EIM表项;并且NAT设备允许所有外部网络的主机通过该转换后的地址和端口来访问这些内部网络的主机。这种模式可以很好的支持位于不同NAT网关之后的主机进行互访。

set interface nat44 ei in <intfc> out <intfc> [output-feature] [del]

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 and Port-Dependent Mapping(关心对端地址和端口转换模式):对于来自相同源地址和源端口号的报文,相同的源地址和源端口号并不要求被转换为相同的外部地址和端口号,若其目的地址或目的端口号不同,通过PAT映射后,相同的源地址和源端口号通常会被转换成不同的外部地址和端口号。与Endpoint-Independent Mapping模式不同的是,NAT设备只允许这些目的地址对应的外部网络的主机可以通过该转换后的地址和端口来访问这些内部网络的主机。这种模式安全性好,但由于同一个内网主机地址转换后的外部地址不唯一,因此不便于位于不同NAT网关之后的主机使用内网主机转换后的地址进行互访。

set interface nat44 in <intfc> out <intfc> [output-feature] [del]

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

PNAT说明

在nat目录下有个Pnat功能,目前还处于试验设计阶段,特性描述如下:

name: Policy 1:1 NAT
maintainer: Ole Troan <ot@cisco.com>
description: "Match packet against rule and translate according to given instructions.
              Rules are kept in a flow cache bihash. Instructions in a pool of translation entries.

              For a given interface/direction all rules must use the same lookup mask. E.g. SA + SP.

              A dynamic NAT would punt to slow path on a miss in the flow cache, in this case the miss behaviour is configurable.
              Default behaviour is pass packet along unchanged."
state: experimental
properties: [API, CLI, MULTITHREAD]

根据规则(指定接口+报文五元组)匹配数据包,并根据下发配置进行Nat转换。规则保存在流缓存bihash表中。nat转换条目池中的说明。对于给定的接口/方向,所有规则必须使用相同的查找掩码。例:SA + SP。 在流缓存中,一个动态NAT会在未命中时减慢路径,在这种情况下,未命中行为是可配置的。缺省行为是不加修改地传递数据包。

对应的命令行如下(后续再详细研究):

 set pnat translation interface <name> match <5-tuple> rewrite <tuple> {in|out} [del]

CNAT说明

这个插件目前还出于开发阶段,旨在补充Nat模块在云场景的应用, 它允许基于多个标准的源/目的地址/端口转换。它的目的是足够模块化,这样人们就可以编写一个用例优化的转换函数,而不必实际地重写包或维护会话。这个插件支持多线程。worker共享一个存放会话的独特bihash。

name: Cloud NAT
maintainer: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
features:
  - Destination based address/port translation
  - Conditional sourceNATing based on prefix exclusions

description: "This plugin is intended to complement the VPP's plugin_nat for
              Cloud use-cases. It allows for source/destination address/port
              translation based on multiple criterias. It is intended to be modular
              enough so that one could write a use-case optimised translation function
              without having to deal with actually re-writing packets or maintaining
              sessions.
              This plugin supports multithreading. Workers share a unique bihash where
              sessions are stored."
state: development
properties: [API, CLI, MULTITHREAD]

下面给出cnat相关的几个命令行,(具体使用后续再研究)

cnat translation [add|del] proto [TCP|UDP] [vip|real] [ip|sw_if_index [v6]] [port] [to [ip|sw_if_index [v6]] [port]->[ip|sw_if_index [v6]] [port]]
set cnat snat-policy [none][if-pfx][k8s]

参考资料

1、Vpp官方所有模块命令行介绍 https://s3-docs.fd.io/vpp/22.02/cli-reference/clis/clicmd_src_plugins_nat_nat44-ed.html 2、stun协议解析 https://blog.csdn.net/momo0853/article/details/105387675 3、linux内核Netflix模块解读 https://blog.csdn.net/momo0853/article/details/105387675 4、阿里云nat网关相关介绍: https://help.aliyun.com/product/44413.html?spm=5176.19917563.J_5253785160.8.7aa3528bvD7DFK 5、NAT基础原理详解 https://blog.csdn.net/freeking101/article/details/77962312 6、H3c Nat防火墙处理顺序 https://blog.csdn.net/phoenixbleed/article/details/89401381 7、Nat46介绍 https://zhuanlan.zhihu.com/p/80052746