Hola!
Hace unos meses me puse a instalar LXC para un cliente, y tenía la necesidad de que sus contenedores estuvieran en la misma red que sus servidores físicos. Por lo general LXC crea una red 10.0.3.0/24 y un puente con la ip 10.0.3.1 llamada “lxcbr0
“, por tanto, lo que haremos será agregar otro puente usando la tarjeta de red activa, luego indicamos a LXC que cree los contenedores usando ese nuevo puente, estos son los pasos:
En nuestro /etc/network/interfaces (debian y ubuntu), generalmente tendremos esto:
auto eth0
iface eth0 inet static
address 192.168.1.250
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
Lo cambiamos a esto:
auto br0
iface br0 inet static
bridge_ports eth0
address 192.168.1.250
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
Con esto creamos nuestro nuevo puente “br0” ligado a eth0 (puede ser em1 ó enp5s0, etc)
Ahora toca indicarle a LXC que los nuevos contenedores usen este puente, editamos /etc/default/lxc-net
y cambiamos USE_LXC_BRIDGE a: USE_LXC_BRIDGE="false"
Y en /etc/lxc/default.conf
cambiamos lxc.network.link = lxcbr0
a lxc.network.link = br0
Y listo. Ahora dentro de los contenedores puedes usar configuración estática, o por dhcp.
auto eth0
iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8
.
Usar IP externa de una red diferente
Ahora, ¿porque me acordé de algo que hice algo meses?, porque lo reintenté para ponerle una IP pública a un servidor LXC en un dedicado que tengo, y ¡No funcionó!
El dedicado tiene una IP del tipo 199.xx.xx.105 al comprarle una IP extra (ó Failover IP) el proveedor me asignó la ip: 146.xx.xx.239 , al querer añadirla a un contenedor, éste se quedaba sin red y no se “veía” (ping) ni con el Host, por ahí ví un error “Network unreachable“, ¡claro! las dos IP’s son de dos redes diferentes y no hay nadie (un router) que les diga como comunicarse, así que la solución fue añadir una nueva ruta a la tabla de ruteo de linux. Estos son los pasos:
Teniendo ya el puente br0 configurado y funcionando, hay que indicarle a LXC que deseamos forzar una dirección IP, esto lo hacemos editando la configuración del contenedor en /var/lib/lxc/MICONTENEDOR/config
:
lxc.network.ipv4=146.xx.xx.239
lxc.network.ipv4.gateway=199.xx.xx.105
Aquí hay que hacer notar que hemos puesto como gateway del contenedor la IP del Host. Esto es muy importante.
Y dentro del contenedor la siguiente configuración de red (/etc/network/interfaces) constará solamante de una sóla instrucción: “auto eth0
” (dejando también la parte del loopback claro)
En este momento ya puedes levantar el contenedor con lxc-start, métete con lxc-attach y verás como tiene la IP que indicaste en su configuración, si ejecutas un route -n
verás como su gateway es también lo indicado en la conf. Pero ¡NO TIENE RED!, déjalo “prendido” y de lado del Host ejecuta lo siguiente:
route add 146.xx.xx.239 br0
Tadá! Si haces un ping a la IP verás como ya responde, si te metes al contenedor verás como ya tiene red y puede responder a todos los servicios. Ahora, por supuesto estar agregando la ruta manualmente cada que iniciemos el contenedor está de hueva, vamos a automatizarlo.
Creamos dos scripts en /var/lib/lxc/MICONTENEDOR/ uno llamado iface-up.sh y otro iface-down.sh
iface-up.sh:
#!/bin/bash
route add 146.xx.xx.239 br0
iface-down.sh:
#!/bin/bash
route del 146.xx.xx.239 br0
No te olvides de darle permisos de ejecución a ambos scripts! Ej. chmod +x iface-up.sh
Y vamos a editar nuevamente la configuración del contenedor para añadir las siguientes dos líneas después de la parte donde añadimos los parámetros de red:
/var/lib/lxc/MICONTENEDOR/config:
...
lxc.network.ipv4=146.xx.xx.239
lxc.network.ipv4.gateway=199.xx.xx.105
lxc.network.script.up = /var/lib/lxc/MICONTENEDOR/iface-up.sh
lxc.network.script.down = /var/lib/lxc/MICONTENEDOR/iface-down.sh
Done. Ya con esto puedes probar parar e iniciar el contenedor varias veces, vigilando el estado de su red y de la IP y no debería tener problemas para acceder a Internet y viceversa.