NAT44-ED features及节点图

VPP配置SNAT,内网接口GigabitEthernet2/0/0,外网接口GigabitEthernet3/0/0,NAT之后的地址为GigabitEthernet3/0/0接口的地址。

vpp# set interface state GigabitEthernet2/0/0 up
vpp# set interface state GigabitEthernet3/0/0 up
vpp#
vpp# set interface ip address GigabitEthernet2/0/0 30.1.1.1/24
vpp# set interface ip address GigabitEthernet3/0/0 192.168.1.203/24
vpp#
vpp# nat44 plugin enable
vpp# set interface nat44 in GigabitEthernet2/0/0 out GigabitEthernet3/0/0
vpp# nat44 add interface address GigabitEthernet3/0/0

NAT44-ED插件使用的feature和node节点如下。

ip4-output:ip4-sv-reassembly-output-feature nat44-ed-in2out-output nat44-in2out-output-worker-handoff  nat-pre-in2out-output  ip4-unicast:ip4-sv-reassembly-feature nat44-ed-out2innat44-ed-in2outnat44-out2in-worker-handoff   nat44-in2out-worker-handoff nat44-handoff-classify nat44-ed-classifynat-pre-out2in nat-pre-in2out

nat44-ed处理节点流程如下。VPP配置了多个worker线程的话,需要nat44-in2out-worker-handoff和nat44-out2in-worker-handoff节点;否则,使用nat-pre-in2out和nat-pre-out2in节点。

         |-----------------------|| ip4-input-no-checksum ||-----------------------|||---------------------------|      GigabitEthernet3/0/0     |-----------------------------|| ip4-sv-reassembly-feature |-------------------------------| nat44-out2in-worker-handoff | |                           |                               |     /  nat-pre-out2in       ||---------------------------|                               |-----------------------------|
GigabitEthernet2/0/0 |                                                          ||-----------------------------|                                   |-----------------|| nat44-in2out-worker-handoff |                                   | nat44-ed-out2in ||     /  nat-pre-in2out       |                                   |                 ||-----------------------------|                                   |-----------------||                                                            ||-------------------|  nonexist |----------------------------|        ||  nat44-ed-in2out  |-----------|  nat44-ed-in2out-slowpath  |        ||-------------------|           |----------------------------|        |
existing session   |                                   |                        ||                                   |                        ||----------------|                          |                        ||   ip4-lookup   |--------------------------|------------------------||----------------|

一. 报文重组功能

IP报文分片之后,仅在第一个分片中可见4层的端口号信息,对于后续分片由于没有端口号,将不能进行NAT操作,所以需要IP报文重组功能。在ARC集合ip4-unicast中,nat-pre-in2out和nat-pre-out2in都是位于ip4-sv-reassembly-feature之后,报文先经过重组处理。

VNET_FEATURE_INIT (nat_pre_in2out, static) = {.arc_name = "ip4-unicast",.node_name = "nat-pre-in2out",.runs_after = VNET_FEATURES ("acl-plugin-in-ip4-fa","ip4-sv-reassembly-feature"),
};
VNET_FEATURE_INIT (nat_pre_out2in, static) = {.arc_name = "ip4-unicast",.node_name = "nat-pre-out2in",.runs_after = VNET_FEATURES ("acl-plugin-in-ip4-fa","ip4-dhcp-client-detect","ip4-sv-reassembly-feature"),
};

节点nat_pre_nat的下一个节点索引默认为NAT_NEXT_IN2OUT_ED_FAST_PATH,对应于节点nat44-ed-in2out。

