IPVlan 详解
文章目录
- 简介
- Ipvlan2
- 同节点 Ns 互通
- Ns 内与宿主机 通信
- 第三种方法
- Ns 到节点外部
- 结论
- Ipvlan3
- 1. 同节点 Ns 互通
- Ns 内与宿主机 通信
- Ns 内到外部网络
- 总结
- 源码分析
- ipvlan 收包流程
- 收包流程
主要探讨使用 ipvlan 为 cni 通过虚拟网卡的实现。
简介
ipvlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。唯一比较大的区别就是 ipvlan 虚拟出的子接口都有相同的 mac地址(与物理接口共用同个 mac 地址),但可配置不同的 ip 地址。由于所有的虚拟接口共享同个mac地址,因此有些地方需要注意:当使用 DHCP 协议分配 ip 时,一般会用 mac 地址作为机器的标识,因此需要配置唯一的 ClientID 字段作为机器的标识, DHCP server 配置 ip 时需使用该字段作为机器标识,而不是使用 mac 地址。
两种工作模式
ipvlan 有两种不同的工作模式:L2 和 L3。一个父接口只能选择其中一种模式(不能采用混用模式),依附于它的所有虚拟接口都会运行在这个模式下。
1、L2 模式
Ipvlan 的 L2 模式和 macvlan 的 bridge 模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。
2、L3 模式
L3 模式下,ipvlan 有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相 ping 通对方,因为 ipvlan 会在中间做报文的转发工作。该模式把宿主接口当成一个路由器,完全不支持广播,这个模式下的接口也比l2模式下的ipvlan接口多了一个 NOARP属性,也不会发送广播报文
Ipvlan2
同节点 Ns 互通

// 创建 netns, 创建 ipvlan,netns 内配置 ip,link up,配置路由
ip netns add node1ns
ip link add ipvl_10_1 link ens10 type ipvlan mode l2
ip link set ipvl_10_1 netns node1ns
ip netns exec node1ns ip link set ipvl_10_1 name eth0
ip netns exec node1ns ip a a 192.168.100.101/24 dev eth0
ip netns exec node1ns ip link set lo up
ip netns exec node1ns ip link set eth0 upip netns add node1ns2
ip link add ipvl_10_1 link ens10 type ipvlan mode l2
ip link set ipvl_10_1 netns node1ns2
ip netns exec node1ns2 ip link set ipvl_10_1 name eth0
ip netns exec node1ns2 ip a a 192.168.100.102/24 dev eth0
ip netns exec node1ns2 ip link set lo up
ip netns exec node1ns2 ip link set eth0 up// 到此两个 ns 的 ip 是互通的
192.168.100.101 <--> 192.168.100.102 OK
Ns 内与宿主机 通信
因为要跟其他网段通信,配置 ns 内的路由
//配置 ns 内部下一跳 192.168.100.1,将 192.168.100.1/24 配置在 ens10 网卡上
ip netns exec node1ns ip r add default via 192.168.100.1
ip netns exec node1ns2 ip r add default via 192.168.100.1
第一种方法

将 192.168.100.1/24 配置在 ens10 网卡上
ip a a 192.168.100.1/24 dev ens10192.168.100.101 <--> 172.18.22.114 OK
第二种方法

将 192.168.100.1/24 配置在 ens10 网卡上//在 宿主机上配置到 ns ip 的 路由
ip link add ipvl_10 link ens10 type ipvlan mode l2
ip link set ipvl_10 up
ip a a 192.168.100.1/32 dev ipvl_10
ip route add 192.168.100.101/32 dev ipvl_10
ip route add 192.168.100.102/32 dev ipvl_10
第三种方法

// 在 ns 中配置宿主机 ip 的路由
ip netns exec node1ns ip r add 172.18.22.0/24 dev eth0
ip netns exec node1ns2 ip r add 172.18.22.0/24 dev eth0ens10 不配置 ip,在 ipvl_10 配置 宿主机的 ip
ip a a 172.18.22.114/32 dev ipvl_10
Ns 到节点外部
- 上面第一种和第二种,将 ns 内部下一跳 ip 放到网卡上的情况,会匹配宿主机路由,从 ens3 出,需要配置 snat。
$ iptables -t nat -A POSTROUTING -s 192.168.100.101/24 -j SNAT --to 172.18.22.114
- 上面第三种,ns 内部下一跳 ip 在宿主机外部的情况,会直接从 ens10 出。
结论
保证业务流量走业务网卡,使用第三种方法实现 host 到 ns 的通信,将 需要通信的 host IP 配置到 业务网卡上,其他流量默认从业务网卡出。
Ipvlan3
1. 同节点 Ns 互通

