Host e VM com duas redes

Um computador presente em duas redes ao mesmo tempo pode ser interessante para interligar ações entre elas. Mas como fazer isso? E se quisermos que uma máquina virtual (VM), hospedada nesse computador (o host) esteja também com duas redes? Vejamos como implementar esse cenário usando software livre (Linux Debian e KVM/QEMU).

Preparação das máquinas

Como a configuração de rede no exemplo é feita usando o arquivo “/etc/network/interfaces”, é prudente excluir o programa “network-manager” para evitar conflito entre dois gerenciadores de rede em um mesmo computador. Isso pode ser feito através do seguinte comando:

Além disso, é bom instalar o pacote “resolvconf”, que atua como intermediário entre programas que fornecem informações de servidor de nomes e aplicativos que usam essa informação. Desse modo, o IP do servidor de nomes será copiado informado no arquivo de configuração de rede será copiado automaticamente para o arquivo “/etc/resolv.conf” ao reiniciar a rede. Para a instalação, execute o seguinte comando:

No IPV4, os endereços IP são compostos por 4 blocos de 8 bits (octetos), que são representados através de números de 0 a 255 (cobrindo as 256 possibilidades permitidas por 8 bits). As faixas de endereços começadas com “10”, “192.168” ou de “172.16” até “172.31” são reservadas para uso em redes locais e por isso não são usadas na internet. As duas redes usadas nesse exemplo começam com 10.1 e 10.2.

Nesse exemplo, é utilizado o KVM, um software livre para virtualização via hardware para Linux – veja mais no post sobre Máquina Virtual. Após sua instalação, o painel gráfico de controle pode ser acessado pelo comando virt-manager. Nele, serão instaladas e configuradas as duas placas de rede.

Máquina Física (host)

O hospedeiro deve ter duas placadas de rede físicas instaladas, uma para cada rede. Por exemplo: uma placa on-board, de fábrica, e uma off-board, inserida em um slot PCI. O Linux instalado nesse exemplo é o Debian versão 9 (Stretch). Isso é importante porque o padrão para nomear os dispositivos de rede é um pouco diferente das versões anterioes. A relação pode ser descoberta através do seguinte comando:

Deve aparecer o modelo das duas placas de rede, permitindo saber o nome interno de cada uma (nesse exemplo, tg3 é o nome da placa on-board e r8169 é a off-board). Também aparecem duas linhas com as informações “r8169 (…) enp1s4: renamed from eth0” e “tg3 (…) enp4s0: renamed from eth0”, mostrando a relação entre o hardware e o nome do dispositivo dado pelo sistema.

Considerando que as redes tem IPs fixos (static), podemos preencher os campos com o nome dos dispositivos e o endereço de IP de cada uma, assim como os respectivos gateways e netmasks. No entanto, lembre-se de que também devemos compartilhar a rede com a máquina virtual.

De acordo com o item do KVM na wiki do Debian, para conectar o hospedeiro com o convidado e o resto do mundo, deve-se construir uma bridge (ou ponte). A bridge é um repetidor inteligente que opera na camada de dados do modelo OSI, transferindo os dados de um computador para outro verificando os MAC address dos envolvidos.

A bridge é chamada no arquivo de configuração como “br0” (para compartilhar a rede 10.1) e “br1” (que compartilha a rede 10.2). Ela possui pelo menos quatro parâmetros: bridge_ports (o nome do dispositivo no host), bridge_stp on (usado para permitir que várias pontes funcionem juntas, sendo que STP significa “Spanning Tree Protocol”), bridge_fd 0 (define o delay para as interfaces se juntarem à bridge, sendo que fd é “forwarding delay”) e bridge_maxwait 0 (quanto tempo o sistema aguardará a chegada das portas Ethernet).

Finalmente, a configuração do arquivo /etc/network/interfaces fica assim:

Caso a 10.2 for uma rede “standalone”, deve-se comentar o campo “gateway”. Como a 10.2 não tem acesso à internet, não faz sentido usar o DNS para ela – as máquinas física e virtual vão ter acesso à internet somente pela rede 10.1.

Máquina Virtual (VM)

Com a máquina virtual instalada, usar o painel de controle (virt-manager) para alterar as configurações de rede. Deve-se adicionar duas placas e configurá-las desse modo:

* Ponte br0: Dispositivo host vnet2 ; Modelo rtl8139

* Ponte br1: Dispositivo host enp1s4 ; Modelo rtl8139

Só para ficar um pouco diferente, a máquina virtual está com Linux Debian 7 (Wheezy), então as redes mantém os costumeiros nomes “eth0” e “eth1”. Acessando-a, configurar o arquivo /etc/network/interfaces da seguinte forma:

Os parâmetros network e broadcast são opcionais. Os finais dos IPs não precisam ser iguais entre as redes, como está no exemplo, mas os IPs devem ser diferentes entre a VM e a host. Para mais informações (como reiniciar a rede, arquivo de configuração, etc), veja o post sobre Comandos de rede Linux.