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 处理发生在附加到从属设备的堆栈实例上,并且数据包被交换并排队到主设备以发送出去。 在此模式下,从属设备也将 RX/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 容量,并且使网卡处于混杂模式,并且性能下降是一个问题。

  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