A Qemu VM pode ser conectada à LAN principalmente de duas maneiras: type=user
ou type=tap
. O user
modo isola completamente a VM na rede privada, que é sNATed para hospedar a pilha de rede principal. O uso do tap
é mais complicado, ele precisa de um virtual bridge
para se tornar mestre de uma interface física ( eth0
) e interface virtual ( tap0
). O tap0
é como um tubo para dados fluindo de fora do mundo e host para a VM. Passei muitas horas tentando regular o tráfego de rede na tap0
interface com o lado do host iptables
/nftables
para redirecionar, por exemplo, todas as solicitações http para algum endereço IP interno, mas sem sucesso. Todos os conselhos, fóruns e wiki recomendam muitas soluções, que não podem funcionar, devido ao principal motivo: os pacotes da VM convidada nunca chegam à pilha de rede do kernel do host. Eles escolhem seu caminho no nível da ponte e não atendem a nenhuma regra de firewall ajustada por nenhuma cadeia de filtro de pacotes, se o endereço IP do host não for seu alvo. Você pode tentar simplesmente definindo a política global do host para DROP
(com host XYtables) e poderá ver: a rede do host está completamente inoperante, mas o convidado pode continuar a enviar e receber pacotes pela rede.
Bem, a pergunta: Existe alguma outra maneira de conectar virtualmente a VM convidada a uma interface de rede virtual do host? Para melhor entendimento seguem os gráficos:
General virtual connections for host/VM guest
+---------------------------------------------+
| +-----------------------------+ |
| | iptables host kernel | |
| | nftables network stack | |
| +-------+---------------------+ |
| | |
| +-------+---------+ +-----------+ |
---eth0--+ virtual | | VM | |
| | bridge +-tap-eth0 guest | |
---eth1--+ br0 | | | |
| +-----------------+ +-----------+ |
+---------------------------------------------+
Host became a router for VM guest
+-------------------------------------+
| +----------------+ +---------+ |
---eth0--> host kernel | | VM | |
| | <-vppp guest | |
---eth1--> network stack | | | |
| +----------------+ +---------+ |
+-------------------------------------+
Para resolver meu problema, deve haver uma maneira de controlar (com nftables, por exemplo) o tráfego da própria ponte virtual, ou como conectar a interface de rede convidada da VM por meio de um fio virtual a uma interface de rede virtual do host. Algo como uma rede PPPoE.
Mas a maneira definitiva e mais clara é adicionar mais alguns parâmetros à rede do modo de usuário Qemu para poder forçar o redirecionamento de algumas portas (serviços) para o endereço de destino escolhido, incluindo o loopback do host. Sim, enviei esses desejos à equipe do Qemu e obtive uma resposta: não é o recurso mais necessário.