Назад | Перейти на главную страницу

Правильная конфигурация сети для гостя KVM, чтобы он находился в тех же сетях на хосте

Я использую сервер Debian Linux на Ленни. В нем я запускаю еще один экземпляр Lenny с использованием KVM. Оба сервера доступны извне, с общедоступными IP-адресами, а также со вторым интерфейсом с частными IP-адресами для локальной сети. Все работает нормально, за исключением того, что виртуальная машина видит весь сетевой трафик как исходящий от хост-сервера. Я подозреваю, что это может иметь какое-то отношение к брандмауэру на основе iptables, который я использую на хосте.

Я хотел бы выяснить следующее: как правильно настроить сеть хоста, чтобы выполнялись все эти требования?

  1. И хост, и виртуальные машины имеют 2 сетевых интерфейса (публичный и частный).
  2. И хост, и виртуальные машины могут быть защищены межсетевым экраном независимо.
  3. В идеале трафик виртуальной машины не должен проходить через брандмауэр хоста.
  4. Виртуальные машины видят реальные удаленные IP-адреса, а не хосты.

В настоящее время сетевые интерфейсы хоста настроены как мосты. eth0 и eth1 не имеют назначенных им IP-адресов, но br0 и br1 имеют.

/etc/network/interfaces на хосте:

# The primary network interface
auto br1
iface br1 inet static
    address 24.123.138.34
    netmask 255.255.255.248
    network 24.123.138.32
    broadcast 24.123.138.39
    gateway 24.123.138.33
    bridge_ports eth1
    bridge_stp off

auto br1:0
iface br1:0 inet static
    address 24.123.138.36
    netmask 255.255.255.248
    network 24.123.138.32
    broadcast 24.123.138.39

# Internal network
auto br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    bridge_ports eth0
    bridge_stp off

Это файл конфигурации libvirt / qemu для виртуальной машины:

<domain type='kvm'>
  <name>apps</name>
  <uuid>636b6620-0949-bc88-3197-37153b88772e</uuid>
  <memory>393216</memory>
  <currentMemory>393216</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='cdrom'>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/raid/kvm-images/apps.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <mac address='54:52:00:27:5e:02'/>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <mac address='54:52:00:40:cc:7f'/>
      <source bridge='br1'/>
      <model type='virtio'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
  </devices>
</domain>

Наряду с остальными моими правилами брандмауэра сценарий брандмауэра включает эту команду для передачи пакетов, предназначенных для гостевой системы KVM:

# Allow bridged packets to pass (for KVM guests).
iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT

(Не применимо к этому вопросу, но побочным эффектом моей конфигурации моста, похоже, является то, что я не могу полностью завершить работу. В конечном итоге ядро ​​сообщает мне «unregister_netdevice: ожидание освобождения br1», и мне нужно выполнить полный сброс система. Может знак, что я наделал глупостей?)

Вы подключили свои виртуальные машины к неправильному интерфейсу. Они должны быть подключены к сетевому интерфейсу, который подключается к внешнему миру (br1 в твоем случае).

Имейте в виду, что для каждой виртуальной машины также должен быть установлен свой IP-адрес в гостевой системе, не на хосте.

зачем тебе алиас на br1: 0? это может быть в пути
Помимо псевдонима, идея состоит в том, чтобы использовать следующую схему:
eth0-> br0 <- устройство разветвления ВМ
хост должен иметь возможность использовать br0 в качестве IF, а виртуальные машины будут использовать устройства с ответвлением в качестве виртуальных сетевых адаптеров, подключенных к виртуальному коммутатору (который здесь фактически становится br0)

то же самое, конечно, касается каждой сети, поэтому для eth1 вам нужно будет настроить br1 и поднять виртуальные машины, которые будут подключены к br1

У меня такая же настройка с Lenny / Squeeze VM внутри хоста Lenny с использованием lib-virt и virtio для подключения к br0 (без br1 и br0: 0). Он работает правильно без какой-либо специальной настройки iptables на хосте. Я выполняю всю настройку брандмауэра внутри каждой гостевой виртуальной машины.

Я думаю, вам может быть полезно проверить сетевые маршруты, чтобы узнать, использует ли ваша виртуальная машина хост в качестве шлюза. Мой настроен на использование внешнего маршрутизатора в качестве шлюза. Конечно, моя виртуальная машина и хост находятся на разных IP-адресах в одном диапазоне.