Переадресация портов с хоста на гостя с помощью libvirt 0.8.3 Использование KVM в Ubuntu


14

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

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

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


внешний - ты имеешь ввиду интернет IP? или только ваша локальная сеть (внешняя по отношению к виртуальным машинам)? Можете ли вы выделить эти внешние адреса для ваших виртуальных машин, чтобы настроить мостовую сеть?
Арт Шайдеров

Я могу получить только один IP-адрес в Интернете, поэтому я не использовал режим сетевого моста.
Вэй

Ответы:


12

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

В /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,

Append

/etc/libvirt/hooks/* PUx,

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

sudo service apparmor reload

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

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


1
У Trusty есть строка /etc/libvirt/hooks/** rmix,в конфигурационном файле apparmor по умолчанию, и похоже, что он имеет тот же эффект. Я мог запустить скрипт без изменения конфигурации apparmor.
Амир Али Акбари

2

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

/ sbin / iptables -t nat -A ПРЕДОТВРАЩЕНИЕ -p tcp -d HOST-IP --dport 3389 -j DNAT - к месту назначения VM-IP: 3389

/ sbin / iptables -I FORWARD -m состояние -d VM-NET / 24 - состояние НОВОЕ, СВЯЗАННОЕ, УСТАНОВЛЕНО -j ПРИНЯТЬ

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


Я знаю, что ему несколько лет, но этот ответ сработал для меня. Благодарность!
mttdbrd

1

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


0

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

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


Я думаю, что я не сказал это очень ясно. Хост не находится в NAT, у него есть внешний IP-адрес. К сожалению, гостевая сеть находится за NAT, установленным libvirt.
Вэй

ах, тогда другое дело. в основном libvirt управляет собственным решением NAT, которое можно редактировать.
dyasny

да, это то, что мне сказали, это можно редактировать. Но я просто не могу найти какую-либо ссылку на это, файлы конфигурации nwfilter xml кажутся мне странными, документация на сайте libvirt тоже не очень полезна.
Вэй

Если у вас есть мостовая сеть, вы можете просто отказаться от установленного по умолчанию libvirt NAT и настроить все, что захотите. Как сказал дясный, относись к ВМ как к физической машине. У меня есть KVM-хост, и интерфейс с внешним IP-адресом назначен виртуальной машине, которая настроена как шлюз. Если это вам нужно, я могу опубликовать конфигурацию (в стиле Ubuntu).
Арт Шайдеров
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.