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) | 容器通信:为容器提供网络连接 |