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 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
