Próximo: , Acima: Máquinas Virtuais   [Conteúdo][Índice]


5.1 Ponte de rede para QEMU

Por padrão, o QEMU usa um back-end de rede host chamado “modo usuário”, o que é conveniente, pois não requer nenhuma configuração. Infelizmente, também é bastante limitado. Neste modo, o convidado VM (máquina virtual) pode acessar a rede da mesma forma que o host, mas não pode ser alcançado a partir do host. Além disso, como o modo de rede do usuário do QEMU depende do ICMP, ferramentas de rede baseadas em ICMP, como ping, não funcionam neste modo. Portanto, geralmente é desejável configurar uma ponte de rede, que permite que o convidado participe totalmente da rede. Isso é necessário, por exemplo, quando o convidado deve ser usado como um servidor.

5.1.1 Criando uma interface de ponte de rede

Há muitas maneiras de criar uma ponte de rede. O comando a seguir mostra como usar o NetworkManager e sua ferramenta de interface de linha de comando (CLI) nmcli, que já deve estar disponível se a declaração do seu sistema operacional for baseada em um dos modelos de desktop:

# nmcli con add type bridge con-name br0 ifname br0

Para que essa ponte faça parte da sua rede, você deve associar sua ponte de rede à interface Ethernet usada para conectar-se à rede. Supondo que sua interface seja chamada ‘enp2s0’, o comando a seguir pode ser usado para fazer isso:

# nmcli con add type bridge-slave ifname enp2s0 master br0

Importante: Somente interfaces Ethernet podem ser adicionadas a uma ponte. Para interfaces sem fio, considere a abordagem de rede roteada detalhada em Veja Roteamento de rede para libvirt.

Por padrão, a ponte de rede permitirá que seus convidados obtenham seus endereços IP via DHCP, se disponível em sua rede local. Para simplificar, é isso que usaremos aqui. Para encontrar facilmente os convidados, eles podem ser configurados para anunciar seus nomes de host via mDNS.

5.1.2 Configurando o script auxiliar da ponte QEMU

O QEMU vem com um programa auxiliar para usar convenientemente uma interface de ponte de rede como um usuário sem privilégios veja Network options em Documentação do QEMU. O binário deve ser definido como setuid root para operação adequada; isso pode ser obtido adicionando-o ao campo privileged-programs da sua definição operating-system (host), conforme mostrado abaixo:

(privileged-programs
 (cons (privileged-program
         (program (file-append qemu "/libexec/qemu-bridge-helper"))
         (setuid? #t))
       %default-privileged-programs))

O arquivo /etc/qemu/bridge.conf também deve ser feito para permitir a interface bridge, já que o padrão é negar tudo. Adicione o seguinte à sua lista de serviços para fazer isso:

(extra-special-file "/etc/qemu/host.conf" "allow br0\n")

5.1.3 Invocando QEMU com as opções de linha de comando corretas

Ao invocar o QEMU, as seguintes opções devem ser fornecidas para que a ponte de rede seja usada, após selecionar um endereço MAC exclusivo para o convidado.

Importante: Por padrão, um único endereço MAC é usado para todos os convidados, a menos que seja fornecido. Deixar de fornecer endereços MAC diferentes para cada máquina virtual que faz uso da ponte causaria problemas de rede.

$ qemu-system-x86_64 [...] \
    -device virtio-net-pci,netdev=user0,mac=XX:XX:XX:XX:XX:XX \
    -netdev bridge,id=user0,br=br0 \
    [...]

Para gerar endereços MAC que tenham o prefixo registrado QEMU, o seguinte snippet pode ser empregado:

mac_address="52:54:00:$(dd if=/dev/urandom bs=512 count=1 2>/dev/null \
                           | md5sum \
                           | sed -E 's/^(..)(..)(..).*$/\1:\2:\3/')"
echo $mac_address

5.1.4 Problemas de rede causados pelo Docker

Se você usa o Docker na sua máquina, você pode ter problemas de conectividade ao tentar usar uma ponte de rede, que são causados pelo Docker também depender de pontes de rede e configurar suas próprias regras de roteamento. A solução é adicionar o seguinte snippet iptables à sua declaração operating-system:

(service iptables-service-type
             (iptables-configuration
              (ipv4-rules (plain-file "iptables.rules" "\
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i br0 -o br0 -j ACCEPT
COMMIT
"))

Próximo: Roteamento de rede para libvirt, Acima: Máquinas Virtuais   [Conteúdo][Índice]