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