Próximo: Roteamento de rede para libvirt, Acima: Máquinas Virtuais [Conteúdo][Índice]
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.
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.
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")
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
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]