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

Как связать ряд общедоступных IP-адресов с виртуальными машинами KVM в Debian / Ubuntu

В течение нескольких недель я пытался определить правильную конфигурацию сети для совместного использования ряда общедоступных IP-адресов с виртуальными машинами KVM, работающими на моем сервере, но пока не повезло и с помощью дружелюбного сообщества ServerFault мне удалось заставить его работать. Вы можете найти мою рабочую настройку ниже:

Мой интернет-провайдер направляет весь трафик на 192.168.8.118 (так что это должен быть основной IP-адрес eth0), но у меня 192.168.239.160/28 к моему расположению.

Вот /etc/network/interfaces на хост-машине:

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto  eth0
iface eth0 inet static
  address   192.168.8.118
  broadcast 192.168.8.127
  netmask   255.255.255.224
  gateway   192.168.8.97
  pointopoint 192.168.8.97
  # This device acts as gateway for the bridge, so provide a route.
  up ip route add 192.168.8.118/32 dev eth0 scope host

# device: br0
auto  br0
iface br0 inet static
  bridge_stp      off
  bridge_maxwait  0
  bridge_fd       0
  address   192.168.239.174
  broadcast 192.168.239.175
  netmask   255.255.255.240
  gateway   192.168.8.118
  # Create and destroy the bridge automatically.
  pre-up brctl addbr br0
  post-down brctl delbr br0
  # Our additional IPs are allocated on the bridge.
  up ip route add to 192.168.239.160/28 dev br0 scope host

Я настроил виртуальную машину так:

sudo ubuntu-vm-builder kvm precise \
                  --domain pippin \
                  --dest pippin \
                  --hostname pippin.hobbiton.arnor \
                  --flavour virtual \
                  --mem 8196 \
                  --user mikl \
                  --pass hest \
                  --bridge=br0 \
                  --ip 192.168.239.162 \
                  --mask 255.255.255.240 \
                  --net 192.168.239.160 \
                  --bcast 192.168.239.175 \
                  --gw 192.168.239.174 \
                  --dns 8.8.8.8 \
                  --components main,universe \
                  --addpkg git \
                  --addpkg openssh-server \
                  --addpkg vim-nox \
                  --addpkg zsh \
                  --libvirt qemu:///system ;

Если я проверю XML-определение виртуальной машины, ее сетевой интерфейс определяется следующим образом:

<interface type='bridge'>
  <mac address='52:54:00:b1:e9:52'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

Когда я (повторно) запускаю виртуальную машину, /var/log/syslog получает эти строки:

Jul 20 03:13:02 olin kernel: [ 4084.652906] device vnet0 entered promiscuous mode
Jul 20 03:13:02 olin kernel: [ 4084.686388] br0: port 2(vnet0) entering forwarding state
Jul 20 03:13:02 olin kernel: [ 4084.686394] br0: port 2(vnet0) entering forwarding state

Мой сервер работает под управлением 64-разрядной версии Ubuntu 12.04 с ядром 3.2.0-26-generic (из Ubuntu). я бегу libvirt-bin 0.9.8-2ubuntu1 и qemu-kvm 1.0+noroms-0ubuntu13.

iptables на хост-машине в настоящее время настроен на разрешение всего трафика (чтобы исключить его как источник проблемы), и я включил пересылку трафика ipv4 и ipv6.

Когда я вхожу в гостевую систему через SSH с хоста, у меня нет подключения к Интернету внутри гостевой ОС. Гости /etc/network/interfaces выглядит так:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.239.162
    netmask 255.255.255.240
    network 192.168.239.160
    broadcast 192.168.239.175
    gateway 192.168.239.174
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8
    dns-search pippin

Теперь это работает

Схема конфигурации выше действительно работает так, как я хочу. Обратитесь к истории редактирования, если хотите увидеть мои предыдущие попытки.

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

Но если ваш интернет-провайдер маршрутизация трафика на адрес .118 хоста, вам необходимо настроить хост виртуальной машины для работы в качестве маршрутизатора и перенаправления трафика виртуальных машин. Для этого удалите bridge_ports eth0 строка из вашего файла интерфейсов, ip route add to 192.168.239.160/28 dev br0, и echo 1 > /proc/sys/net/ipv4/ip_forward. На виртуальных машинах вам нужно настроить 192.168.8.118 в качестве шлюза по умолчанию и добавить маршрут, который говорит, что 192.168.8.118 напрямую доступен через eth0. (Это виртуальная машина eth0, который подключается к хосту br0.)

Ни в том, ни в другом случае вам не следует добавлять адреса виртуальных машин непосредственно в br0 интерфейс. В случае моста вы хотите, чтобы виртуальные машины, а не хост, отвечали на запросы ARP для этих адресов, а в случае маршрутизации вы хотите, чтобы хост понимал, что, когда он получает пакет для одного из этих адресов, его необходимо маршрутизировать. где-то еще, не доставляется на месте.

Вы не хотите назначать IP-адрес своих виртуальных машин интерфейсу br0 вашего хоста - это просто сделает этот адрес принадлежащим хосту, а не виртуальной машине.

Однако вашим виртуальным машинам потребуется адрес шлюза для маршрутизации всех исходящих пакетов. Я бы рекомендовал выделить один IP-адрес в этом / 28 для вашего хоста и настроить ваши виртуальные машины на использование этого IP-адреса в качестве маршрута по умолчанию. Первый или последний доступный IP-адрес в подсети - разумный выбор для адреса шлюза ....

ip addr add 192.168.239.161/28 dev br0

вы включили переадресацию IP? например раскомментируйте следующее в /etc/sysctl.conf (один или оба для ipv4 и / или ipv6):

#net.ipv4.ip_forward=1
#net.ipv6.conf.all.forwarding=1

Наконец, пробовали ли вы войти в систему с консоли виртуальной машины (например, с помощью virt-manager или программы просмотра VNC, такой как vinagre или xvnc4viewer)? если да, то какой у него IP-адрес (если есть)? Настроена ли виртуальная машина на статический IP-адрес или DHCP? В последнем случае, настроили ли вы свой DHCP-сервер, чтобы назначать соответствующий IP-адрес MAC-адресу виртуальных машин?