0
点赞
收藏
分享

微信扫一扫

ipvlan的基本原理

大师的学徒 19小时前 阅读 1

1.ipvlan

1.1 什么是ipvlan

    IPVlan 是 Linux 内核支持的一种网络虚拟化技术,它允许在单个物理网络接口上创建多个虚拟接口,每个虚拟接口可以拥有独立的 IP 地址,但​​共享父接口的 MAC 地址​​。     IPVlan 的核心思想是利用 Linux 内核的​​网络命名空间​​实现网络环境隔离,并通过​​虚拟网络接口​​技术共享底层物理设备。     它的工作流程可以概括为:     ​​创建虚拟接口​​:在物理接口(父接口)上创建多个 IPVlan 虚拟接口(子接口)。     ​​分配至命名空间​​:将各个子接口分配到不同的网络命名空间(如不同的容器或虚拟机),实现网络隔离。     配置网络​​:为每个子接口配置独立的 IP 地址。 ​​    数据包处理​​:根据所选模式(L2 或 L3),由内核负责数据包在虚拟接口和物理接口之间的转发和路由。

1.2 ipvlan的L2/L3模式

    IPVLAN 主要有两种工作模式L2和L3,L2 和 L3 模式在协议层级、通信方式和适用场景上有着根本性的区别。

特性维度 L2 模式 L3 模式
工作层级​​ 数据链路层(二层) 网络层(三层)
类比设备​​​​ 交换机​​​​ 路由器​​
通信范围​​ 同一 IP 子网内 可跨不同 IP 子网
ARP 处理​​ 主接口代理响应 ARP 请求 虚拟接口不处理 ARP,需手动配置邻居条目
​​广播/多播​​ 支持并在同一广播域内泛洪 不处理,广播和多播流量会被丢弃
性能特点​​ 较高,数据包在二层直接转发 相对较低,需经过主机路由栈
​​配置复杂度​​ 简单,更接近传统网络 稍复杂,需关注路由配置

    (1)IPVLAN 的 L2 模式工作方式类似于一台​​交换机​​。 ​​    数据包转发​​:当数据包在虚拟接口间发送时,L2 模式会直接检查目标 MAC 地址。如果目标地址属于同一父接口下的另一个 IPVLAN 虚拟接口,数据包会在​​二层被直接转发​​,无需上升到网络层,这带来了较低的延迟。 ​​    广播与多播处理​​:L2 模式会处理广播(如 ARP 请求)和多播流量。父接口会将这类流量​​泛洪​​到所有处于 L2 模式的虚拟接口,确保它们位于同一个广播域内。 ​​    外部通信​​:当虚拟接口需要与外部网络(不同子网)通信时,数据包会通过父接口路由转发出去,此时依赖主机的路由表。     一个典型的 L2 模式配置示例如下

# 在物理接口 ens10 上创建 L2 模式的 IPVLAN 设备
ip link add link ens10 name my_ipvlan_l2 type ipvlan mode l2
ip link set my_ipvlan_l2 up

# 为虚拟接口分配同一子网的 IP 地址
ip addr add 192.168.100.101/24 dev my_ipvlan_l2

    (2)IPVLAN 的 L3 模式则更像一台​​路由器​​,基于 IP 地址进行路由决策     ​​数据包路由​​:所有进出虚拟接口的流量都会经过主机的​​网络层(三层)路由栈​​。L3 模式的虚拟接口具有 ​​NOARP​​ 特性,这意味着它们不会发送或响应 ARP 请求 。要与 L3 模式的 IPVLAN 接口通信,通常需要在通信的对端设备上​​静态配置 ARP 条目​​,或者依赖外部设备响应 ARP 。 ​​    广播与多播​​:L3 和 L3S 模式下的虚拟接口​​不接收广播或多播流量​​ 。这对于需要广播发现的协议会有影响。 ​​    L3S 模式​​:这是 L3 模式的一个变体,主要区别在于它让进出容器的流量都经过默认网络命名空间中的 netfilter(如 iptables)链,从而​​支持连接跟踪​​,提供了更强的网络控制能力,但性能开销稍大。     一个典型的 L3 模式配置和外部路由示例如下

# 创建 L3 模式的 IPVLAN 设备
ip link add link ens10 name my_ipvlan_l3 type ipvlan mode l3
ip link set my_ipvlan_l3 up
ip addr add 192.168.200.101/24 dev my_ipvlan_l3

