Переадресація портів від хоста до гостя з libvirt 0.8.3 Використання KVM на Ubuntu


14

У хоста є один зовнішній IP-доступ, тому я налаштував своїх гостей KVM на NAT.

Як налаштувати переадресацію порту, щоб переслати частину запитів ззовні гостям?

Я не зміг знайти жодної документації на це. Найближча відповідь - це, мабуть, ця відповідь , але потім також згадується, що є більш простий спосіб зробити це в libvirt 0.8.3. Хтось знає про більш сучасний спосіб зробити це?


зовнішній - ти маєш на увазі Інтернет-IP? чи просто ваша локальна мережа (зовнішня для VM)? Чи можете ви виділити ці зовнішні адреси до своїх віртуальних машин для налаштування мостових мереж?
Арт Шейдеров

Я можу отримати лише одну 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,

додавати

/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 в приватній NATED мережі, яка підключена на хості через інтерфейс virbr0. Я хочу зробити доступ до ВМ через віддалений робочий стіл. Тому мені доведеться пересилати трафік до порту 3389 (RDP) до порту VM 3389. Я домігся цього за допомогою деяких правил iptable.

/ sbin / iptables -t nat -A РЕГУЛЮВАННЯ -p tcp -d HOST-IP - доповідь 3389 -j DNAT - до місця призначення VM-IP: 3389

/ sbin / iptables -I FORWARD -m стан -d VM-NET / 24 - держава НОВА, ЗВ'ЯЗАНА, Встановлена ​​-j ПРИЙМАНО

HOST-IP, VM-IP і VM-NET повинні бути прийняті, звичайно. Однак возитися з iptables та libvirt є складним. Зараз я шукаю рішення, щоб отримати доступ до Інтернету на своєму VM, який я втратив через псування з правилами iptable :-(


Я знаю, що це кілька років, але ця відповідь спрацювала на мене. Спасибі!
mttdbrd

1

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


0

як налаштована гостьова мережа? якщо це мости, все, що вам потрібно зробити, - це переадресація портів на IP-адреси гостей. Якщо ваші гості позаду ще одного NAT, того, хто встановлює libvirt, це ускладнюється

але в будь-якому випадку, тут ви просто ставитеся до ВМ, як до фізичної машини


Я думаю, я не сказав це чітко. Хост не в NAT, у нього зовнішня IP-адреса. На жаль, гостьова мережа стоїть за NAT, створеним libvirt.
вет

ах, то це вже інша справа. в основному libvirt управляє власним рішенням NAT, яке можна редагувати.
діасний

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

Якщо у вас є з'єднана мережа, ви можете просто відмовитися від налаштувань NAT за замовчуванням і налаштувати все, що завгодно. Як сказав діасний, поводьтеся з ВМ так, як до фізичної машини. У мене хост KVM і інтерфейс із зовнішнім IP призначений для VM, який налаштований як шлюз. Якщо це вам підходить, я можу розмістити конфігурацію (стиль ubuntu).
Арт Шейдеров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.