IPVLAN 驱动程序 HOWTO

初始发布

Mahesh Bandewar <maheshb AT google.com>

1. 简介:

这个驱动程序在概念上与 macvlan 驱动程序非常相似,但有一个主要的例外,即使用 L3 在从设备之间进行多路复用/解复用。此特性使得主设备与其从设备共享 L2。我是在结合网络命名空间开发这个驱动程序的,不确定在命名空间之外是否有应用场景。

2. 构建和安装:

要构建驱动程序,请选择配置项 CONFIG_IPVLAN。该驱动程序可以构建到内核中 (CONFIG_IPVLAN=y) 或作为模块构建 (CONFIG_IPVLAN=m)。

3. 配置:

此驱动程序没有模块参数,可以使用 IProute2/ip 实用程序进行配置。

ip link add link <master> name <slave> type ipvlan [ mode MODE ] [ FLAGS ]
   where
     MODE: l3 (default) | l3s | l2
     FLAGS: bridge (default) | private | vepa

例如:

  1. 以下命令将创建以 eth0 为主设备的 L3 桥接模式 IPvlan 链接

    bash# ip link add link eth0 name ipvl0 type ipvlan
    
  2. 此命令将创建 L2 桥接模式的 IPvlan 链接

    bash# ip link add link eth0 name ipvl0 type ipvlan mode l2 bridge
    
  3. 此命令将创建 L2 私有模式的 IPvlan 设备

    bash# ip link add link eth0 name ipvlan type ipvlan mode l2 private
    
  4. 此命令将创建 L2 vepa 模式的 IPvlan 设备

    bash# ip link add link eth0 name ipvlan type ipvlan mode l2 vepa
    

4. 操作模式:

IPvlan 有两种操作模式 - L2 和 L3。对于给定的主设备,您可以选择这两种模式之一,并且该主设备上的所有从设备都将以相同的(选定的)模式运行。 RX 模式几乎相同,只是在 L3 模式下,从设备不会接收任何多播/广播流量。L3 模式更具限制性,因为路由是从其他(大多数)默认命名空间控制的。

4.1 L2 模式:

在此模式下,TX 处理发生在连接到从设备的堆栈实例上,数据包被切换并排队到主设备发送出去。在此模式下,从设备还将接收/发送多播和广播(如果适用)。

4.2 L3 模式:

在此模式下,直到 L3 的 TX 处理都发生在连接到从设备的堆栈实例上,并且数据包被切换到主设备的堆栈实例进行 L2 处理,并且在该实例中的路由将被使用,然后再将数据包排队到出站设备。在此模式下,从设备将不接收也不发送多播/广播流量。

4.3 L3S 模式:

这与 L3 模式非常相似,只是 iptables(连接跟踪)在此模式下工作,因此它是 L3 对称的 (L3s)。这会稍微降低性能,但这应该没关系,因为您选择此模式而不是纯 L3 模式是为了使连接跟踪正常工作。

5. 模式标志:

目前,以下模式标志可用

5.1 桥接:

这是默认选项。 要在此模式下配置 IPvlan 端口,用户可以选择在命令行中添加此选项,也可以不指定任何内容。 这是传统模式,从设备之间可以相互通信,除了通过主设备进行通信。

5.2 私有:

如果将此选项添加到命令行,则端口将设置为私有模式。 即,端口不允许从设备之间进行交叉通信。

5.3 vepa:

如果将其添加到命令行,则端口将设置为 VEPA 模式。 即,端口将切换功能卸载到外部实体,如 802.1Qbg 中所述。注意:IPvlan 中的 VEPA 模式有限制。IPvlan 使用主设备的 mac 地址,因此在此模式下为相邻邻居发出的数据包将具有相同的源和目标 mac。这将使交换机/路由器发送重定向消息。

6. 如何选择(macvlan vs. ipvlan)?

这两种设备在许多方面非常相似,具体的用例可以很好地定义选择哪种设备。 如果以下情况之一定义了您的用例,则可以选择使用 ipvlan

  1. 连接到外部交换机/路由器的 Linux 主机配置了策略,该策略仅允许每个端口一个 mac 地址。

  2. 在主设备上创建的虚拟设备数量超过了 mac 容量,并将 NIC 置于混杂模式,并且担心性能下降。

  3. 如果要将从设备置于敌对/不受信任的网络命名空间中,则可以更改/滥用从设备上的 L2。

6. 配置示例:

+=============================================================+
|  Host: host1                                                |
|                                                             |
|   +----------------------+      +----------------------+    |
|   |   NS:ns0             |      |  NS:ns1              |    |
|   |                      |      |                      |    |
|   |                      |      |                      |    |
|   |        ipvl0         |      |         ipvl1        |    |
|   +----------#-----------+      +-----------#----------+    |
|              #                              #               |
|              ################################               |
|                              # eth0                         |
+==============================#==============================+
  1. 创建两个网络命名空间 - ns0、ns1

    ip netns add ns0
    ip netns add ns1
    
  2. 在 eth0(主设备)上创建两个 ipvlan 从设备

    ip link add link eth0 ipvl0 type ipvlan mode l2
    ip link add link eth0 ipvl1 type ipvlan mode l2
    
  3. 将从设备分配给各自的网络命名空间

    ip link set dev ipvl0 netns ns0
    ip link set dev ipvl1 netns ns1
    
  4. 现在切换到命名空间(ns0 或 ns1)以配置从设备

    • 对于 ns0

      (1) ip netns exec ns0 bash
      (2) ip link set dev ipvl0 up
      (3) ip link set dev lo up
      (4) ip -4 addr add 127.0.0.1 dev lo
      (5) ip -4 addr add $IPADDR dev ipvl0
      (6) ip -4 route add default via $ROUTER dev ipvl0
      
    • 对于 ns1

      (1) ip netns exec ns1 bash
      (2) ip link set dev ipvl1 up
      (3) ip link set dev lo up
      (4) ip -4 addr add 127.0.0.1 dev lo
      (5) ip -4 addr add $IPADDR dev ipvl1
      (6) ip -4 route add default via $ROUTER dev ipvl1