Dirección IP pública para contenedor LXC

Dirección IP pública para contenedor LXC

Bien, quiero saber cómo hacer redes en contenedores LXC. No solo el tipo de información vaga que obtienes de otros sitios web, sino una verdadera guía para principiantes para hacerlos funcionar. Dado que la mayoría de los ejemplos están básicamente configurados para que la gente los pruebe, quiero ejecutar un servicio en uno... como un servidor web, por ejemplo.

Estoy ejecutando Ubuntu 12.04 LTS y tengo LXC instalado y puedo crear, iniciar y detener un contenedor. Obviamente, mi servidor tiene una IP pública y me gustaría saber cómo configurar un contenedor para que también pueda tener una IP pública. Dado que ya parece haber un puente desde mi contenedor actual, parece que necesito darles a los contenedores un rango de DHCP que sea público para que funcionen o asignar manualmente una dirección IP estática a mi contenedor.

Si quiero asignar estáticamente una IP al contenedor, ¿cómo lo hago? ¿Necesito realizar algún cambio en la configuración de mi puente en el host? ¿Es realmente mejor hacerlo con la opción MACVLAN?

Cualquier ayuda sería apreciada.

Respuesta1

Mi enfoque supone que su servidor tiene una única NIC y que necesita compartir esa NIC entre el host y los invitados de LXC. Esto implica el uso de un puente. El puente posee y administra eth0. El host ahora configura su propia red en br0lugar de eth0. Los invitados LXC están configurados para conectarse al puente.

  1. Sobre el anfitrión, sudo apt-get install bridge-utils.

  2. En el host, reemplácelo eth0con un puente:

    Esto es peligroso. Si hace esto mal, podría quedarse sin acceso a su servidor. Asegúrese de tener habilitado un inicio de sesión local y que el acceso a la consola local funcione, para que pueda revertir este cambio si tiene algún problema.

    En /etc/network/interfaces:

    1. Reemplazar auto eth0con auto br0.
    2. Reemplazar:

      iface eth0 inet dhcp
      

      con:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Si tuvieras una configuración de red estática, entonces reemplazarías:

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

      con:

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

      Simplemente estás cambiando eth0y br0agregando la bridge_ports eth0línea.

    3. Reinicie el host. Si estuviera haciendo esto localmente, ejecutarlo sudo ifdown eth0antes de comenzar y sudo ifup br0después también sería suficiente. Tenga en cuenta que el puente puede tardar un poco en aparecer, así que espere cinco minutos después del reinicio antes de asumir que todo está perdido.

  3. Para mover un contenedor LXC con nombre determinado a una IP pública:

    1. Detener el contenedor.
    2. En el host, edite y cambie a ./var/lib/lxc/container_name/configlxc.network.linkbr0
    3. En el host, edite y configure su IP pública como lo haría normalmente (DHCP o una configuración estática según sea necesario). Tenga en cuenta que la interfaz todavía se llama desde el punto de vista del contenedor./var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. Reinicie el contenedor.
  4. Para cambiar el valor predeterminado para los nuevos contenedores LXC, edítelo /etc/lxc/default.confen el host y cámbielo lxc.network.linka br0.

  5. Si no necesita el puente NAT proporcionado por LXC (es decir, todos sus contenedores usarán el nuevo puente), entonces en el host edite /etc/default/lxcy cambie USE_LXC_BRIDGEa "false"y luego en el host ejecute sudo service lxc restart.

Respuesta2

Robie, muchas gracias por publicar esta respuesta. Me he estado arrancando el pelo intentando que esto funcione y este ha sido el único método que ha funcionado.

Pensé que debería mencionar algunas cosas que descubrí para ayudar a aclarar las instrucciones para otros administradores.

Mi anfitrión tenía varios alias de IP estática asignados a eth0 en el invitado, por ejemplo:

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

Ahora no queremos configurar br0 de la misma manera, solo queremos una IP sin alias como Robie indicó anteriormente.

Entonces digamos que desea asignar 5.5.5.5 al contenedor debian8.

Editar /var/lib/lxc/debian8/etc/network/interfacesy agregar:

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

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

Después de eso, reinicie el contenedor y ¡finalmente todo debería funcionar! :)

Respuesta3

Tuve el mismo problema y tengo esta solución (rápida y sucia).

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)

En el servidor:route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

Además, si es necesario, agregue una ruta a los enrutadores ascendentes.

Probablemente no sea la mejor solución, ¡pero no requiere un gran esfuerzo! Salud.

información relacionada