Encaminhamento de porta do host ao convidado com libvirt 0.8.3 usando o KVM no Ubuntu

14

O host tem um único IP externo disponível, então eu configurei meus convidados KVM com NAT.

Como configurar um encaminhamento de porta para encaminhar alguns dos pedidos de fora para os convidados?

Não encontrei nenhuma documentação sobre isso. A resposta mais próxima é provavelmente essa resposta , mas também é mencionado que há uma maneira mais fácil de fazer isso no libvirt 0.8.3. Alguém sabe de uma maneira mais atual de fazer isso?

wei
fonte
externo - você quer dizer IP da Internet? ou apenas sua LAN (externa às VMs)? Você pode alocar esses endereços externos para suas VMs para configurar a rede em ponte?
Art Shayderov
Só consigo obter um endereço IP da Internet, por isso não usei o modo de rede em ponte.
wei

Respostas:

12

Aqui está uma maneira melhor de configurar o encaminhamento de porta, usando um script de gancho ( origem ).

Em /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

Você deve definir as quatro variáveis ​​na parte superior para ajustar sua configuração de libvirt.

Você precisará reiniciar o libvirt-bin, o que no ubuntu é feito com:

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

então você precisará reiniciar o convidado. No Ubuntu, você precisará ajustar /etc/apparmor.d/usr.sbin.libvirtdpara permitir que o script hook seja executado:

Ao lado de

/usr/sbin/* PUx,

acrescentar

/etc/libvirt/hooks/* PUx,

Em seguida, recarregue o apparmor:

sudo service apparmor reload

Provavelmente existe uma maneira de configurar automaticamente $GUEST_IPADDRusando virsh / dumpxml / iface-dumpxml, mas não o encontrei. Como alternativa, o IP pode ser definido estaticamente na rede xml: documentation .

Tanto quanto sei, os filtros de rede podem ser usados ​​apenas para restringir o que acontece na rede virtual e não são úteis para o encaminhamento de portas.

Tobu
fonte
1
Confiável tem uma linha /etc/libvirt/hooks/** rmix,no arquivo de configuração do apparmor por padrão, e parece ter o mesmo efeito. Eu poderia executar o script sem modificar a configuração do apparmor.
Amir Ali Akbari
2

Eu estou em uma situação semelhante. Eu tenho um Windows Server em execução no KVM na rede NAT nativa que está conectada no host por meio da interface virbr0. Quero acessar a VM pela área de trabalho remota. Portanto, eu tenho que encaminhar o tráfego para a porta 3389 (RDP) para a porta VM 3389. Consegui isso com algumas regras de tabela de ipables.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT --para o destino VM-IP: 3389

/ sbin / iptables -I FORWARD -m state -d VM-NET / 24 --state NOVO, RELACIONADO, ESTABELECIDO -j ACEITA

É claro que o HOST-IP, VM-IP e VM-NET devem ser adotados. No entanto, mexer com iptables e libvirt é complicado. No momento, estou procurando uma solução para obter acesso à Internet na minha VM que perdi devido a mexer com as regras do iptable :-(

spa
fonte
Eu sei que tem alguns anos, mas essa resposta funcionou para mim. Obrigado!
Mddbrd
1

Acredito que a resposta que você faz referência ainda mostra as regras apropriadas do iptables. No entanto, agora você pode usar um gancho de script para criar e destruir regras quando as máquinas virtuais são iniciadas e paradas. Como Isaac disse na resposta anterior, também existem filtros de rede na libvirt atual, mas não tenho certeza de como ou mesmo se eles podem ser usados ​​para abrir portas para convidados com NAT.

sciurus
fonte
0

como é configurada a rede de convidados? se estiver em ponte, tudo o que você precisa fazer é encaminhar as portas para os IPs dos convidados. Se seus convidados estão atrás de outro NAT, o libvirt é configurado, então fica complicado

mas, de qualquer forma, aqui você simplesmente trata as VMs como trataria uma máquina física

dyasny
fonte
Acho que não disse isso claramente. O host não está em um NAT, possui um endereço IP externo. Infelizmente, a rede de convidados está por trás do NAT configurado pelo libvirt.
wei
ah, então é outra questão. basicamente libvirt gerencia sua própria solução NAT, que pode ser editada.
dyasny
Sim, foi o que me disseram, pode ser editado. Mas eu simplesmente não consigo encontrar nenhuma referência sobre isso, os arquivos de configuração nwfilter xml parecem bizarros para mim, a documentação no site libvirt também não é muito útil.
wei
Se você conectou a rede, basta abandonar o NAT libvirt padrão e configurar o que quiser. Como dyasny disse, trate a VM como faria com uma máquina física. Eu tenho o host KVM e a interface com IP externo é atribuída a uma VM que está configurada como um gateway. Se isso atender às suas necessidades, posso postar a configuração (no estilo ubuntu).
Art Shayderov