Уже написано много статей по настройке сети 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 этапа
- Установим гипервизор KVM под debian на выделенный сервер.
- Cоздадим виртуальную машину и подключим образ.
- Предоставим доступ из интернет к этой виртуальной машине используя 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
- Устанавливаем пакеты
- Перезагружаемся
- Проверяем корректность установки
- Настраиваем сеть. Вносим следующие изменения в /etc/network/interfaces
- Основной интерфейс 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
Настройка сети виртуальной машины
- Создаем виртуальную машину. В данной статье не будем описывать процесс создания виртуальной машины в интернете много инструкций. Проще всего использовать Virtual Machine Manager. Примечание: при создании виртуальной машины указываем, что сетевой адаптер подключен к созданному нами раннее мосту br0.
- Подключаемся к консоли виртуальной машине через 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
- Редактируем: /etc/network/interfaces
- Перезапускаем сетевой интерфейс для применения изменений
- Примечание:
На этом этапе могут возникнуть ошибки в том случае если подключенный к виртуальной машине образ уже работал раньше на другой виртуальной машине. В случае возникновения ошибок необходимо:- Очистить файл /etc/udev/rules.d/70-persistent-net.rules
- Перезагрузиться
Настройка доступа к виртуальной машине из интернет
#!/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
- Пишем небольшой скрипт web.sh, позволяющий открыть доступ к виртуальной машине из интернет
- Запускаем скрипт
- Для остановки используем
root@ourserver# ./web.sh stop
После проведенных действий мы предоставили доступ к виртуальной машине с установленным веб-сервером по публичному ip адресу yyy.yyy.yyy.yyy.