Port Forwarding do Host para Guest 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 configuro um encaminhamento de porta para encaminhar algumas solicitações de fora para os convidados?

Não encontrei nenhuma documentação sobre isso. A resposta mais próxima é provavelmente esta resposta , mas depois 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?

    
por wei 10.02.2011 / 10:43

5 respostas

12

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

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 no topo para ajustar sua configuração libvirt.

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

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

você precisará reiniciar o convidado. No Ubuntu, você precisará ajustar /etc/apparmor.d/usr.sbin.libvirtd para permitir que o script de gancho seja executado:

Próximo a

/usr/sbin/* PUx,

anexe

/etc/libvirt/hooks/* PUx,

Em seguida, recarregue apparmor:

sudo service apparmor reload

Provavelmente, existe uma maneira de autoconfigurar $GUEST_IPADDR usando virsh / dumpxml / iface-dumpxml, mas não o encontrei. Como alternativa, o IP pode ser definido estaticamente no xml da rede: documentação .

Até onde eu sei, os filtros de rede só podem ser usados para restringir o que acontece na rede virtual e não são úteis para o encaminhamento de portas.

    
por 07.12.2011 / 12:56
2

Estou em uma situação semelhante. Eu tenho um Windows Server em execução no KVM na rede privada NAT que está conectada no host através da interface virbr0. Eu quero acessar a VM via desktop remoto. Então eu tenho que encaminhar o tráfego para a porta 3389 (RDP) para a porta VM 3389. Eu consegui isso com algumas regras de 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

O HOST-IP, o VM-IP e o VM-NET precisam ser adotados, é claro. 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: - (

    
por 14.03.2011 / 14:40
1

Acredito que a resposta que você mencionou ainda mostre 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 forem iniciadas e interrompidas. Como Isaac disse na resposta anterior, há também filtros de rede na libvirt atual, mas não sei como ou se eles podem ser usado para abrir portas para convidados NATed.

    
por 23.02.2011 / 16:46
0

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

mas em qualquer caso, aqui você trata as VMs como se fosse uma máquina física

    
por 10.02.2011 / 11:05
0

você pode conceder a si mesmo um acesso temporário a uma VM em execução usando o encaminhamento ssh tcp

por exemplo você tem um windows vm e quer acessar sua porta RDP:

host ip: 10.10.10.10

vm ip: 192.168.180.5

porta rdp: 3389

primeiro passo: ssh -f 10.10.10.10 -L 3389: 192.168.180.5: 3389 -N

segundo passo: usando seu cliente rdp conectar ao localhost: 3389

é isso.

    
por 28.05.2016 / 11:42