Este artigo oferece um tutorial básico e completo para iniciantes sobre a instalação e configuração de máquinas virtuais utilizando QEMU-KVM e Virt-Manager no Debian. Além disso, abordaremos a configuração de NAT e forneceremos um script pronto para otimizar a operação da máquina virtual. Com este guia, você aprenderá conceitos essenciais de redes e virtualização de forma simples e prática.
A máquina virtual virtualiza o hardware de um PC ou dispositivo e emula sistemas operacionais nele. É totalmente virtualizado e funciona como um programa que permite rodar um sistema operacional dentro de outro.
Isolamento de softwares: Se um navegador, aplicativos, wallets de criptomoedas ou extensões forem maliciosos ou se tornarem maliciosos, eles ficam isolados dentro do SO da máquina virtual!
O que é sandboxing, container e Docker:
Docker: É uma plataforma de código aberto (open-source) para o desenvolvimento de aplicativos em uma caixa de areia (sandbox). Seus ambientes virtualizados e leves são conhecidos como contêineres.
Cada máquina virtual contém uma cópia completa do sistema operacional e do aplicativo, assim como os binários e bibliotecas necessários. Esses arquivos podem ocupar dezenas de GBs em um computador. Além disso, virtualizar o hardware para um sistema operacional convidado pode exigir uma sobrecarga substancial.
Ao invés de virtualizar o hardware, os contêineres virtualizam o sistema operacional. No Docker, os contêineres são abstrações na camada do aplicativo que podem conter tanto o código quanto as dependências. Na mesma máquina, vários contêineres podem funcionar como processos isolados.
Sandboxing envolve fornecer um ambiente seguro para um programa ou software, permitindo o uso sem prejudicar o sistema. Ele mantém o programa isolado do restante do sistema, utilizando diferentes métodos disponíveis no kernel Linux.
Virtual machine QEMU for Debian Linux:
https://www.qemu.org/download/#linux
INSTALAÇÃO MAIS COMPLETA:
Linux Debian:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y; sudo adduser seu_usuário libvirt; sudo adduser seu_usuário kvm; sudo systemctl status libvirtd; sudo systemctl start libvirtd; sudo systemctl enable libvirtd;
Entrar:
sudo virt-manager;
Observação: Sempre use o Virt-Manager, preferencialmente com sudo, pois para a configuração de NAT e outras redes, o sistema precisa de permissões de root para configurar o firewall iptables do Debian.
Para usar o Virt-Manager em redes que não utilizam o firewall, pode ser que funcione normalmente. Um exemplo disso é o uso do modo macvtap, que será abordado em um artigo mais avançado.
Desinstalar:
Apagar dados de /var/lib/libvirt/qemu/channel/target
e:
sudo apt purge qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y; sudo apt remove qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y;
NAT: Quando configurada com NAT (Network Address Translation), a máquina virtual fica isolada da rede local. Nesse modo, o tráfego de rede da VM é redirecionado através do endereço IP do host, como se o host fosse um roteador. Isso significa que a VM pode acessar a rede externa (como a internet), mas os outros dispositivos na rede não podem se comunicar diretamente com a VM.
Bridge: Quando configurada em modo Bridge, a máquina virtual se comporta como um dispositivo físico na rede local. A VM se torna visível para todos os outros dispositivos e máquinas na rede, podendo comunicar-se diretamente com eles. Essa configuração faz com que a VM receba um IP próprio na rede local, facilitando a comunicação com outros dispositivos.
Neste tutorial, abordaremos a configuração de NAT, e não entraremos em detalhes sobre o modo Bridge. Teremos um guia específico para essa configuração em outro artigo.
Um atacante, para atingir sua máquina virtual, precisa primeiro invadir seu computador e, em seguida, invadir a VM, que está isolada e não visível para a rede. Isso torna as operações na VM mais seguras para tarefas que exigem maior proteção.
Se você usa a rede em modo Bridge, Route ou MacVTap (que abordaremos em outros artigos), sua VM se conectará diretamente ao roteador ou switch da rede, tornando-a visível para outras máquinas. Nesse cenário, os atacantes poderiam realizar escaneamentos de rede, roubar seu endereço MAC ou coletar metadados de sua VM na rede, aumentando os riscos de ataques.
O firewall ficará aberto e sem proteção após desligar o modo de rede NAT, que vamos aprender a configurar neste tutorial!
Sempre que desligar a rede NAT no Virt-Manager, é necessário, antes, desconectar a internet do PC e reconfigurar o firewall com as regras que você utiliza!
Em nosso script automatizado do Virt-Manager, ele apaga a rede padrão NAT, remove todas as regras do iptables e reconfigura com regras de kernel e regras básicas de iptables para segurança do sistema, baseado no script https://github.com/leandroibov/iptables_kernel_basico.
O Virt-Manager adiciona regras no iptables para o modo NAT funcionar sem apagar as regras existentes. Isso pode gerar conflitos, fazendo com que a rede colapse ou não funcione corretamente!
Por isso, você deve baixar e usar os scripts do libvirt no GitHub do Leandroibov, que corrigirão esse problema!
Baixe os scripts em: https://github.com/leandroibov/virt-manager-kvm-qemu-nat-network-script-iptables
Autorize a execução desses scripts com:
sudo chmod +x virt_manager_br10.sh virt_manager_br11.sh virt_manager_delete.sh virt_manager_start.sh virt_manager_stop.sh
Para executar, use: ./virt_manager_br10.sh
por exemplo, ou copie para /bin com:
sudo cp -r virt_manager_br10.sh virt_manager_br11.sh virt_manager_delete.sh virt_manager_start.sh virt_manager_stop.sh /bin/;
Depois disso, basta executar em qualquer local no terminal com o nome de um dos scripts, sem precisar navegar até a pasta em que eles estão.
O que faz cada um:
Este script automatiza o processo de configuração de uma rede NAT no Virt-Manager, permitindo criar uma rede virtual para máquinas virtuais (VMs) que se conectam à rede externa por meio de um endereço IP privado.
1. Criação do Arquivo de Rede (br10.xml): O script cria um arquivo XML de configuração da rede NAT (br10.xml). Ele define uma rede com NAT, um intervalo de portas de 1024 a 65535, e configura um DHCP com um intervalo de endereços IP de 192.168.30.50 a 192.168.30.200. O nome da rede é br10
.
Você pode criar o arquivo br10.xml manualmente colocando o código abaixo nele e depois executar o comando sudo virsh net-define br10.xml no terminal no mesmo local que br10.xml se encontra!
<network> <name>br10</name> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='br10' stp='on' delay='0' /> <ip address='192.168.30.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.30.50' end='192.168.30.200'/> </dhcp> </ip> </network>
2. Desligamento da Rede de Segurança: O script desliga as interfaces de rede para garantir que o processo de configuração não seja interrompido. Ele usa comandos para desligar o NetworkManager
e parar os serviços de rede.
sudo service network-manager stop; sudo systemctl stop NetworkManager; sudo nmcli networking off;
3. Reinício dos Serviços do Virt-Manager: O script reinicia os serviços do libvirtd
e reinicia o socket do libvirtd
, além de garantir que esses serviços iniciem automaticamente na inicialização do sistema.
sudo service network-manager stop; sudo service network-manager start; sudo service network-manager restart; sudo systemctl stop NetworkManager; sudo systemctl disable NetworkManager; sudo systemctl enable NetworkManager; sudo systemctl start NetworkManager; sudo systemctl restart NetworkManager; sudo nmcli networking off; sudo nmcli networking on;
4. Limpeza das Regras do Firewall: O script limpa as regras atuais do firewall utilizando o iptables
, garantindo que não haja conflitos de regras de firewall que possam impedir a comunicação da rede NAT.
sudo iptables -F # Remove as regras de todas as chains sudo iptables -X # Apaga todas as chains sudo iptables -Z # Zera as regras de todas as chains sudo iptables -P INPUT ACCEPT; sudo iptables -P FORWARD ACCEPT; sudo iptables -P OUTPUT ACCEPT; sudo iptables -t filter -F; sudo iptables -t filter -X; sudo iptables -t filter -Z; sudo iptables -t nat -F; sudo iptables -t nat -X; sudo iptables -t nat -Z; sudo iptables -t mangle -F; sudo iptables -t mangle -X; sudo iptables -t mangle -Z; sudo iptables -t raw -F; sudo iptables -t raw -X; sudo iptables -t raw -Z;
5. Habilitação do Encaminhamento de IP (IP Forwarding): O script garante que o encaminhamento de pacotes IP esteja ativado, permitindo que a máquina virtual acesse a rede externa via a rede NAT.
sudo echo 1 > /proc/sys/net/ipv4/ip_forward; cat /proc/sys/net/ipv4/ip_forward;
6. Configuração do Virt-Manager: O script configura o Virt-Manager para usar a rede definida (br10.xml
), iniciando a rede e configurando-a para iniciar automaticamente. Ele também verifica se a rede foi criada corretamente.
sudo virsh list --all; sudo virsh net-define br10.xml; sudo virsh net-start br10; sudo virsh net-autostart br10; ip addr show dev br10;
7. Reinício do NetworkManager
: Após a configuração da rede, o script reinicia o NetworkManager
para aplicar as alterações de rede.
sudo service network-manager stop; sudo service network-manager start; sudo service network-manager restart; sudo systemctl stop NetworkManager; sudo systemctl disable NetworkManager; sudo systemctl enable NetworkManager; sudo systemctl start NetworkManager; sudo systemctl restart NetworkManager; sudo nmcli networking off; sudo nmcli networking on;
8. Exibição das Regras de Firewall e VMs e Redes Virt-Manager: Finalmente, o script exibe as regras de firewall (iptables
) e lista as redes disponíveis no Virt-Manager.
sudo iptables -t filter -S; sudo iptables -t nat -S; sudo iptables -t mangle -S; sudo iptables -t raw -S; sudo virsh list --all; sudo virsh net-list;
Doar monero para ajudar no crescimento desse projeto: Clique aqui!