KVM: Como usar a rede em Modo Bridge com libvirt?

Libvirt é um software gratuito e de código aberto que fornece API para gerenciar vários aspectos das máquinas virtuais. No  Linux é geralmente usado com KVM e Qemu. Entre outras coisas, libvirt é usado para criar e gerenciar redes virtuais.  A rede padrão criada quando libvirt é  chamada de “default” e usa NAT (Network Address Translation) e encaminhamento de pacotes para conectar os sistemas emulados com o mundo “externo” (tanto o sistema host quanto a internet).

Quando libvirt está em uso e o daemon libvirtd está em execução, uma rede default é criada. Podemos ver usando a ferramenta virsh que é instalada juntamente com pacote libvirt-client.

sudo virsh net-list --all

Resultado:

Name State Autostart Persistent
--------------------------------------------
default active yes yes

 

Para vermos informações da rede e editá-la usamos  “virsh net-edit

$ sudo virsh net-edit default

Resultado:

<network>
<name>default</name>
<uuid>168f6909-715c-4333-a34b-f74584d26328</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:48:3f:0c'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>

a rede bridge virbr0 é usada modo  em NAT para conectar as máquinas virtuais que fazem parte da rede.

Veja:

ip link show type bridge

Resultado:

5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff

 

Para consultar apenas para interfaces que possuem a ponte virbr0 como mestre faça:

$ ip link show master virbr0

Resultado:

6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff

 

A interface virbr0-nic é uma interface ethernet virtual: ela é criada e adicionada à ponte automaticamente, e sua finalidade é apenas fornecer um endereço MAC estável (52:54:00:48:3f:0c neste caso) para o ponte.

Outras interfaces virtuais serão adicionadas à ponte quando criarmos e iniciarmos máquinas virtuais.

se rodarmos o comando que usamos acima para exibir as interfaces do escravo da ponte, podemos ver que um novo foi adicionado, vnet0:

$ ip link show master virbr0
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master virbr0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:e2:fe:7b brd ff:ff:ff:ff:ff:ff

Nenhuma interface física deve ser adicionada à bridge virbr0, pois ela usa NAT para fornecer conectividade.

Usando Rede em Bridge nas Máquinas Virtuais

 

Às vezes, queremos obter uma conexão bridge completa, onde os dispositivos convidados(guests) estão conectados à LAN host, sem usar NAT.

Para isso devemos criar uma nova bridge e compartilhar uma das interfaces ethernet físicas do host.

Vamos ver como fazer.

Crie uma Nova Rede Bridge

#1 Criarei uma bridge chamada br0

$ sudo ip link add br0 type bridge

#2 Verifique

$ sudo ip link show type bridge
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff

 

Adicionando uma interface ethernet física à Bridge

Observe que você não pode usar sua interface ethernet principal neste caso, pois assim que ela for adicionada à ponte você perderá a conectividade, pois ela perderá seu endereço IP. Usaremos uma interface adicional, enp0s29u1u1 que é uma interface fornecida por um adaptador USB ethernet conectado à minha máquina.

#1 certifique de que o estado da interface está ativa

$ sudo ip link set enp0s29u1u1 up

#2 adicione a interface bridge

$ sudo ip link set enp0s29u1u1 master br0

 

#3 verifique se a interface foi adicionada à rede bridge

$ sudo ip link show master br0
3: enp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
link/ether 18:a6:f7:0e:06:64 brd ff:ff:ff:ff:ff:ff

 

Atribuindo um endereço IP estático

podemos atribuir um endereço IP estático à ponte. Digamos que queremos usar 192.168.0.90/24

$ sudo ip address add dev br0 192.168.0.90/24

veja

$ ip addr show br0
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.0.90/24 scope global br0
valid_lft forever preferred_lft forever
[...]

 

Essa configuração se perderá após reinício. Para deixá-la permanente/persistente proceda assim:

DEBIAN E DERIVADOS

