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

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

Ok, quero saber como fazer networking em contêineres LXC. Não apenas o tipo de informação vaga que você obtém de 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, quero executar um serviço em um deles... como um servidor web, por exemplo.

Estou executando o Ubuntu 12.04 LTS e tenho o LXC instalado e posso criar, iniciar e parar um contêiner. Obviamente, meu servidor tem um IP público e 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 em vigor no meu contêiner atual, parece que preciso fornecer aos contêineres um intervalo DHCP público para que eles funcionem 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 fazer isso com a opção MACVLAN?

Qualquer ajuda seria apreciada.

Responder1

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

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

  2. No host, substitua eth0por uma ponte:

    Isso é perigoso. Se errar, você poderá ficar sem acesso ao seu servidor. Certifique-se de ter um login local habilitado 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. Substituir auto eth0com 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 eth0e br0adicionando a bridge_ports eth0linha.

    3. Reinicie o host. Se você estivesse fazendo isso localmente, executar sudo ifdown eth0antes de começar e sudo ifup br0depois também serviria. Observe que a ponte pode demorar um pouco para subir, então aguarde cinco minutos após a reinicialização antes de presumir que tudo está perdido.

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

    1. Pare o contêiner.
    2. No host, edite e mude para ./var/lib/lxc/container_name/configlxc.network.linkbr0
    3. No host, edite 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 do ponto de vista do contêiner./var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. Reinicie o contêiner.
  4. Para alterar o padrão para novos contêineres LXC, edite /etc/lxc/default.confno host e mude lxc.network.linkpara 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), no host edite /etc/default/lxce mude USE_LXC_BRIDGEpara "false"e, em seguida, no host execute sudo service lxc restart.

Responder2

Robie, muito obrigado por postar esta resposta, estou arrepiando meu cabelo tentando fazer isso e esse foi o único método que funcionou!

Achei que deveria 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 convidado, 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, queremos apenas um IP sem aliases como Robie indicado acima.

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

Edite /var/lib/lxc/debian8/etc/network/interfacese adicione:

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

Em seguida, emita este comando:route add default gw <gateway-ip, in my case 5.5.5.1>

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

Responder3

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! Saúde.

informação relacionada