Endereço IP público para o contêiner LXC

25

Ok, quero saber como fazer networking em contêineres LXC. Não apenas o tipo de informação vaga que você recebe dos outros sites, mas um verdadeiro guia para iniciantes para fazê-los funcionar. Como a maioria dos exemplos são basicamente configurados para as pessoas testarem, eu quero executar um serviço em um ... como um servidor web, por exemplo.

Estou executando o Ubuntu 12.04 LTS e tenho o LXC instalado e posso fazer, iniciar e parar um contêiner. Meu servidor obviamente tem um IP voltado para o público e eu gostaria de saber como configurar um contêiner para que ele também possa ter um IP público. Como já parece haver uma ponte no lugar do meu contêiner atual, parece que eu preciso fornecer aos contêineres um intervalo DHCP que seja público para eles funcionarem ou atribuir manualmente um endereço IP estático ao meu contêiner.

Se eu quiser atribuir estaticamente um IP ao contêiner, como faço isso? Preciso fazer alguma alteração na configuração da minha ponte no host? É realmente melhor fazê-lo com a opção MACVLAN?

Qualquer ajuda seria apreciada.

    
por user132151 15.02.2013 / 06:51

3 respostas

22

Minha abordagem pressupõe que seu servidor tenha um único NIC e você precise compartilhar esse NIC entre o host e os convidados do LXC. Isso envolve o uso de uma ponte. A ponte possui e gerencia eth0 . O host agora configura sua própria rede em br0 em vez de eth0 . Os convidados do LXC estão configurados para se conectarem à ponte.

  1. No host, sudo apt-get install bridge-utils .

  2. No host, substitua eth0 por uma ponte:

    Isso é perigoso. Faça isso errado e você pode ser bloqueado do seu servidor. Certifique-se de ter um login local ativado e que o acesso ao console local funcione, para que você possa reverter essa alteração se tiver algum problema.

    Em /etc/network/interfaces :

    1. Substitua auto eth0 por auto br0 .
    2. Substituir:

      iface eth0 inet dhcp
      

      com:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Se você tivesse uma configuração de rede estática, substituiria:

      iface eth0 inet static
          address ...
          netmask ...
          gateway ...
          etc.
      

      com:

      iface br0 inet static
          bridge_ports eth0
          address ...
          netmask ...
          gateway ...
          etc.
      

      Você está apenas alterando eth0 para br0 e adicionando a linha bridge_ports eth0 .

    3. Reinicie o host. Se você estava fazendo isso localmente, então executar sudo ifdown eth0 antes de começar, e sudo ifup br0 depois também funcionaria. Note que a ponte pode demorar um pouco para aparecer, então dê cinco minutos após a reinicialização antes de assumir que tudo está perdido.

  3. Para mover um determinado contêiner chamado LXC para um IP público:

    1. Pare o contêiner.
    2. No host, edite /var/lib/lxc/container_name/config e altere lxc.network.link para br0 .
    3. No host, edite /var/lib/lxc/container_name/rootfs/etc/network/interfaces e configure seu IP público como faria normalmente (DHCP ou uma configuração estática, conforme necessário). Observe que a interface ainda é chamada eth0 do ponto de vista do contêiner.
    4. Reinicie o contêiner.
  4. Para alterar o padrão dos novos contêineres LXC, edite /etc/lxc/default.conf no host e altere lxc.network.link para br0 .

  5. Se você não precisar da ponte NAT fornecida pelo LXC (ou seja, todos os seus contêineres usarão a nova ponte), então na edição do host /etc/default/lxc e altere USE_LXC_BRIDGE to "false" e, em seguida, na execução do host sudo service lxc restart .

por Robie Basak 21.06.2013 / 13:10
1

Robie, muito obrigada por postar essa resposta, eu tenho trabalhado para tentar fazer isso funcionar e esse tem sido o único método que funcionou!

Eu pensei em mencionar algumas coisas que descobri para ajudar a esclarecer as instruções para outros administradores.

Meu host tinha vários aliases de IP estáticos atribuídos a eth0 no guest, por exemplo:

iface eth0:1 inet static
  address 5.5.5.5
  netmask 255.255.255.5
  gateway 5.5.5.1
etc.

Agora, não queremos configurar o br0 da mesma forma, apenas queremos um IP sem aliases como o Robie indicou acima.

Então, digamos que você queira que o 5.5.5.5 seja atribuído ao contêiner debian8.

Edite /var/lib/lxc/debian8/etc/network/interfaces e adicione:

iface eth0 inet static 
      address 5.5.5.5
      netmask 255.255.255.5
      gateway 5.5.5.1
    etc.

Emita então este comando: route add default gw <gateway-ip, in my case 5.5.5.1>

Depois disso, reinicie o contêiner e tudo deve finalmente funcionar! :)

    
por Gregory Wolf 06.06.2016 / 20:16
0

Eu tive o mesmo problema e tenho essa solução (rápida e suja).

server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24

container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28  (public ip address on eth0 alias)

No servidor: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

Além disso, se necessário, adicione rota aos roteadores upstream.

Provavelmente, não é a melhor solução, mas não requer grande esforço! Felicidades.

    
por andrea 27.10.2016 / 11:41

Tags