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