#1 instale o pacote bridge-utils

$ sudo apt-get install bridge-utils

#2 edite /etc/network/interfaces

# The br0 bridge settings
auto br0
iface br0 inet static
bridge_ports enp0s29u1u1
address 192.168.0.90
broadcast 192.168.0.255
netmask 255.255.255.0
gateway 192.168.0.1

 

RED HAT E DERIVADOS

Opcional: Se quiser que a rede bridge não seja gerenciado pelo NetworkManager  instale o pacote network-scripts

$ sudo dnf install network-scripts

#1 crie o arquivo /etc/sysconfig/network-scripts/ifcfg-br0

#2 coloque dentro dele o conteúdo

DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.90
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
DELAY=0
NM_CONTROLLED=0

#3 modifique ou crie o arquivo usado para configurar a interface física que vamos conectar à ponte, neste caso. Nesse caso o arquivo é /etc/sysconfig/network-scripts/ifcfg-enp0s29u1u1.

Modifique assim:

TYPE=ethernet
BOOTPROTO=none
NAME=enp0s29u1u1
DEVICE=enp0s29u1u1
ONBOOT=yes
BRIDGE=br0
DELAY=0
NM_CONTROLLED=0

 

Agora iniciar o serviço de rede

$ sudo systemctl enable --now network

 

DESABILITE NETFILTER

To allow all traffic to be forwarded to the bridge, and therefore to the virtual machines connected to it, we need to disable netfilter.

Para isso podemos criar um arquivo com a extensão .conf dentro do diretório /etc/sysctl.d, vamos chamá-lo de 99-netfilter-bridge.conf. Dentro dele escrevemos o seguinte conteúdo:

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

Para carregar as configurações escritas no arquivo, primeiro garantimos que o módulo br_netfilter esteja carregado:

$ sudo modprobe br_netfilter

Para carregar o módulo automaticamente na inicialização, vamos criar o arquivo /etc/modules-load.d/br_netfilter.conf: ele deve conter apenas o nome do próprio módulo:

br_netfilter

Uma vez que o módulo é carregado, para carregar as configurações que armazenamos no arquivo 99-netfilter-bridge.conf, podemos executar:

$ sudo sysctl -p /etc/sysctl.d/99-netfilter-bridge.conf

 

Criando uma nova rede virtual

Só agora vamos adicionar uma rede virtual nova no KVM.

#1 abra um arquivo com seu editor favorito e cole o seguinte conteúdo dentro dele, depois salve-o como bridged-network.xml:

<network>
<name>bridged-network</name>
<forward mode="bridge" />
<bridge name="br0" />
</network>

#2 Quando o arquivo estiver pronto, passamos ele para a opção net-define  do comando virsh:

$ sudo virsh net-define bridged-network.xml

#3 Para ativar a nova

$ sudo virsh net-start bridged-network
$ sudo virsh net-autostart bridged-network

rede e fazer com que ela seja iniciada automaticamente, devemos executar:

#4 verifique

$ sudo virsh net-list
Name State Autostart Persistent
----------------------------------------------------
bridged-network active yes yes
default active yes yes

#5 Agora podemos selecionar a rede pelo nome ao usar a opção –network:

$ sudo virt-install \
--vcpus=1 \
--memory=1024 \
--cdrom=debian-10.8.0-amd64-DVD-1.iso \
--disk size=7 \
--os-variant=debian10 \
--network network=bridged-network

 

 

Alternativa:

Se estiver usando a interface gráfica virt-manager, poderemos selecionar a rede ao criar a nova máquina virtual:

 

Prontinho!

 

Esse post é baseado em:  linuxconfig

 

2 Comments to “KVM: Como usar a rede em Modo Bridge com libvirt?”

  1. Muito bom o tutorial, mas realmente difícil de seguir com a formatação desse jeito, caso seja possível corrigir ficaria bem legal, obrigado.

Deixe um comentário

O seu endereço de e-mail não será publicado.