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

26

Ok, então eu quero saber como fazer redes em contêineres LXC. Não apenas o tipo de informação vaga que você obtém dos outros sites, mas um verdadeiro guia para iniciantes para fazê-los funcionar. Como a maioria dos exemplos é basicamente configurada 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 criar, iniciar e parar um contêiner. Meu servidor obviamente tem um IP 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 existir uma ponte no meu contêiner atual, parece que eu 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 alterações na minha configuração de ponte no host? É realmente melhor fazê-lo com a opção MACVLAN?

Qualquer ajuda seria apreciada.

user132151
fonte
Eu não estou familiarizado com o LXC, mas seu provedor de serviços de Internet normalmente fornece apenas um endereço IP público. Você tem um pacote com vários ips estáticos?
precisa saber é o seguinte
IPs voltados ao público não são o único caso de uso, queremos que dois IPs públicos sejam atribuídos aos nossos contêineres de balanceador de carga, mas queremos IPs de LAN dedicados dedicados a uma variedade de outros serviços. Dessa forma, se nós nos movemos recipientes em torno de hardware diferente é tão fácil como mover o IP (DNS não funciona nesse sentido para alguns dos componentes que usamos)
David Parks

Respostas:

23

Minha abordagem pressupõe que seu servidor tenha uma única NIC e você precisará compartilhá-la entre o host e os convidados LXC. Isso envolve o uso de uma ponte. A ponte possui e gerencia 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. Cometa isso errado e você poderá ficar bloqueado no servidor. Certifique-se de ter um login local ativado e de 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 eth0por 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, substitua:

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

      com:

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

      Você está apenas mudando eth0para br0e adicionando a bridge_ports eth0linha.

    3. Reinicie o host. Se você estava fazendo isso localmente, execute sudo ifdown eth0antes de começar e sudo ifup br0depois também o faria. Observe que a ponte pode demorar um pouco para aparecer, portanto, aguarde cinco minutos após a reinicialização antes de assumir que tudo está perdido.

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

    1. Pare o recipiente.
    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 altere lxc.network.linkpara br0.

  5. Se você não precisar da ponte NAT fornecida pelo LXC (por exemplo, todos os seus contêineres usarão a nova ponte), no host edite /etc/default/lxce mude USE_LXC_BRIDGEpara "false"e, em seguida, na execução do host sudo service lxc restart.

Robie Basak
fonte
Obrigado! Existem muitas perguntas semelhantes por aí. Mas, essa resposta finalmente me ajudou a fazer as coisas funcionarem.
Mausy5043
1

Robie, muito obrigada por postar esta resposta, eu venho tentando arrancar isso e esse foi 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 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 maneira, apenas queremos um IP sem apelidos como Robie indicado 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/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 deve finalmente funcionar! :)

Gregory Wolf
fonte
1

Eu tive o mesmo problema e tenho esta 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 exige muito esforço! Felicidades.

andrea
fonte