# 在外部路由器上配置路由,指向宿主机物理接口的IP
# 例如:到达 192.168.200.0/24 的下一跳指向宿主机物理网卡地址
ip route add 192.168.200.0/24 via 192.168.100.1

    选择L2还是L3模式取决于具体需求: ​​    选择 L2 模式​​:当所有虚拟接口需要位于​​同一子网​​,要求​​高性能、低延迟​​的内部通信,且网络环境简单,不希望管理复杂的路由配置时。 ​​    选择 L3/L3S 模式​​:当虚拟接口需要位于​​不同子网​​,需要​​灵活的路由策略​​,或者网络交换机对 MAC 地址数量有严格限制时。如果还需要​​网络策略控制​​(如使用 iptables 进行精细过滤),则应选择 L3S 模式。

1.3 ipvlan的配置方法

    在一个物理网口上创建两个ipvlan子接口,并将两个ipvlan子接口分配到两个容器(或者两个网络namespace)中,命令如何写?需要使用原始linux命令不要用docker集成的命令。 (1)创建两个网络命名空间​​ 这相当于为两个“容器”创建独立的网络环境。

sudo ip netns add ns1
sudo ip netns add ns2

​​**(2)在物理网口上创建两个 IPVlan 子接口​​** 这里假设你的物理网口是 eth0。mode l2指定了 IPVlan 的工作模式为二层。

sudo ip link add link eth0 name ipvlan1 type ipvlan mode l2
sudo ip link add link eth0 name ipvlan2 type ipvlan mode l2

(3)​​将 IPVlan 子接口分别移入两个命名空间​​

sudo ip link set ipvlan1 netns ns1
sudo ip link set ipvlan2 netns ns2

​​**(4)在各自的命名空间内启动接口并配置 IP 地址​​** 需要进入每个命名空间来配置其独有的网络。

​​# 在命名空间 ns1中配置 ipvlan1:​​
sudo ip netns exec ns1 ip link set ipvlan1 up
sudo ip netns exec ns1 ip addr add 192.168.1.100/24 dev ipvlan1
​​# 在命名空间 ns2中配置 ipvlan2:​​
sudo ip netns exec ns2 ip link set ipvlan2 up
sudo ip netns exec ns2 ip addr add 192.168.1.101/24 dev ipvlan2

(5)​​测试连通性​​ 从命名空间 ns1中 ping 命名空间 ns2中的 IP 地址,验证网络是否通畅。

sudo ip netns exec ns1 ping 192.168.1.101

1.4 ipvlan的应用场景

    IPVlan 的特性使其在以下场景中非常有用: ​​    容器网络​​:在 Docker 或 Kubernetes 等容器平台上,为每个容器提供独立的网络栈和 IP 地址,同时实现高效通信和隔离。 ​​    虚拟机网络​​:为同一宿主机上的多个虚拟机提供网络连接。 ​​    多租户环境​​:在云平台中,为不同租户的实例提供逻辑隔离的网络环境。 ​​    物理服务器多 IP 配置​​:在一台物理服务器上配置多个 IP 地址,以托管多个服务或实现负载均衡。

2.ipvlan相关的几个常见问题

