
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 br0
lugar de eth0
. Los invitados LXC están configurados para conectarse al puente.
Sobre el anfitrión,
sudo apt-get install bridge-utils
.En el host, reemplácelo
eth0
con 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
:- Reemplazar
auto eth0
conauto br0
. 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
eth0
ybr0
agregando labridge_ports eth0
línea.Reinicie el host. Si estuviera haciendo esto localmente, ejecutarlo
sudo ifdown eth0
antes de comenzar ysudo ifup br0
despué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.
- Reemplazar
Para mover un contenedor LXC con nombre determinado a una IP pública:
- Detener el contenedor.
- En el host, edite y cambie a .
/var/lib/lxc/container_name/config
lxc.network.link
br0
- 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/interfaces
eth0
- Reinicie el contenedor.
Para cambiar el valor predeterminado para los nuevos contenedores LXC, edítelo
/etc/lxc/default.conf
en el host y cámbielolxc.network.link
abr0
.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/lxc
y cambieUSE_LXC_BRIDGE
a"false"
y luego en el host ejecutesudo 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/interfaces
y 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.