Я новичок в этой теме и уже несколько дней пытаюсь понять, как назначить несколько общедоступных IP-адресов гостевым KVM через узел KVM. Я нашел массу примеров, как получить такую настройку с 1 запущенным публичным IP.
Вот моя установка: на сервере есть только одна сетевая карта / MAC и работает 2 гостевых KVM с apache (и другими вещами). Обе гостевые среды являются сервером ubuntu 11.10 и должны работать на отдельных виртуальных машинах. 5 публичных IP-адресов используются для обработки SSL-сертификатов и прочего. Первая виртуальная машина должна использовать 3 из 5 адресов / сертификатов. Остальное достается второй виртуальной машине. Apache-материал настроен правильно.
Я пробовал несколько разных способов через iptables перенаправлять трафик от сетевых адаптеров хоста к гостевым сетевым адаптерам. Несмотря на то, что один способ был правильным, но реализован только неправильно, я оставляю детали невысказанными, чтобы вы не были заинтересованы. Возникает вопрос: как лучше всего это сделать?
Должны быть соблюдены следующие условия:
Если бы я отказался от всего, что связано с виртуализацией, это было бы очень просто, поскольку apache получает запрос напрямую с определенного IP-адреса.
Я открыт для любого рабочего решения.
Используйте мост на WAN-интерфейсе вашего dom0 (например, KVM Host). Для этого требуется установка bridge-utils
пакет. Поскольку это дистрибутив на основе Debian, вы можете настроить его в /etc/network/interfaces
:
iface eth0 inet manual
auto br_wan
iface br_wan inet dhcp
# Assuming DHCP to get address, otherwise migrate all WAN connection options here
#address 192.168.122.0
bridge_ports eth0 tap_guest1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
pre-up ip tuntap add dev tap_guest1 user guest1 mode tap
# This command is required if your ISP allocates static IPs depending on MAC address
# You shouldn't use this but might be handy some time
#pre-up sysctl -q -w net/ipv4/conf/tap_guest1/proxy_arp=1
post-down ip tuntap del tap_guest1 mode tap
Команды предварительной настройки настраивают интерфейс TAP для подключения гостевой системы KVM к мосту. Обратите внимание, что эта настройка позволяет запускать kvm от непривилегированного пользователя guest1. Обратите внимание, что настройка net.ipv4.ip_forward = 1
с sysctl тоже может быть полезно.
я использовал ip tuntap
команда от iproute2
пакет. Это еще не задокументировано в пакете Debian, но вскоре будет доступно на странице руководства по исходному направлению. Поскольку этот пакет установлен на каждом сервере на базе Debian, вам не нужно устанавливать uml-utilities
или openvpn
пакет, чтобы просто создать эти интерфейсы.
Этому подходу явно не хватает элегантности для управления множеством интерфейсов касаний, потому что вам нужно будет создать такие же линии до и после спуска, что и для tap_guest1
интерфейс. Это можно исправить, написав дополнительные скрипты в /etc/network/pre-up.d
и /etc/network/post-down.d
. Это также проблема, если вы хотите перенастроить br_wan
интерфейс со сценариями ifdown / ifup, пока гостевые KVM все еще работают - вам нужно либо удалить все интерфейсы, кроме eth0
из конфигурации моста и отсоедините их от моста вручную (не забудьте затем снова подключить их после перенастройки моста) или выключите все экземпляры KVM, работающие на мосту.
Другой способ, возможно, более чистый - написать собственный сценарий ifup для самого KVM и использовать его в script
вариант для вашей сетевой карты. Вы можете получить пример в /etc/qemu-ifup
. Видеть страница руководства kvm для подробностей.
Затем вы можете запустить свой KVM-блок следующим образом:
kvm -net nic,model=virtio,macaddr=12:34:56:78:9a:bc \
-net tap,ifname=tap_guest1,script=no,downscript=no \
-boot c -nographic -display none -daemonize \
guest1-drive.qcow2
Настройка нескольких IP-адресов на одном интерфейсе для вашего гостя KVM может быть выполнена вручную с помощью команды
ip address add aaa.bbb.ccc.101/24 dev eth0
Или постоянно в /etc/network/interfaces
как это:
auto eth0 eth0:1
iface eth0 inet static
address aaa.bbb.ccc.100
network aaa.bbb.ccc.0
netmask 255.255.255.0
broadcast aaa.bbb.ccc.255
gateway aaa.bbb.ccc.1
iface eth0:1 inet static
address aaa.bbb.ccc.101
network aaa.bbb.ccc.0
netmask 255.255.255.0
broadcast aaa.bbb.ccc.255
gateway aaa.bbb.ccc.1
Обратите внимание: если ваш центр обработки данных / провайдер не ожидает, что вы обнаружите дополнительные блоки в той же сети, он может не настроить их, и они будут недоступны. В этом случае вы можете создать внутренний мост и использовать iptables для пересылки пакетов между вашим интерфейсом WAN и этим мостом с использованием DNAT и SNAT. Предполагая, что ваша локальная сеть виртуального моста - 10.0.0.0/8, ваш guest1 - 10.0.0.2, вам понадобится следующее:
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.100 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.101 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
...
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 -j SNAT --to-source aaa.bbb.ccc.100
Обратите внимание, что вам понадобится столько же команд DNAT, сколько внешних IP-адресов для каждого гостя KVM, но только одно правило SNAT для предоставления доступа в Интернет. Также вы можете разрешить только HTTP / HTTPS / SSH трафик, разрешив только желаемые порты. Если вы опустите --dport
заявление, тогда все порты будут перенаправлены. У вашего гостя KVM должны быть статические сетевые настройки с хостом KVM в качестве шлюза по умолчанию, если вы не хотите размещать DHCP-сервер.
@jollyroger: Большое спасибо за подробное руководство. К сожалению, в моем случае это не сработало. Но ваше руководство помогло мне лучше понять функциональность linux-network / bridging вместе с KVM.
Так что я все вернул и получил помощь напрямую от моей хостинг-компании. Сценарий был так же прост, как использовать виртуальный менеджер и вирш для добавления пользовательской конфигурации сети. Вот решение, которое, наконец, сработало для меня:
У меня есть / 29-подсеть (+ еще один IP-адрес для ssh на хосте). Сеть в дата-центре коммутируется на базе Mac, поэтому весь трафик должен проходить через локальный шлюз (насколько я понял). Мой провайдер - Hetzner из Германии. я использовал http://www.subnet-calculator.com/subnet.php?net_class=A чтобы вычислить все необходимые настройки для network-configuration-xml:
<network>
<name>{some systemwide unique name. e.g.: subnet1}</name>
<uuid>{> call uuidgen from shell to generate a uuid}</uuid>
<forward dev="{interface e.g.: eth0}" mode="route" />
<bridge name="{name of a _new_ virtual interface e.g.: virbr2}" stp="off" forwardDelay="0" />
<ip address="{subnet-calc: Host Address Range Start Address}" netmask="subnet-calc: Subnet Mask">
<dhcp>
<range start="{subnet-calc: Host Address Range Start Address+1}" end="{subnet-calc: Host Address Range End Address}" />
</dhcp>
</ip>
</network>
Я сохранил эти xml-данные как-то вроде /tmp/subnet1.xml и применил эту новую виртуальную сеть, используя:
sudo virsh net-define /tmp/subnet1.xml
я использую виртуальный менеджер 0.9.0 (через пересылку x11 через шпатлевку на моем компьютере с Windows) для создания и редактирования всех виртуальных машин. Итак, две мои общедоступные виртуальные машины получают эту новую виртуальную сеть. В каждой виртуальной машине я создал новый виртуальный сетевой интерфейс для каждого общедоступного IP-адреса. Я отметил, какой MAC-адрес я использовал для какого публичного IP. Поэтому, если я хочу переместить общедоступный IP-адрес на другую виртуальную машину, это не более чем удаление виртуального сетевого адаптера в виртуальной машине A и создание его на виртуальной машине B с использованием того же MAC-адреса.
Другое дело, если вы попытаетесь воспроизвести этот сценарий: перед запуском виртуальных машин убедитесь, что виртуальная сеть «subnet1» (s.a.) активна. В главном окне виртуального менеджера перейдите в Правка> Сведения о подключении и перейти на вкладку Виртуальные сети. Если сеть «subnet1» неактивна, просто отметьте ее и нажмите кнопку воспроизведения.
Теперь запустите виртуальную машину и введите ifconfig. В моем случае все работало напрямую.
Если я что-то пропустил в этом отчете, просто спросите. Если у кого-то есть лучшее решение, пожалуйста, добавьте его здесь.
Вы используете мост вместо пересылки пакетов с помощью iptables. После запуска гостя вы можете просто настроить IP-адреса для сетевых адаптеров (если у вас более 1 виртуальных сетевых адаптеров) на вашем гостевом компьютере.
Обратитесь к этому документация.