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

Как назначить несколько публичных IP-адресов для 2 KVM-гостей

Я новичок в этой теме и уже несколько дней пытаюсь понять, как назначить несколько общедоступных 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 виртуальных сетевых адаптеров) на вашем гостевом компьютере.

Обратитесь к этому документация.