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

Перенаправление портов от хоста к гостю с libvirt 0.8.3 с использованием KVM в Ubuntu

У хоста есть единственный внешний IP-адрес, поэтому я настроил своих гостей KVM с NAT.

Как настроить переадресацию портов для пересылки некоторых запросов извне гостям?

Я не смог найти никакой документации по этому поводу. Вероятно, наиболее близкий ответ этот ответ, но также упоминается, что есть более простой способ сделать это в libvirt 0.8.3. Кто-нибудь знает более современный способ сделать это?

Вот лучший способ настроить переадресацию портов, используя скрипт-перехватчик (источник).

В /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

Вы должны установить четыре переменные вверху, чтобы они соответствовали вашей настройке libvirt.

Вам нужно будет перезапустить libvirt-bin, что в ubuntu выполняется с помощью:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

тогда вам нужно будет перезапустить гостя. В Ubuntu вам нужно будет настроить /etc/apparmor.d/usr.sbin.libvirtd чтобы разрешить выполнение сценария ловушки:

Следующий на

/usr/sbin/* PUx,

добавить

/etc/libvirt/hooks/* PUx,

Затем перезагрузите apparmor:

sudo service apparmor reload

Вероятно, есть способ автоконфигурирования $GUEST_IPADDR используя virsh / dumpxml / iface-dumpxml, но я его не нашел. Как вариант, IP можно установить статически в xml сети: документация.

Насколько я могу судить, сетевые фильтры можно использовать только для ограничения того, что происходит в виртуальной сети, и они бесполезны для переадресации портов.

Я в похожей ситуации. У меня есть Windows Server, работающий в KVM в частной сети с NAT, которая подключена к хосту через интерфейс virbr0. Я хочу получить доступ к виртуальной машине через удаленный рабочий стол. Поэтому мне нужно перенаправить трафик с порта 3389 (RDP) на порт виртуальной машины 3389. Я добился этого с помощью некоторых правил iptable.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT --to-destination VM-IP: 3389

/ sbin / iptables -I FORWARD -m state -d VM-NET / 24 --state NEW, RELATED, ESTABLISHED -j ACCEPT

Конечно, необходимо принять HOST-IP, VM-IP и VM-NET. Однако возиться с iptables и libvirt сложно. Прямо сейчас я ищу решение, чтобы получить доступ в Интернет на моей виртуальной машине, которую я потерял из-за нарушения правил iptable :-(

Я считаю, что ответ, на который вы ссылаетесь, по-прежнему показывает соответствующие правила iptables. Однако теперь вы можете использовать крючок сценария для создания и уничтожения правил при запуске и остановке виртуальных машин. Как сказал Исаак в предыдущем ответе, есть также сетевые фильтры в текущей libvirt, но я не уверен, как и даже можно ли их использовать для открытия портов для гостей с NAT.

как настроена гостевая сеть? если это мост, все, что вам нужно сделать, это перенаправить порты на гостевые IP-адреса. Если ваши гости находятся за еще одним NAT, который настраивает libvirt, тогда все усложняется

но в любом случае здесь вы просто относитесь к виртуальным машинам, как к физическим машинам.