Уже написано много статей по настройке сети KVM, но в нашем случае мы столкнулись с небольшими сложностями, когда попытались провести настройку на хостинге server4you.net.
Сам по себе хостинг server4you.net достаточно интересный:

  • хорошие каналы связи;
  • недорогие серверы;
  • хорошая англоязычная поддержка;
  • по поводу надежности можно сказать, что за 3 месяца работы проблем не было.

Но есть одна особенность: по словам технической поддержки сетевое оборудование не позволяет по одному каналу, подключенному к серверу, передавать пакеты предназначенные разным сетевым интерфейсам соответственно с разными МАС адресами, что необходимо в случае настройки сети в виртуальных машинам под управлением KVM в режиме public bridge. Этот режим является самым простым способом настройки сети для виртуальных машин, который работает следующим образом: сетевой интерфейс гипервизора объединяется в один bridge вместе с сетевым интерфейсом виртуальной машины.
Поэтому в данной статье мы опишем как предоставить доступ из Интернет к виртуальным машинам под управлением гипервизора KVM на хостинге server4you.net (и других хостингах с подобными ограничениями) с применением private virtual bridge и iptables.

Постановка задачи

Имеется выделенный сервер на хостинге server4you.net и 2 выделенных IP адреса: xxx.xxx.xxx.xxx, yyy.yyy.yyy.yyy
Требуется предоставить к виртуальной машине под debian (предположим, что образ виртуальной машины с настроенным веб-сервером уже есть) доступ из интернет через ip адрес yyy.yyy.yyy.yyy
Настройку будем проводить в 3 этапа

  1. Установим гипервизор KVM под debian на выделенный сервер.
  2. Cоздадим виртуальную машину и подключим образ.
  3. Предоставим доступ из интернет к этой виртуальной машине используя ip адрес yyy.yyy.yyy.yyy

Все инструкции проверены на работу в Debian Squeeze.

Установка гипервизора KVM

root@ourserver# apt-get install kvm libvirt-bin virtinst bridge-utils
root@ourserver# reboot
root@ourserver# lsmod | grep kvm
kvm_amd                31862  0 
kvm                   214088  1 kvm_amd
root@ourserver# virsh -c qemu:///system list --all
 Id Name                 State
  1. Устанавливаем пакеты
  2. Перезагружаемся
  3. Проверяем корректность установки
  4. Настраиваем сеть. Вносим следующие изменения в /etc/network/interfaces
  5. Основной интерфейс eth0 : xxx.xxx.xxx.xxx
    Дополнительный интерфейса eth0:1: yyy.yyy.yyy.yyy
    Создаем отдельную подсеть br0 для виртуальных машин, например 192.168.123.0
    # /etc/network/interfaces - network interfaces configuration
    
    # loopback interface
    
    auto eth0
    iface eth0 inet static
      address xxx.xxx.xxx.xxx
      network xxx.xxx.xxx.0
      netmask 255.255.255.0
      broadcast xxx.xxx.xxx.255
      gateway xxx.xxx.xxx.1
    
    auto eth0:1
    iface eth0:1 inet static
      address yyy.yyy.yyy.yyy
      gateway yyy.yyy.yyy.1
      network yyy.yyy.yyy.0
      broadcast yyy.yyy.yyy.255
      netmask 255.255.255.0
    
    auto br0
    iface br0 inet static
      address 192.168.123.1
      network 192.168.123.0
      netmask 255.255.255.0
      bridge_maxwait 0
      bridge_ports dummy0
    
    Перезапускаем сетевой интерфейс для применения внесенных изменений.
    root@ourserver# ifdown eth0
    root@ourserver# ifup eth0

Настройка сети виртуальной машины

  1. Создаем виртуальную машину. В данной статье не будем описывать процесс создания виртуальной машины в интернете много инструкций. Проще всего использовать Virtual Machine Manager. Примечание: при создании виртуальной машины указываем, что сетевой адаптер подключен к созданному нами раннее мосту br0.
  2. Подключаемся к консоли виртуальной машине через Virtual Machine Manager. Настраиваем сеть и устанавливаем виртуальной машине ip адрес 192.168.123.176:
    iface eth0 inet static
            address 192.168.123.176
            netmask 255.255.255.0
            network 192.168.123.0
            broadcast 192.168.123.255
            gateway 192.168.123.1
            dns-nameservers 8.8.8.8
    
    root@ourserver# ifdown eth0
    root@ourserver# ifup eth0
    
    1. Редактируем: /etc/network/interfaces
    2. Перезапускаем сетевой интерфейс для применения изменений
  3. Примечание:
    На этом этапе могут возникнуть ошибки в том случае если подключенный к виртуальной машине образ уже работал раньше на другой виртуальной машине. В случае возникновения ошибок необходимо:
    1. Очистить файл /etc/udev/rules.d/70-persistent-net.rules
    2. Перезагрузиться

Настройка доступа к виртуальной машине из интернет

    #!/bin/bash
        IFACE=eth0
        LOCAL_IP1="192.168.123.176"
        NEW_IP="yyy.yyy.yyy.yyy"

        case "$1" in
                'stop')
                iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
                iptables -D FORWARD -d $LOCAL_IP1 -p tcp -j ACCEPT
                iptables -t nat -D PREROUTING -p tcp -d $NEW_IP -j DNAT --to-destination $LOCAL_IP1
                ;;
                'start')
                echo 1 > /proc/sys/net/ipv4/ip_forward
                iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
                iptables -t nat -A PREROUTING -p tcp -d $NEW_IP -j DNAT --to-destination $LOCAL_IP1
                iptables -A FORWARD -d $LOCAL_IP1 -p tcp -j ACCEPT
                ;;
                'restart')
                $0 stop && $0 start
                ;;
                *)
                echo "usage $0 start|stop|restart"
                ;;
        esac
root@ourserver# ./web.sh start
  1. Пишем небольшой скрипт web.sh, позволяющий открыть доступ к виртуальной машине из интернет
  2. Запускаем скрипт
  3. Для остановки используем
    root@ourserver# ./web.sh stop

После проведенных действий мы предоставили доступ к виртуальной машине с установленным веб-сервером по публичному ip адресу yyy.yyy.yyy.yyy.