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:
sudo apt-get purge network-manager
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:
apt-get install resolvconf
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:
dmesg | grep eth
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:
# REDE 10.1 auto enp4s0 allow-hotplug enp4s0 iface enp4s0 inet static auto br0 iface br0 inet static address 10.1.0.10 netmask 255.255.255.0 gateway 10.1.0.1 bridge_ports enp4s0 bridge_stp on bridge_fd 0 bridge_maxwait 0 dns-nameservers 8.8.8.8 dns-search domain.com.br # REDE 10.2 auto enp1s4 allow-hotplug enp1s4 iface enp1s4 inet static auto br1 iface br1 inet static address 10.2.0.10 netmask 255.255.255.0 gateway 10.2.0.1 bridge_ports enp1s4 bridge_stp on bridge_fd 0 bridge_maxwait 0
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:
# REDE 10.1 #allow-hotplug eth0 auto eth0 iface eth0 inet static address 10.1.0.11 netmask 255.255.255.0 network 10.1.0.0 broadcast 10.1.0.255 gateway 10.1.0.1 auto eth1 iface eth1 inet static address 10.2.0.11 netmask 255.255.255.0
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.
A programação é em hebraico…