2.1 ipvlan与macvlan的区别

    IPVlan 常与 ​​Macvlan​​ 被一同提及。Macvlan 和 IPvlan L2 模式在提升网络性能上的核心思路是类似的:​​绕过传统的 Linux 网桥​​,让数据包在内核中的路径更短、处理更高效,从而减少不必要的开销。

    虽然目标一致,但两者的实现机制有所不同,这主要源于它们对 MAC 地址的处理方式。 ​​    Macvlan​​:每个虚拟接口都有​​独立的 MAC 地址​​。这在某些网络策略严格(如端口安全)的环境中可能会遇到问题,且不适用于无线网络。它更像是在内核中模拟了一台​​虚拟交换机​​。父接口开启混杂模式后,会接收所有数据帧。内核再根据每个虚拟接口唯一的 MAC 地址,将数据帧准确分发出去。这种方式很直观,但依赖于网络接口对大量 MAC 地址的处理能力。     ​​IPvlan L2:它则更“巧妙”一些。由于所有子接口共享一个 MAC 地址,数据包的分发不再依赖数据链路层的 MAC 地址,而是直接依赖网络层的 IP 地址。这使得它在内核中的处理流程可以更加精简,也避免了对物理网络交换机的 MAC 地址表造成压力。这解决了 Macvlan 的上述限制,在需要节省 MAC 地址或使用无线网络的场景中是更优的选择。

    IPVlan 的主要优势 ​​    高性能​​:数据包在内核层直接处理,避免了传统桥接带来的性能开销,网络吞吐量更高,延迟更低。 ​​    节省 MAC 资源​​:所有虚拟接口共享父接口的 MAC 地址,避免了交换机 MAC 地址表耗尽的问题,特别适合大规模部署。 ​​    配置简洁​​:无需配置复杂的网桥,管理更简单。 ​​    兼容无线网络​​:由于不创建新的 MAC 地址,IPVlan 可以在 802.11(Wi-Fi)无线网络环境中正常工作,而 Macvlan 则存在限制。<br>     macvlan与ipvlan如何选择     基于以上区别,在实际应用中你可以这样选择: ​​    优先考虑 Macvlan​​:你的环境需要每个容器或虚拟机都拥有​​唯一的 MAC 地址​​(例如某些特定的网络策略或服务发现机制要求如此),并且你确认所在的物理网络(特别是交换机)​​支持并能够良好处理大量的 MAC 地址​​。 ​​    优先考虑 IPvlan L2:你处于 ​​MAC 地址受限的环境​​中(例如大多数公有云平台),或者需要在使用 ​​802.11 无线网络​​的场景下部署容器网络。此外,当你希望减轻交换机 MAC 地址表的压力,或在规模较大时获得可能更稳定的表现时,IPvlan 也是很好的选择。

版本背后的故事与选择 ​​Macvlan 先行​​:linux 3.9版本引入,Macvlan 的出现更早,它提供了一种直观的方式,通过为每个虚拟接口分配唯一MAC地址,在逻辑上实现网络接口的隔离。这种方式类似于物理世界中的多块独立网卡,易于理解。 ​​IPvlan 的改进​​:linux 3.19版本引入,随着容器技术的普及,大规模部署时Macvlan的每个接口一个MAC地址的特性,可能导致交换机MAC地址表被快速填满,影响网络稳定性。IPvlan 的设计正是为了应对这一挑战,它让所有虚拟接口共享一个MAC地址,完美解决了这个问题。因此,在​​MAC地址数量受限的环境​​(如公有云虚拟机)或​​无线网络环境​​中,IPvlan 通常是比Macvlan更优的选择.

2.2 ipvlan与网口别名eth0:0有什么区别

    IPVlan 和网口别名(例如 eth0:0)虽然都能让一个物理网卡拥有多个 IP 地址,但它们的实现原理、能力和适用场景有本质区别。

特性维度 IPVlan 网口别名 (如 eth0:0)
工作原理​​ 创建​​独立的虚拟网络接口​​,拥有自己的网络栈,可放入独立的网络命名空间实现隔离 仅在物理网卡上绑定​​多个IP地址​​,所有别名​​共享​​物理网卡的网络栈和命名空间
网络隔离/互通​​​​ 支持隔离​​。不同IPVlan接口可完全隔离,也可通过特定模式(L2/L3)在虚拟接口间可控通信。 ​​无隔离​​。所有别名IP地址属于同一网络命名空间,彼此直接互通。
​​MAC地址​​​​ L2模式​​:所有虚拟接口共享父接口的MAC地址。​​L3模式​​:虚拟接口具有NOARP属性,不处理ARP。 所有别名​​共享​​物理网卡的​​同一个MAC地址​​。
​​性能特点​​ 数据包在内核层直接处理,性能较高,但引入少量虚拟化开销。​​ 几乎零开销​​。因为只是IP地址的扩展,无需额外数据包处理。
主要应用场景​​ 容器网络(如Docker, Kubernetes)、虚拟机网络、需要网络隔离或特殊路由策略的多租户环境 为单一主机提供多个IP地址(如托管多个服务)、网络调试、临时测试。
配置与管理​​ 需使用 ip link命令创建,配置稍复杂,功能强大。 使用 ifconfig或 ip addr命令即可配置,简单快捷。

<br>    ipvlan与网口别名如何选择​​     IPVlan:需要​​网络隔离​​(如容器、虚拟机)、希望虚拟接口有​​独立的网络策略​​,或处在​​MAC地址受限的环境​​(如云虚拟机),应选择 ​​IPVlan​​。     网口别名:只是简单地为​​一台主机添加多个IP地址​​(如在同一台服务器上托管多个网站或服务),且​​不需要任何隔离​​,使用​​网口别名​​更简单直接。

