Dirección IP pública para contenedor LXC

26

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

Estoy ejecutando Ubuntu 12.04 LTS y tengo LXC instalado y puedo hacer, iniciar y detener un contenedor. Mi servidor obviamente 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. Como ya parece haber un puente en mi lugar desde mi contenedor actual, parecería que necesito darle 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 hago eso? ¿Debo hacer algún cambio en mi configuración de puente en el host? ¿Es realmente mejor hacerlo con la opción MACVLAN?

Cualquier ayuda sería apreciada.

usuario132151
fuente
No estoy familiarizado con LXC, pero su ISP típicamente solo le dará una dirección IP pública. ¿Tienes un paquete con múltiples ips estáticos?
wlraider70
Las direcciones IP públicas no son el único caso de uso, queremos que se asignen 2 direcciones IP públicas a nuestros contenedores de equilibrador de carga, pero queremos direcciones IP LAN dedicadas a una variedad de otros servicios. De esa manera, si movemos los contenedores en un hardware diferente, es tan fácil como mover la IP (DNS no funciona a este respecto para algunos de los componentes que usamos)
David Parks

Respuestas:

23

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

  1. En el host, sudo apt-get install bridge-utils.

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

    Esto es peligroso. Si se equivoca, podría quedar bloqueado de su servidor. Asegúrese de tener un inicio de sesión local habilitado y que el acceso a la consola local funcione, de modo 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 tuviera una configuración de red estática, entonces reemplazaría:

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

      con:

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

      No eres más que cambiar eth0para br0y añadiendo la bridge_ports eth0línea.

    3. Reinicia el host. Si estuvieras haciendo esto localmente, luego ejecutar sudo ifdown eth0antes de comenzar, y sudo ifup br0luego también lo haría. Tenga en cuenta que el puente puede tardar un poco en subir, así que espere cinco minutos después del reinicio antes de asumir que todo está perdido.

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

    1. Parar 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. Reinicia el contenedor.
  4. Para cambiar el valor predeterminado para los nuevos contenedores LXC, edite /etc/lxc/default.confen el host y cambie lxc.network.linka br0.

  5. Si usted no necesita el puente NAT-LXC proporcionado en absoluto (es decir. Todas sus contenedores utilizarán el nuevo puente en su lugar), a continuación, en la edición de host /etc/default/lxcy el cambio USE_LXC_BRIDGEa "false", y después en la carrera de acogida sudo service lxc restart.

Robie Basak
fuente
¡Gracias! Hay muchas preguntas similares alrededor. Pero, esta respuesta finalmente me ayudó a hacer que las cosas funcionen.
Mausy5043
1

Robie, muchas gracias por publicar esta respuesta, ¡me he estado tratando de hacer 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 host 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 se indicó anteriormente.

Entonces, digamos que desea que 5.5.5.5 se asigne 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 todo finalmente debería funcionar. :)

Gregory Wolf
fuente
1

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 la ruta a los enrutadores ascendentes.

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

andrea
fuente