VLIB_NODE_FN (nat_pre_in2out_node)(vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
{return nat_pre_node_fn_inline (vm, node, frame,NAT_NEXT_IN2OUT_ED_FAST_PATH);
}

在函数nat_pre_node_fn_inline中,主要的工作就是记录ARC集合的下一个节点索引,记录在报文接口的nat.arc_next中,以便在NAT44模块处理完成之后,继续ARC集中的处理流程。通常情况下一个feature为ip4-lookup。

static inline uword
nat_pre_node_fn_inline (vlib_main_t *vm, vlib_node_runtime_t *node,vlib_frame_t *frame, u32 def_next)
{while (n_left_from > 0) {vlib_buffer_t *b0;b0 = *b;b++;next0 = def_next;vnet_feature_next (&arc_next0, b0);vnet_buffer2 (b0)->nat.arc_next = arc_next0;n_left_from--;next[0] = next0;next++;}

二. NAT44模块使能

对应命令nat44 plugin enable。如果VPP配置的worker线程数量大于1,需要创建frame_queue队列,在worker线程之间传递报文,保证同一个会话流在同一个worker上处理,避免使用锁。内网接口和外网接口分别注册fq_in2out_index和fq_out2in_index为索引的队列,对应node节点nat44-ed-in2out和nat44-ed-out2in。

int nat44_plugin_enable (nat44_config_t c)
{snat_main_t *sm = &snat_main;if (sm->num_workers > 1) { vlib_main_t *vm = vlib_get_main ();vlib_node_t *node;if (sm->fq_in2out_index == ~0) { node = vlib_get_node_by_name (vm, (u8 *) "nat44-ed-in2out");sm->fq_in2out_index = vlib_frame_queue_main_init (node->index, sm->frame_queue_nelts);} if (sm->fq_out2in_index == ~0) { node = vlib_get_node_by_name (vm, (u8 *) "nat44-ed-out2in");sm->fq_out2in_index = vlib_frame_queue_main_init (node->index, sm->frame_queue_nelts);} 

三. NAT44接口

设置接口的inside/outside属性。首先,判断如果接口已经在nat44的接口中,并且接口的inside/outside属性没有改变,结束处理。

int nat44_ed_add_interface (u32 sw_if_index, u8 is_inside)
{snat_main_t *sm = &snat_main;nat_fib_t *outside_fib;snat_interface_t *i;i = nat44_ed_get_interface (sm->interfaces, sw_if_index);if (i){if ((nat44_ed_is_interface_inside (i) && is_inside) ||(nat44_ed_is_interface_outside (i) && !is_inside))return 0;

否则,这里是要修改接口的inside/outside属性,分两种情况。第一,worker线程数量大于1,接口从inside修改为outside,需要删除nat44-in2out-worker-handoff;否则,删除nat44-out2in-worker-handoff。

第二,worker线程小于等于1,接口从inside修改为outside,需要删除nat-pre-in2out,否则,删除nat-pre-out2in。

最后,开启ip4-sv-reassembly-feature,如果已经开启,增加引用计数。并且,删除记录下来的接口旧的feature,使能新的feature。以上提到的这些feature都位于ARC集合ip4-unicast。

      if (sm->num_workers > 1) {del_feature_name = !is_inside ? "nat44-in2out-worker-handoff" :"nat44-out2in-worker-handoff";feature_name = "nat44-handoff-classify";} else {del_feature_name = !is_inside ? "nat-pre-in2out" : "nat-pre-out2in";feature_name = "nat44-ed-classify";}rv = ip4_sv_reass_enable_disable_with_refcnt (sw_if_index, 1);if (rv)return rv;vnet_feature_enable_disable ("ip4-unicast", del_feature_name, sw_if_index, 0, 0, 0);vnet_feature_enable_disable ("ip4-unicast", feature_name, sw_if_index, 1, 0, 0);}

以下处理nat44模块中从未添加过此接口的情况。在worker线程数量大于1时,对于inside接口,使能nat44-in2out-worker-handoff;对于outside接口,使能nat44-out2in-worker-handoff。

使能报文重组feature:ip4-sv-reassembly-feature。将接口添加到nat44模块的接口池中(sm->interfaces)。

  else {if (sm->num_workers > 1)feature_name = is_inside ? "nat44-in2out-worker-handoff" : "nat44-out2in-worker-handoff";elsefeature_name = is_inside ? "nat-pre-in2out" : "nat-pre-out2in";nat_validate_interface_counters (sm, sw_if_index);rv = ip4_sv_reass_enable_disable_with_refcnt (sw_if_index, 1);if (rv) return rv;vnet_feature_enable_disable ("ip4-unicast", feature_name, sw_if_index, 1, 0, 0);pool_get (sm->interfaces, i);i->sw_if_index = sw_if_index;i->flags = 0;}

如下命令显示nat44模块的接口池内容:

vpp# show nat44 interfaces
NAT44 interfaces:GigabitEthernet2/0/0 inGigabitEthernet3/0/0 out

四. nat44添加地址

分配snat_address_resolve_t地址结构,记录接口索引等。

int 
nat44_ed_add_interface_address (u32 sw_if_index, u8 twice_nat)
{   snat_main_t *sm = &snat_main;ip4_main_t *ip4_main = sm->ip4_main;ip4_address_t *first_int_addr;snat_address_resolve_t *ap;vec_add2 (sm->addr_to_resolve, ap, 1);ap->sw_if_index = sw_if_index;ap->is_twice_nat = twice_nat;ap->is_resolved = 0;

获取接口的首个IP地址,添加到nat44的地址池中。添加成功之后,设置is_resolved为真。

  first_int_addr = ip4_interface_first_address (ip4_main, sw_if_index, 0);if (first_int_addr) {rv = nat44_ed_add_address (first_int_addr, ~0, twice_nat);if (0 != rv) {nat44_ed_del_addr_resolve_record (sw_if_index, twice_nat);return rv;}ap->is_resolved = 1;}

这里不涉及两次NAT的情况,twice_nat为false。添加的地址保存在nat44模块的addresses地址向量中,先检测其中是否已有此地址,避免重复添加。

int
nat44_ed_add_address (ip4_address_t *addr, u32 vrf_id, u8 twice_nat)
{snat_main_t *sm = &snat_main;snat_address_t *ap, *addresses;addresses = twice_nat ? sm->twice_nat_addresses : sm->addresses;// check if address already existsvec_foreach (ap, addresses) {if (ap->addr.as_u32 == addr->as_u32) {nat_log_err ("address exist");return VNET_API_ERROR_VALUE_EXIST;}}

在addresses向量中分配新成员,填入新地址。

  if (twice_nat)vec_add2 (sm->twice_nat_addresses, ap, 1);elsevec_add2 (sm->addresses, ap, 1);ap->addr_len = ~0;ap->fib_index = ~0;ap->addr = *addr;

五. 节点流程

测试VPP配置了2个worker线程。如下,thread2在inside接口GigabitEthernet2/0/0接收到ICMP请求报文,不是IP分片,节点nat44-in2out-worker-handoff通过处理,将报文handoff到thread1。

------------------- Start of thread 2 vpp_wk_1 -------------------
Packet 2
00:06:05:665438: dpdk-inputGigabitEthernet2/0/0 rx queue 1ICMP: 30.1.1.2 -> 192.168.12.254ICMP echo_request checksum 0x4bde id 1
00:06:05:665440: ethernet-inputIP4: 50:7b:9d:c7:03:73 -> 00:60:e0:65:b5:c7
00:06:05:665440: ip4-input-no-checksumICMP: 30.1.1.2 -> 192.168.12.254ICMP echo_request checksum 0x4bde id 1
00:06:05:665441: ip4-sv-reassembly-feature[not-fragmented]
00:06:05:665441: nat44-in2out-worker-handofffragment id 0x3b72NAT44_IN2OUT_WORKER_HANDOFF : next-worker 1 trace index 1

以上通过frame-queue:fq_in2out_index,将报文handoff到了thread1的nat44-ed-in2out节点。对于第一个报文,session并不存在,需要进入慢速节点处理:nat44-ed-in2out-slowpath。

------------------- Start of thread 1 vpp_wk_0 -------------------
Packet 2
00:06:05:665444: handoff_traceHANDED-OFF: from thread 2 trace index 1
00:06:05:665444: nat44-ed-in2outNAT44_IN2OUT_ED_FAST_PATH: sw_if_index 5, next index 3search key local 30.1.1.2:1 remote 192.168.12.254:1 proto ICMP fib 0 thread-index 0 session-index 0
00:06:05:665447: nat44-ed-in2out-slowpathNAT44_IN2OUT_ED_SLOW_PATH: sw_if_index 5, next index 10, session 4, translation result 'success' via i2ofi2of match: saddr 30.1.1.2 sport 1 daddr 192.168.12.254 dport 1 proto ICMP fib_idx 0 rewrite: saddr 192.168.12.12 daddr 192.168.12.254 icmp-id 28931 txfib 0o2if match: saddr 192.168.12.254 sport 28931 daddr 192.168.12.12 dport 28931 p
roto ICMP fib_idx 0 rewrite: daddr 30.1.1.2 icmp-id 1 txfib 0
00:06:05:665453: ip4-lookupfib 0 dpo-idx 3 flow hash: 0x00000000ICMP: 192.168.12.12 -> 192.168.12.254

另外,对于由外到内的报文,即由GigabitEthernet3/0/0接口接收的报文。节点nat44-out2in-worker-handoff匹配到session,并且session位于thread1,即当前的thread,不需要handoff处理;也不需要进入慢速路径节点nat44-ed-out2in-slowpath。

------------------- Start of thread 1 vpp_wk_0 -------------------
Packet 14
00:06:10:263962: ip4-input-no-checksumICMP: 192.168.12.254 -> 192.168.12.12ICMP echo_reply checksum 0xe2da id 28931
00:06:10:263962: ip4-sv-reassembly-feature[not-fragmented]
00:06:10:263963: nat44-out2in-worker-handoffNAT44_OUT2IN_WORKER_HANDOFF : next-worker 1 trace index 13
00:06:10:263965: nat44-ed-out2inNAT44_OUT2IN_ED_FAST_PATH: sw_if_index 6, next index 10, session 4, translation result 'success' via o2ifi2of match: saddr 30.1.1.2 sport 1 daddr 192.168.12.254 dport 1 proto ICMP fib_idx 0 rewrite: saddr 192.168.12.12 daddr 192.168.12.254 icmp-id 28931 txfib 0o2if match: saddr 192.168.12.254 sport 28931 daddr 192.168.12.12 dport 28931 p
roto ICMP fib_idx 0 rewrite: daddr 30.1.1.2 icmp-id 1 txfib 0search key local 192.168.12.254:28931 remote 192.168.12.12:28931 proto ICMP fib 0 thread-index 0 session-index 0no reason for slow path
00:06:10:263966: ip4-lookupfib 0 dpo-idx 4 flow hash: 0x00000000ICMP: 192.168.12.254 -> 30.1.1.2ICMP echo_reply checksum 0x53dd id 1
00:06:10:263967: ip4-rewritetx_sw_if_index 5 dpo-idx 4 : ipv4 via 30.1.1.2 GigabitEthernet2/0/0: mtu:9000 next:3 flags:[] 507b9dc703730060e065b5c70800 flow hash: 0x0000000000000000: 507b9dc703730060e065b5c708004500003cb15400003f01ddc3c0a80cfe1e0100000020: 0102000053dd0001017e6162636465666768696a6b6c6d6e6f707172
00:06:10:263968: GigabitEthernet2/0/0-output

对于由GigabitEthernet2/0/0接口接收的第二个icmp请求报文,由于session已经存在,也不再需要进入慢速路径节点。由于报文被网卡送到了thread2线程,这里显示为handoff之后的处理。

------------------- Start of thread 1 vpp_wk_0 -------------------
Packet 13
00:06:10:263324: handoff_traceHANDED-OFF: from thread 2 trace index 5
00:06:10:263324: nat44-ed-in2outNAT44_IN2OUT_ED_FAST_PATH: sw_if_index 5, next index 10, session 4, translation result 'success' via i2ofi2of match: saddr 30.1.1.2 sport 1 daddr 192.168.12.254 dport 1 proto ICMP fib
_idx 0 rewrite: saddr 192.168.12.12 daddr 192.168.12.254 icmp-id 28931 txfib 0o2if match: saddr 192.168.12.254 sport 28931 daddr 192.168.12.12 dport 28931 proto ICMP fib_idx 0 rewrite: daddr 30.1.1.2 icmp-id 1 txfib 0lookup skipped - cached session index used
00:06:10:263327: ip4-lookupfib 0 dpo-idx 6 flow hash: 0x00000000ICMP: 192.168.12.12 -> 192.168.12.254ICMP echo_request checksum 0xdada id 28931

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(qt图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知…

Leetcode刷题笔记题解(C++):LCR 174. 寻找二叉搜索树中的目标节点

思路:二叉搜索树的中序遍历是有序的从大到小的,故得出中序遍历的结果,即要第cnt大的数为倒数第cnt的数 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeN…

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下&#xff0c;WordPress前端和后台页面顶部都有一个“管理工具栏”&#xff0c;左侧一般就是站点名称、评论、新建&#xff0c;右侧就是您好&#xff0c;用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢&#xff1f; 其实&#xff0c…

力扣746. 使用最小花费爬楼梯

动态规划 思路&#xff1a; 定义 dp[i] 为到达下标 i 层的最小花费&#xff1b;则状态转移方程为&#xff1a; 第 i 层可以从第 i - 1 层爬一层或者第 i - 2 层爬两层到达&#xff1b;则 dp[i] std::min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2])初始状态&#xff1a…

编程笔记 html5cssjs 050 CSS表格2-1

编程笔记 html5&css&js 050 CSS表格2-1 一、表格边框二、全宽表格三、合并表格边框四、表格宽度和高度五、水平对齐六、垂直对齐七、表格内边距八、可悬停表格九、条状表格十、表格颜色十一、响应式表格十二、CSS 表格属性十三、练习小结 使用 CSS 可以极大地改善 HTML…

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…

应用层—HTTPS详解(对称加密、非对称加密、密钥……)

文章目录 HTTPS什么是 HTTPSHTTPS 如何加密HTTPS 的工作过程对称加密非对称加密 HTTPS 什么是 HTTPS HTTPS 也是一个应用层的协议。是在 HTTP 协议的基础上引入的一个加密层。 由来&#xff1a;HTTP 协议内容都是按照文本的方式明纹传输&#xff0c;这就导致在传输过程中出现…

AndroidStudio 无法打开 arb 文件

问题描述 在做Flutter国际化的时候&#xff0c;AndroidStudio突然无法打开arb文件。 原因分析&#xff1a; Android Studio 默认可能并不支持直接打开.arb文件&#xff0c;因为.arb文件通常用于Flutter的国际化资源。为了在Android Studio中编辑和查看.arb文件&#xff0c;您…

Springboot+vue的校园疫情防控系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的校园疫情防控系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的校园疫情防控系统&#xff0c;采用M&#xff…

2023年12月青少年机器人技术等级考试(四级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;四级&#xff09;理论综合试卷 单选题 第 1 题 单选题 Arduino UNO/Nano主控板&#xff0c;当数字引脚输出信号为高电平时&#xff0c;对应的电压是 &#xff1f;&#xff08; &#xff09; A.0V B.5V C.-0.5 ~ 1.5V D.3…

Web安全-CTF中的常见命令总结

Web安全-CTF中的常见命令总结 cat命令与常用选项 cat命令用于查看文件内容&#xff0c;并且将文件内容打印到标准输出流&#xff0c;并且在不跟上文件或跟上 -时将直接读取标准输入流&#xff1a; r123localhost:~$ cat - 123test 123test如上所示&#xff0c;输入123test&a…

「 论文投稿 」《IEEE Transactions on Robotics》录用经历

一、前言 小白博士期间投递的第1篇SCI&#xff0c;也是硕士课题的结尾研究&#xff0c;实验做了1个月&#xff0c;初稿写了3个月&#xff0c;感谢加拿大刘教授8个月的修改指导&#xff0c;然后投递。 二、时间轴 《IEEE Transactions on Robotics》IEEE T-RO 1. 2023年2月17日…

[SS]语义分割_转置卷积

转置卷积&#xff08;Transposed Convolution&#xff09; 抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09; 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积&#xff08;Transposed Convolution&#xff09;&#xf…

Paimon教程

教程来自尚硅谷 目录 教程来自尚硅谷1. 概述1.1 简介1.2 核心特性1.3 文件布局1.3.1 LSM Trees 2. 集成Flink2.1 安装&配置2.2 Catalog 3. 进阶使用3.1 写入性能3.1.1 并行度3.1.2 Compaction3.1.3 触发Compaction的Sorted Run数3.1.4 写入初始化3.1.5 内存 3.2 读取性能3.…

Armv8-M的TrustZone技术简介

TrustZone技术是适用于Armv8-M的可选安全扩展,旨在为各种嵌入式应用提供改进的系统安全基础。 TrustZone技术的概念并不新鲜。该技术已经在Arm Cortex-A系列处理器上使用了几年,现在已经扩展到Armv8-M处理器。 在high level上,TrustZone技术适用于Armv8-M的概念与Arm Cort…

mac 安装配置oh-my-zsh

1. 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可 安装完成查看版本 brew -v 2. 安装zsh brew install zsh 查看版本 zsh --version 3. 安装oh-my-zsh github官网链…

pve创建ubuntu cloud虚拟机模版

使用命令创建虚拟机 pve主机中执行命令 # 下载ubuntu22 cloudimg镜像文件 wget https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img# 定义虚拟机id为9001 VM_ID9001# 创建2核2G的虚拟机 qm create $VM_ID --memory 2048 --core…

【Linux系统编程】进程优先级

文章目录 1. 优先级的基本概念2. 为什么存在优先级3. 查看系统进程4. PRI and NI5. top命令修改已存在进程的nice值6. 其他概念 1. 优先级的基本概念 本篇文章讲解进程优先级&#xff0c;首先我们来了解一下进程优先级的概念&#xff1a; cpu资源分配的先后顺序&#xff0c;就…

[娱乐]索尼电视安装Kodi

索尼电视不能直接apk安装kodi应用 android studio安装后附带 abd&#xff0c; 路径 C:\Users\[yourname]\AppuoData\Local\Android\Sdk\platform-tools\adb.exe安卓电视点击内部版本号&#xff0c;启用开发者模式 adb 连接索尼安卓电视&#xff0c;记得电视上运行调试 abi选…