2.3 多个ipvlan子接口位于各自namespace中,那么它们还是在一个二层网络中吗

    在 IPvlan 的 L2 模式下,通过同一个物理接口(如eth0)创建的所有IPvlan子接口,即使位于不同的网络命名空间,也确实可以同属一个二层网络。这正是 IPvlan 技术的核心能力之一,它巧妙地利用 Linux 内核机制,在实现网络隔离的同时,保持了二层的连通性。     IPvlan L2 模式的工作原理,可以理解为 Linux 内核在父接口(如 eth0)之上扮演了一个​​虚拟交换机​​的角色。当数据包在属于同一子网的不同容器的 IPvlan 接口间发送时,这个“虚拟交换机”会在数据链路层(二层)直接完成帧的转发,效率很高。

2.4 ipvlan相对于传统linux网桥,性能提升的根本原因是什么

对比维度 传统 Linux 网桥 (如 Docker 默认桥接) IPvlan
核心架构​​ 依赖 ​​Linux 网桥​​,类似一个​​虚拟交换机​​,所有容器流量都经过它进行二层转发。 容器虚拟接口直接与​​物理接口(父接口)关联​​,无需中间网桥。
数据包路径​​ 路径长:容器 → ​​veth pair → 网桥 → 物理网卡​​,数据包需要在​​两个网络栈间穿梭​​。 路径短:容器虚拟接口直接通过​​父接口​​发送和接收数据,路径更直接。
软中断处理​​ 数据包在 veth pair 端点间传输会触发多次​​软中断​​(特别是 netif_rx),CPU 开销较大。​​ 大幅减少软中断​​,数据包在更底层被处理,效率更高。
MAC 地址管理​​ 每个虚拟接口(veth端点)有​​唯一的 MAC 地址​​,可能导致交换机 MAC 地址表膨胀。 所有虚拟接口​​共享父接口的 MAC 地址​​,对交换机更友好,尤其适合大规模场景。

    本质上是因为linux网桥本身完全模拟了交换机的处理过程,而如果从通信角度来看,直接从应用层把包通过ipvlan把包转到物理网口就可以了,经过linux网桥这种虚拟交换设备,实际上其实一种数据空转。去掉这种中间空转的环节,直接把包通过网口发出去,内核直接可以走捷径,不用经过虚拟交换机绕一下。     性能提升最根本的原因,在于 IPvlan 彻底​​绕过了传统网桥(Bridge)和 veth pair 设备​​带来的复杂且低效的数据包处理流程,数据包的转发路径被极大地简化和缩短了

3.ipvlan的注意事项

    有两点需要特别注意:     ​​主机隔离​​:基于安全性和隔离性考虑,默认情况下,连接到IPVlan网络的​​容器是无法与宿主机本身的网络命名空间直接通信的​​。这是有意为之的设计。     ​​VLAN中继​​:如果物理网络是划分了VLAN的,你可以在创建IPVlan网络时指定一个VLAN子接口(如 eth0.10)作为父接口。Docker能够自动管理这些VLAN子接口的创建和删除,从而无缝地集成到复杂的网络环境中。

4.容器场景一个典型的ipvlan组网

    容器环境,在物理网口eth0创建了两个vlan子接口vlan.10和vlan.20,其中vlan.10作为外部访问物理服务器os的网口,配置的是大网地址;vlan.20上创建多个ipvlan设备分到各个容器中,ipvlan配置的内部网络地址,只用于容器通信,不能连通大网,vlan.20本身没有配置ip地址。eth0对外连接交换机的时候,要配置成trunk模式,把vlan.10和vlan.20放通,然后多个物理服务器上的容器的ipvlan接口通过vlan 20进行联通,这些不同服务器上的容器其实是位于一个二层网络。     如下描述了各个接口相关的功能以及说明:

网络接口 所属设备/命名空间 IP地址配置 核心功能
物理网口 eth0 宿主机 (默认网络命名空间) 通常不配置IP 物理流量承载,连接交换机 Trunk 端口
VLAN 子接口 eth0.10 宿主机 (默认网络命名空间) 配置“大网”IP地址 宿主机管理​​:提供SSH等外部访问能力
VLAN 子接口 eth0.20 宿主机 (默认网络命名空间)​​ 不配置IP地址​​ 作为 ​​IPVlan 父接口​​,纯二层通道
IPVlan 虚拟设备 各个容器 (独立网络命名空间) 配置内部网络地址(如 172.16.1.0/24)​​ 容器通信​​:为容器提供网络连接
举报

相关推荐

0 条评论