// 创建 netns, 创建 ipvlan,netns 内配置 ip,link up,配置路由
ip netns add node2ns
ip link add ipvl_10_1 link ens10 type ipvlan mode l3
ip link set ipvl_10_1 netns node2ns
ip netns exec node2ns ip link set ipvl_10_1 name eth0
ip netns exec node2ns ip a a 192.168.100.201/24 dev eth0
ip netns exec node2ns ip link set lo up
ip netns exec node2ns ip link set eth0 up
ip netns exec node2ns ip r add default dev eth0ip netns add node2ns2
ip link add ipvl_10_1 link ens10 type ipvlan mode l2
ip link set ipvl_10_1 netns node2ns2
ip netns exec node2ns2 ip link set ipvl_10_1 name eth0
ip netns exec node2ns2 ip a a 192.168.200.201/24 dev eth0
ip netns exec node2ns2 ip link set lo up
ip netns exec node2ns2 ip link set eth0 up
ip netns exec node2ns2 ip r add default dev eth0// 到此两个 ns 的 ip 是互通的
192.168.100.201 <--> 192.168.200.201 OK
Ns 内与宿主机 通信

// 宿主机起 ipvl_10,配置需要访问的宿主机 ip,设置到 ns 的路由
ip link add ipvl_10 link ens10 type ipvlan mode l3
ip a a 172.18.22.115/32 dev ipvl_10
ip r add 192.168.100.201 dev ipvl_10
ip r add 192.168.200.201 dev ipvl_10192.168.100.201 <--> 172.18.22.115
Ns 内到外部网络
需要为 ens10 配置 ip,默认从 ens10 发出

