Modificando regras de firewall libvirt entre redes virtuais

1

No meu host da minha VM, tenho duas redes virtuais libvirt:

  • virbr0: 192.168.122.1/255.255.255.0
  • virbr1: 192.168.130.1/255.255.255.0

Eu tenho uma VM por trás de cada uma dessas redes virtuais. As máquinas podem ver o host e ver a Internet. No entanto, quando tento conectar-me de uma rede a outra, obtenho "conexão recusada", embora esteja conectando a uma porta que sei estar aberta.

Eu desativei o UFW (host é Ubuntu) e ainda falha. Nada é registrado, então não tenho certeza qual regra está bloqueando isso. Meu bloco FORWARD (eu suponho criado pelo virtlib) é:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             192.168.130.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.130.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Se eu limpar todas as regras de firewall, as VMs em diferentes redes virtuais poderão se comunicar, mas é claro que não conseguirão falar sobre os hosts da VM.

Eu encontrei se me livrei dessas regras:

-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable

As VMs podem, então, conversar entre si. Isso é ótimo, mas como instruir a libvirt a modificar como ela cria as regras de encaminhamento para que não proíba o tráfego entre as redes virtuais?

Obrigado por quaisquer dicas, ponteiros ou URLs!

    
por Joshua Kugler 16.03.2016 / 08:30

1 resposta

1

Isso está acontecendo porque você configurou suas redes virtuais como redes "nat".

Essa rede é configurada para que possa acessar somente:

  • Outras máquinas virtuais na mesma rede virtual
  • O host
  • A rede externa (geralmente a Internet)

Em particular, o acesso a qualquer outra rede virtual no host é bloqueado, como você descobriu.

Para resolver este problema, é necessário dois passos:

  1. Reconfigure cada rede virtual como uma rede "roteada", sem NAT. Neste caso, o libvirtd não tentará isolar as redes virtuais umas das outras, mas também não executará nenhum NAT.

    Você precisará fazer isso editando o XML (com virsh net-edit networkname ; a GUI do virt-manager não pode fazer essa alteração):

      <forward mode='nat'/>
    

    deve ser alterado para:

      <forward mode='route'/>
    

    Esta alteração entrará em vigor quando você desligar todas as VMs usando a rede, interromper a rede ( virsh net-stop networkname ), reiniciar a rede ( virsh net-start networkname ) e reiniciar todas as VMs usando a rede.

  2. Você também terá que inserir suas próprias regras de mascaramento, se quiser que as máquinas virtuais acessem a Internet.

    Por exemplo, em a seção da tabela nat de /etc/ufw/before.rules :

    -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE
    -A POSTROUTING -s 192.168.130.0/24 -o eth0 -j MASQUERADE
    

Como alternativa, você pode esquecer tudo isso e criar uma nova rede virtual que é isolada e fornecer a cada VM uma segunda NIC virtual conectada à rede isolada. As VMs podem se comunicar por meio dessa rede.

    
por 16.03.2016 / 08:47