Использование нескольких сетевых карт в XEN 3.0

Краткая статья, повествующая о назначении различных физических сетевых интерфейсов гостевым доменам.

[Torsten. Перевод: Сгибнев Михаил (www.dreamcatcher.ru)]

Original
Оригинал перевода (Переводчик: Сгибнев Михаил)

Xen - классная штука, но работа с несколькими сетевыми платами для меня оказалась большой проблемой. Есть несколько теоретических документов, описывающих принцип такой работы, но практической реализации мне встретить не удалось. Данная статья призвана заполнить этот пробел.

Использование бриджа для Dom является неплохой идеей, но в этом случае любые пакеты могут быть перехвачены другим Dom. Наличие одной сетевой платы в Xen означает, что есть теоретическая возможность снифить пакеты со всех Dom. Решить данную проблему нам поможет наличие нескольких сетевых карт.

В данном случае мы имеем сервер с тремя сетевыми картами, при этом первая используется для доступа к Dom0 и другим гостевым DomN, вторая для работы с Dom1 и третья для работы с Dom2. Файл конфигурации Dom должен выбрать соответствующий бридж для каждого домена.

Топология
    eth0 - xenbr0 - Dom0, DomN
    eth1 - xenbr1 - Dom1 (cannot be sniffed by Dom0, DomN or Dom2)
    eth2 - xenbr2 - Dom2 (cannot be sniffed by Dom0, Dom1 or Domn)
    
Преимущество использования бриджа состоит в отсутствии маршрутизации.

/etc/xen/xend-config.sxp:
    ...
    #(network-script network-bridge)
    (network-script my-network-script)
    ...
    
Изменим скрипт для работы больше чем с одним мостом:

/etc/xen/scripts/my-network-script:
    #!/bin/sh
    dir=$(dirname "$0")
    "$dir/network-bridge" "$@" vifnum=0 netdev=eth0 bridge=xenbr0
    "$dir/network-bridge" "$@" vifnum=1 netdev=eth1 bridge=xenbr1
    "$dir/network-bridge" "$@" vifnum=2 netdev=eth2 bridge=xenbr2
    
Не забудьте выставить права доступа chmod u+x для этого скрипта!

В заключение сконфигурируем каждый DomU:

/etc/xen/anyXmDomain.cfg: (не забудьте изменить mac-адрес)
    ...
    # use eth0 for this DomU
    vif = ['ip=10.XX.XX.230,mac=00:16:de:ad:fa:ce,bridge=xenbr0']
    ...
    
или
    ...
    # use eth1 for Dom1
    vif = ['ip=10.XX.XX.234,mac=00:16:de:ad:be:ef,bridge=xenbr1']
    ...
    
или
    ...
    # use eth2 for Dom2
    vif = ['ip=10.XX.XX.238,mac=00:16:be:ef:fa:ce,bridge=xenbr2']
    ...
    
Как я уже говорил, для Dom0 или DomU нет никакой маршрутизации, кроме обычного шлюза по умолчанию, как если бы вы работали с единственной сетевой картой, подключенной к Xen.

Для DomU ничего кардинально не меняется. Каждый DomU будет автоматически использовать бридж, определенный в файле конфигурации. Единственное отличие, на которое вы обратите внимание заключается в том, что светодиоды сетевых карт будут мигать только когда отсылаются/принимаются пакеты с соответствующих доменов. Вы даже можете выдернуть патчкорд из NIC (eth0) в то время как Dom1 (eth1) и Dom2 (eth2) будут продолжать свою работу.

Dom0 routing:
    # netstat -arn
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    10.XX.XX.0      0.0.0.0         255.255.255.0   U         0 0          0 eth0
    0.0.0.0         10.XX.XX.254    0.0.0.0         UG        0 0          0 eth0
    
Dom0 bridging:
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    xenbr0          8000.feffffffffff       no              peth0
                                                            vif0.0
                                                            vif1.0
                                                            vif3.0
                                                            vif4.0
    xenbr1          8000.feffffffffff       no              peth1
                                                            vif0.1
                                                            vif6.0
    xenbr2          8000.feffffffffff       no              peth2
                                                            vif0.2
                                                            vif7.0
    
Каждый DomU может использоваться как обычно. Сам DomU даже не знает, что использует другой мост. С точки зрения DomUs есть (виртуальная) сетевая карта, которая будет использоваться как eth0.

Dom1/Dom2 eth0 configuration: (HWaddr is Dom1)
    # ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:16:DE:ED:BE:EF
              inet addr:10.XX.XX.234  Bcast:10.XX.XX.255  Mask:255.255.255.0
              inet6 addr: fe80::216:daff:feda:ba5e/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:257357 errors:0 dropped:0 overruns:0 frame:0
              TX packets:238053 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:32954128 (31.4 MiB)  TX bytes:51239288 (48.8 MiB)
    
Проблем с маршрутизацией тоже никаких не возникает.

Dom1/Dom2 routing:
    # netstat -arn
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    10.XX.XX.0      0.0.0.0         255.255.255.0   U         0 0          0 eth0
    0.0.0.0         10.XX.XX.254    0.0.0.0         UG        0 0          0 eth0
    
Вот, славная победа и результат достигнут, все расходятся пить пиво. Я считаю это более простым и красивым решением по сравнению с настройкой шины pci непосредственно от DomX, который также был бы возможным.

[ опубликовано 28/12/2006 ]

Torsten. Перевод: Сгибнев Михаил (www.dreamcatcher.ru) - Использование нескольких сетевых карт в XEN 3.0   Версия для печати