外部回包时,需要内部网络的路由
总结
l3 mode 的 ipvlan 网卡 NOARP,不回复 arp 报文,如果外部流量访问 ipvlan 上的 ip,需要在 ens10 配置 ip,然后外部配置到 ipvlan ip 的流量下一跳到 ens10 的 ip。
源码分析
ipvlan 收包流程
ipvlan_netdev_ops 中 收包函数 ipvlan_start_xmit
int ipvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
{struct ipvl_dev *ipvlan = netdev_priv(dev);struct ipvl_port *port = ipvlan_port_get_rcu_bh(ipvlan->phy_dev);if (!port)goto out;
...
// 获取 端口模式,L2,L3 或 L3S;进行对应处理switch(port->mode) {case IPVLAN_MODE_L2:return ipvlan_xmit_mode_l2(skb, dev);case IPVLAN_MODE_L3:
#ifdef CONFIG_IPVLAN_L3Scase IPVLAN_MODE_L3S:
#endifreturn ipvlan_xmit_mode_l3(skb, dev);}
...
}
L2 mode 收包
static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
{const struct ipvl_dev *ipvlan = netdev_priv(dev);struct ethhdr *eth = skb_eth_hdr(skb);struct ipvl_addr *addr;void *lyr3h;int addr_type;// 非 vepa 且源 mac 目的 mac 相等,获取三层头指针,和类型(ipv4,arp)if (!ipvlan_is_vepa(ipvlan->port) &ðer_addr_equal(eth->h_dest, eth->h_source)) {lyr3h = ipvlan_get_L3_hdr(ipvlan->port, skb, &addr_type);if (lyr3h) {// 找到目的地址addr = ipvlan_addr_lookup(ipvlan->port, lyr3h, addr_type, true);if (addr) {// ipvlan 如果是 private 则 drop。if (ipvlan_is_private(ipvlan->port)) {consume_skb(skb);return NET_XMIT_DROP;}// ipvlan 虚拟接口收包,改 skb type 为 local,使用该目的地址的接口收包。如 1 中 netns 互通和 2 中 第三种方法。return ipvlan_rcv_frame(addr, &skb, true);}}
.../* Packet definitely does not belong to any of the* virtual devices, but the dest is local. So forward* the skb for the main-dev. At the RX side we just return* RX_PASS for it to be processed further on the stack.*/// 目的地址不是虚拟接口里的,直接物理口收包,接下来会进协议栈。如 2 中 netns 到 host 的第一,二种方法。return dev_forward_skb(ipvlan->phy_dev, skb);// 多播包,虚拟接口处理} else if (is_multicast_ether_addr(eth->h_dest)) {skb_reset_mac_header(skb);ipvlan_skb_crossing_ns(skb, NULL);ipvlan_multicast_enqueue(ipvlan->port, skb, true);return NET_XMIT_SUCCESS;}// 源目的 mac 不同,且不是多播包,直接物理网卡发出。skb->dev = ipvlan->phy_dev;return dev_queue_xmit(skb);
}
L3 mode 收包,L3 和 L3S 相同,和 L2 Mode 很像
static int ipvlan_xmit_mode_l3(struct sk_buff *skb, struct net_device *dev)
{const struct ipvl_dev *ipvlan = netdev_priv(dev);void *lyr3h;struct ipvl_addr *addr;int addr_type;lyr3h = ipvlan_get_L3_hdr(ipvlan->port, skb, &addr_type);if (!lyr3h)goto out;if (!ipvlan_is_vepa(ipvlan->port)) {addr = ipvlan_addr_lookup(ipvlan->port, lyr3h, addr_type, true);if (addr) {// ip 或 arp 三层包,且目的地址是虚拟接口的,目的地址的虚拟接口收包、if (ipvlan_is_private(ipvlan->port)) {consume_skb(skb);return NET_XMIT_DROP;}return ipvlan_rcv_frame(addr, &skb, true);}}
out:// 目的地址不是本网卡接口,交给物理口,ip_route_output_flow查找路由表,走三层转发。ipvlan_skb_crossing_ns(skb, ipvlan->phy_dev);return ipvlan_process_outbound(skb);
}
收包流程
ipvlan 收包流程
物理卡收包后的处理,分配区分 L2,L3,L3S mode
rx_handler_result_t ipvlan_handle_frame(struct sk_buff **pskb)
{struct sk_buff *skb = *pskb;struct ipvl_port *port = ipvlan_port_get_rcu(skb->dev);if (!port)return RX_HANDLER_PASS;switch (port->mode) {case IPVLAN_MODE_L2:return ipvlan_handle_mode_l2(pskb, port);case IPVLAN_MODE_L3:return ipvlan_handle_mode_l3(pskb, port);
#ifdef CONFIG_IPVLAN_L3Scase IPVLAN_MODE_L3S:return RX_HANDLER_PASS;
#endif}/* Should not reach here */WARN_ONCE(true, "%s called for mode = [%x]\n", __func__, port->mode);kfree_skb(skb);return RX_HANDLER_CONSUMED;
}
L2 mode 收包
static rx_handler_result_t ipvlan_handle_mode_l2(struct sk_buff **pskb,struct ipvl_port *port)
{struct sk_buff *skb = *pskb;struct ethhdr *eth = eth_hdr(skb);rx_handler_result_t ret = RX_HANDLER_PASS;// 多播包,ipvlan_external_frame 判断如果是本地子接口发的包,且目的 ip 不是本物理网卡和子接口的 ip,复制一份,直接物理网卡的多播队列处理。if (is_multicast_ether_addr(eth->h_dest)) {if (ipvlan_external_frame(skb, port)) {struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);/* External frames are queued for device local* distribution, but a copy is given to master* straight away to avoid sending duplicates later* when work-queue processes this frame. This is* achieved by returning RX_HANDLER_PASS.*/if (nskb) {ipvlan_skb_crossing_ns(nskb, NULL);ipvlan_multicast_enqueue(port, nskb, false);}}} else {// 单播报文,和 l3 mode 处理方法一致/* Perform like l3 mode for non-multicast packet */ret = ipvlan_handle_mode_l3(pskb, port);}return ret;
}
L3 mode 收包,该模式同样适合 l2 mode 的单播包
static rx_handler_result_t ipvlan_handle_mode_l3(struct sk_buff **pskb,struct ipvl_port *port)
{void *lyr3h;int addr_type;struct ipvl_addr *addr;struct sk_buff *skb = *pskb;rx_handler_result_t ret = RX_HANDLER_PASS;lyr3h = ipvlan_get_L3_hdr(port, skb, &addr_type);if (!lyr3h)goto out;addr = ipvlan_addr_lookup(port, lyr3h, addr_type, true);if (addr)// arp 或 ip 包,且目的地址是本网卡和子接口的,对应接口收包ret = ipvlan_rcv_frame(addr, pskb, false);out:// 其他报文走物理网卡路由return ret;
}
L3S mode
case IPVLAN_MODE_L3S:return RX_HANDLER_PASS;
直接走物理卡主机路由
相关文章:
IPVlan 详解
文章目录简介Ipvlan2同节点 Ns 互通Ns 内与宿主机 通信第三种方法Ns 到节点外部结论Ipvlan31. 同节点 Ns 互通Ns 内与宿主机 通信Ns 内到外部网络总结源码分析ipvlan 收包流程收包流程主要探讨使用 ipvlan 为 cni 通过虚拟网卡的实现。简介 ipvlan 和 macvlan 类似,…...
直播间的2个小感悟
我是卢松松,点点上面的头像,欢迎关注我哦! 在线人数固定 最近直播间出现了很多新面孔,有的是偶然刷到的,有的是关注互联网找到的。而直播间的人数一直没什么变化,卢松松在抖音直播较少,主播间…...
STM32开发(15)----芯片内部温度传感器
芯片内部温度传感器前言一、什么是内部温度传感器?二、实验过程1.STM32CubeMX配置2.代码实现3.实验结果总结前言 本章介绍STM32芯片温度传感器的使用方法和获取方法。 一、什么是内部温度传感器? STM32 有一个内部的温度传感器,可以用来测…...
Apache Hadoop生态部署-zookeeper分布式安装
目录 查看服务架构图-服务分布、版本信息 一:安装前准备 1:zookeeper安装包选择--官网下载 2:zookeeper3.5.7安装包--百度网盘 二:安装与常用配置 2.1:下载解压zk安装包 2.2:配置环境变量 2.3&#x…...
MySQL(九)
mysql的锁机制 1、MySQL锁的基本介绍 **锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一…...
Matlab 计算一条直线与一条线段的交点
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里假设一条直线的方向为 ( a , b , c ) (a,b,c) (a,b,...
Read book Netty in action(Chapter VI)--ByteBuf
序言 之前学习了传输,通过前面的学习我们都知道,网络数据的基本单位是字节。JDK中提供了ByteBuffer作为字节的容器,但是过于繁琐复杂,Netty中提供了ByteBuf作为替代品。学习一下。 API Netty的数据处理API通过两个组件暴露 ---…...
VsCode开发工具的入门及基本使用
VsCode开发工具的入门及基本使用一、VsCode介绍1.VsCode简介2.VsCode特点二、安装VsCode1.下载VsCode2.安装VsCode3.打开VsCode三、设置VsCode中文1.搜索中文语言插件2.安装中文语言插件四、初识VsCode1.VsCode左侧栏模块2.系统设置功能五、VsCode初始配置1.禁用自动更新2.开启…...
python标准库——OS模块接口详解
OS系统操作模块 os模块提供各种Python 程序与操作系统进行交互的接口 os模块是整理文件和目录最常用的模块 函数作用补充os.sep()取代操作系统特定的路径分隔符os.name()指示你正在使用的工作平台。比如对于Windows,它是nt,而对于Linux/Unix用户&…...
LeetCode 622.设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…...
OraDump导出套件
OraDump导出套件 只需单击几下即可将数据从Oracle转储文件导出到流行的数据库和格式。 OraDump Export Kit是一个将数据从Oracle转储文件导出到流行数据库和格式的软件包。该产品具有高性能,因为它直接读取转储文件。命令行支持允许编写脚本、自动化和安排转换过程。…...
CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析
漏洞概要 Spring Cloud Gateway 是Spring Cloud 生态中的API网关,包含限流、过滤等API治理功能。 Spring官方在2022年3月1日发布新版本修复了Spring Cloud Gateway中的一处代码注入漏洞。当actuator端点开启或暴露时,可以通过http请求修改路由ÿ…...
Firebase常用功能和官方Demo简介
一、Firebase简介Firebase刚开始是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。现在的Firebase算是谷歌旗下的…...
MATLAB R2020a 与PreScan8.5.0 详细安装教程(图文版)
目录MATLAB安装PreScan安装每文一语MATLAB安装 MATLAB是一款数学软件,用于科学计算、数据分析和可视化等任务。以下是MATLAB的几个优势: 丰富的工具箱:MATLAB拥有多种工具箱,包括信号处理、图像处理、优化、控制系统等࿰…...
CNI 网络流量 4.3 Calico felix
文章目录felix 太重要了,单独一文搞懂它Felix是一个守护程序,在每个 endpoints 的节点上运行。Felix 负责编制路由和 ACL 规则等,以便为该主机上的 endpoints 资源正常运行提供所需的网络连接 主要实现一下工作 管理网络接口,Feli…...
超声波风速风向传感器的通讯协议
接线定义 1 电源正 棕色线 4 风向信号 2 电源负 黑色线 5 485A 蓝色线 3 风速信号 6 485B 灰色线 ⊙寄存器参数表 地址 访问权限 参数名称 数据解析方法 0x0000 R 风速 瞬时 *100 上报 0x0001 R 风向 原数上报 0x0002 R 最大风速 *100 上报 0x0003 R 平均风速 *100 上报 0x000…...
JVM笔记(8)—— 直接内存
一、什么是直接内存 直接内存不是虚拟机运行时数据区的一部分,是在运行时数据区外、直接向系统申请的内存空间。 通常,访问直接内存的速度会优于堆,读写性能更好。因此,出于性能考虑,读写频繁的场合可能会考虑使用直…...
Unity性能优化:如何优化Drawcall
前言 降低游戏的Drawcall,是渲染优化很重要的手段,接下来从以下4个方面来分析如何降低DrawCall: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀 降低Drawcall的意义是什么?如何查看游戏的Drawca…...
类与对象(this 关键字、构造器)
目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路,解决问题,以何种形式组织代码 当解决一个问题的时候,面向对象会把事物抽象成…...
[NOIP2002 普及组] 过河卒
题目描述: 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
