Usando o LXC – Networking através de Bridge

Introdução

No post anterior vimos como instanciar um container do zero. Nesse post voltaremos nossa atenção na configuração de rede, como deixar nossos containers com acesso à rede local e a internet. Antes de mais nada, vamos entender o que acontece com nossa configuração de rede quando instalamos o LXC.

Gerenciamento de bridges

Após concluir a instalação do LXC, o mesmo cria automaticamente uma bridge no sistema que será utilizada por todos os containers para realizar comunicação entre eles. Uma bridge interliga dois ou mais segmentos de rede que utilizem tecnologias distintas em uma mesma rede. Essa bridge é chamada de lxcbr0 e pode ser verificado com o comando abaixo.

$ sudo ifconfig
lxcbr0
Figura 1: Saída do comando ifconfig

Para podermos editar as bridges configuradas precisaremos do utilitário bridge-utils instalado. O comando abaixo realiza a instalação do utilitário.

$ sudo apt-get install bridge-utils

Feito isso podemos verificar quais bridges estão configuradas em nosso sistema através do comando:

$ brctl show
bridge name     bridge id         STP enabled      interfaces
lxcbr0          8000.000000000000 no 

Existe apenas uma bridge em nosso sistema e ela não está interligado a nenhuma interface física. Para isso, vamos criar uma nova bridge e interligá-la a nossa interface ethernet (eth0). Uma observação bastante importante é que não é possível interligar uma bridge a uma interface wireless. O motivo pode ser encontrado nesse link.

Dito isso, vamos configurar uma bridge fixa que é inciada automaticamente quando ligamos a máquina. Devemos adicionar as seguintes linhas no arquivo /etc/network/interfaces.

auto lo
iface lo inet loopback
auto br0
iface br0 inet static
  address 192.168.0.27
  network 192.168.0.0
  netmask 255.255.255.0
  broadcast 192.168.0.255
  gateway 192.168.0.1
  bridge_ports eth0
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_stp off

A minha rede pessoal é configurada na classe C com endereço 192.168.0.0/24. A bridge criada é interligada com a interface eth0  (observada no parâmetro bridge_ports). Endereço de broadcast, gateway, rede e endereço IP são configurados de acordo com a rede de cada pessoa. O nome da bridge configurada é br0. O ip é estático e definido como 192.168.0.27. Os demais parâmetros são apresentados abaixo:

  • bridge_fd: delay de retransmissão.Padrão é 15s.
  • bridge_spt off: desativa o protocolo Spanning Tree Protocol
  • bridge_maxage: Tempo máximo de mensagens. Padrão é 20s.
  • bridge_hello: Tempo de mensagem hello. Padrão é 2s.

Após configurado, o arquivo /etc/network/interfaces é carregado pelo programa ifup que é responsável em gerenciar toda a configuração da parte da rede no sistema linux. Esse programa lê linha a linha e quando encontra alguma linha responsável por configurações de bridge, encaminha para o brctl, realizando a devida configuração.

Para criar a bridge e interligá-la, vamos reiniciar o daemon responsável pelo ifup. O comando abaixo reinicia o processo de networking:

$ sudo service networking restart

Observe através do comando ifconfig se a interface br0 aparece configurada. Caso não, reinicie a máquina com o comando abaixo.

$ sudo init 6

Uma observação importante: Se você não estiver utilizando a interface eth0 (cabo desconectado), comente as linhas referentes a configuração da bridge. Caso contrário, o processo de inicialização da máquina irá demorar mais que o normal pois o ifup vai tentar configurar uma bridge que não tem ponto de interligação.

Configurando a rede dos containers

Após criar a bridge, devemos associa-la aos containers para oferecer acesso à rede e a internet. Todas as configurações relativas a um determinado container são realizadas no arquivo /var/lib/lxc/NOME_DO_CONTAINER/config. Através desse arquivo podemos limitar e extender os recursos que serão utilizados pelos containers como processamento, memória, rede, disco, etc. Utilizaremos como exemplo o container criado no último post (ubuntulxc).

$ sudo vim /var/lib/lxc/ubuntulxc/config

Agora, iremos alterar as seguintes linhas:

...
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
...

O tipo de comunicação criado será o virtual ethernet (veth) que cria uma interface virtual para cada container e interliga ao link definido em lxc.network.link. Devemos alterar o link da rede para utilizar a bridge recém criada.

Após alterar o arquivo, salve as configurações e inicie o container normalmente. Dentro do container verifique se o mesmo está com um ip definido (se houver algum servidor dhcp em sua rede ele deve ter recebido um ip para utilizar a rede). Caso contrário, tente atribuir manualmente um ip como descrito no comando abaixo. Nesse exemplo irei configurar o endereço do container baseado na minha rede (adapte para a rede de vocês).

$ sudo ifconfig eth0 192.168.0.50 netmask 255.255.255.0

Feito isso, vamos testar alcançar um site na internet.

$ ping -c 3 www.google.com
PING www.google.com (216.58.219.68) 56(84) bytes of data.
64 bytes from mia07s24-in-f4.1e100.net (216.58.219.68): icmp_seq=1 ttl=52 time=185 ms
64 bytes from mia07s24-in-f4.1e100.net (216.58.219.68): icmp_seq=2 ttl=52 time=180 ms
64 bytes from mia07s24-in-f4.1e100.net (216.58.219.68): icmp_seq=3 ttl=52 time=181 ms
--- www.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 180.945/182.538/185.568/2.199 ms

Se a taxa de perda de pacotes não for igual a 100% significa que a configuração foi realizada com sucesso e o container está tendo acesso a internet! O próximo passo é utilizá-lo da maneira que você desejar (instalando pacotes, etc).

Conclusão

O vídeo abaixo explica como podemos realizar a instalação do LXC em nossas máquinas.

A configuração de rede realizada não é a única possível para intercomunicar containers. Poderíamos configurá-los também em macvlan, acesso direto, etc. Esses e outros meios serão vistos mais a frente.

Dúvidas ou sugestões deixem nos comentários. Curtam e compartilhem para ajudar o nosso projeto crescer. Keep learning!

Referências

[1] http://man7.org/linux/man-pages/man5/lxc.container.conf.5.html

[2] https://docs.oracle.com/cd/E37670_01/E37355/html/ol_containers.html

[3] https://docs.oracle.com/cd/E37670_01/E37355/html/ol_subsystems_cgroups.html#ol_cpu_cgroups

Um comentário

Deixe um comentário