Configuración de contenedores LXC en puente con IP estáticas

15

Estoy tratando de configurar varios contenedores LXC en un host, cada uno con sus propias IP públicas estáticas.

Mi host está ejecutando la última versión de Ubuntu. Tiene una única interfaz de red llamada eth0. Las IP estáticas se pueden hacer ping desde Internet y se denominan eth0: 210, eth0: 211 ... Los números después de los dos puntos son el byte menos significativo de las direcciones. Además de estas interfaces, tengo la configuración br0 en la IP pública del host. También están las interfaces lo, veth2LPP9A y lxcbr0. El lxcbr0 tiene la dirección de una IP privada.

El host / etc / network / interfaces se ve así:

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_fd 0
        [...]

Hasta ahora, he utilizado varias fuentes en línea, incluidos los contenedores Bridging LXC para alojar eth0 para que puedan tener una IP pública que me ayude a configurar esto.

El archivo de configuración del contenedor tiene:

lxc.network.type = veth
lxc.network.link = br0

Eliminé la configuración estática lxc.network.ipv4 de este archivo porque causó problemas. Cuando ejecuté lxc-ls --fancy con esta configuración, vería la misma IP pública dos veces en la salida. Además, interferiría con la configuración de subred de las interfaces / etc / network / del contenedor.

Hablando del archivo de interfaces del contenedor, se parece un poco a:

auto eth0
iface eth0 inet static
        address [...]
        netmask 255.255.255.255
        #gateway [...]
        dns-nameservers 8.8.8.8

        post-up route add [...] dev eth0
        post-up route add default gw [...]
        post-down route del [...] dev eth0
        post-down route del default gw [...]

Tuve que comentar la puerta de enlace y agregar la ruta agregar comandos a este archivo. De lo contrario, el contenedor tardaría unos minutos en arrancar.

Los archivos / proc / sys / net / bridge / bridge-nf- * en el host están configurados en 0. El valor / proc / sys / net / ipv4 / ip_forward es 1.

El problema es que, aunque la "ruta -n" del contenedor se vea como debería, no puedo hacer ping fuera del contenedor. SSHing a lo que debería ser la IP del contenedor, me conecta con el host.

EDITAR: Eliminar la IP estática del contenedor del host ayudó, pero ahora recibo un nuevo error. Intentar hacer ping al contenedor desde el host da como resultado Redirect HostFrom, New nexthop. Los paquetes solo van desde la puerta de enlace al host, repetidamente. Ejecutar un traceroute desde el host muestra que la primera parada es en la puerta de enlace. Entonces todas las otras rutas son * * *. Me sale el mismo problema independientemente de si el contenedor está en línea o no.

Cable de ethernet
fuente

Respuestas:

17

De hecho, usted puede ajustar la dirección y la puerta de enlace desde dentro de la acogida y configurar el contenedor de no tocar la interfaz en absoluto el uso de la palabra clave manual.

Coloque esto dentro de los invitados /etc/network/interfaces:

auto eth0
iface eth0 inet manual

También déjelo en el archivo de configuración del contenedor para configurar la interfaz:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxc-bridge-nat
lxc.network.ipv4 = 192.168.100.16/24
lxc.network.ipv4.gateway = auto

El invitado se comportará como si su BIOS ya hubiera configurado la interfaz y solo la usara.

Especialmente explorar lxc.network.ipv4.gateway.

sebastianwagner
fuente
¡Gracias! Esto me salvó la vida ... mi contenedor siempre intentaría obtener una nueva dirección dhcp ... establecerlo en un valor fijo dentro del contenedor (estático) resultó en que el contenedor ni siquiera se iniciara.
Dominik Dorn
Tenga en cuenta que esto no funciona bien si el host se suspende y se reanuda. El lxc continúa con su dirección IP asignada, pero el host piensa que ya no tiene una dirección IP. He descubierto que es mejor configurar el dnsmasq para lxc-net y distribuir una dirección fija allí.
HRJ
@HRJ: debe incluir el "cómo" en su comentario o enlace a la referencia en lugar de simplemente decir "hágalo". Este es un sitio técnico y debe decir algo realmente útil.
Ian Macintosh
2
Parece que el lugar correcto para hacer esto es tanto en / etc / default / lxc donde puede establecer su rango (consulte LXC_DHCP_RANGE) y en /etc/dnsmasq.d-available/lxc según los documentos de dnsmasq o la página de manual
Ian Macintosh
4

Dado que realiza un puente, es necesario configurar las direcciones IP en el contenedor solamente , y no en el de acogida. El host solo debe tener sus propias direcciones IP.

Michael Hampton
fuente
2

Lo hice el otro día con Ubuntu 14.04. Es simple. Solo tiene que editar el /etc/network/interfacesarchivo dentro de su contenedor y configurar esto:

auto eth0
iface eth0 inet static
 address $IP
 netmask $NETMASK
 gateway $GW
 dns-nameservers $DNS

Reemplace cada variable con el valor deseado.

Usted NO tiene que hacer nada más!

PD: Observe el espacio antes de algunas líneas. Es obligatorio.

Tienda Enrique Moreno
fuente
esto dio como resultado que mi contenedor ya no se iniciara (servidor ubuntu 14.04) ... la respuesta de sebastianwagner funciona para mí.
Dominik Dorn
2

La mejor manera que encuentro y la más rápida es usar los perfiles lxc

lxc profile list - ordena la lista de todos los perfiles que tienes Entonces

lxc profile copy default minecraft(este es el nombre de su nuevo perfil)

Luego lxc profile edit minecraft

Esto vendrá

devices:
  eth0:
    ipv4.address: 192.168.1.114/24  - add this line and enter any ip address you like
    name: eth0
    nictype: macvlan - this is my setting
    parent: enp0s25
    type: nic
  root:
    path: /
    pool: lxc_zfs
    type: disk
name: mine
used_by:

entonces guárdalo

luego asigne el perfil a su contenedor LXC como este

lxc profile assign YOUR_CONTAINER_NAME YOUR_NEW_PROFILE_NAME

luego simplemente reinicie el contenedor y su nueva dirección IP se establece en ese contenedor

Jayferret
fuente
1

Podría configurar correctamente mis contenedores lxc después de seguir la respuesta de @Enrique Moreno Tent, así que explicaré qué hacer con más detalles en caso de que no sepa cómo configurar los otros elementos.

1. Acceda a su contenedor LXC a través del lxc-attachcomando

Mando:

$ lxc-attach -n YOUR-CONTAINER-NAME

2. Vea sus configuraciones actuales con ifconfig

Mando

root@mycontainer:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.3.160  netmask 255.255.255.0  broadcast 10.0.3.255
        inet6 fe80::216:3eff:fec9:2fa0  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:c9:2f:a0  txqueuelen 1000  (Ethernet)
        RX packets 62  bytes 7142 (7.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60  bytes 9788 (9.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 20285  bytes 175021803 (175.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20285  bytes 175021803 (175.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

`` `

3. Obtener dirección, máscara de red y puerta de enlace

Al ver el resultado del ifconfigcomando anterior, vemos:

La dirección es la dirección que desea, puede cambiarla a 10.0.3.166.

Netmask está ahí: 255.255.255.0

Puerta de enlace : para la puerta de enlace con la que usa la dirección de transmisión , aquí está 10.0.3.255

Como puede ver arriba, actualmente tiene toda la información que necesita para llenar su invitado (contenedor) /etc/network/interfaces.

4. Obteniendo dns-nameserversvalor.

Emita el comando:

cat /etc/resolv.conf

Pero tal vez es mejor usar Google DNS, que asre 8.8.8.8y8.8.4.4

5. Edición /etc/network/interfacesDENTRO DEL ENVASE

auto eth0 iface eth0 inet static address 10.0.3.166 netmask 255.255.255.0 gateway 10.0.3.255 dns-nameservers 8.8.8.8

Iacchus
fuente
ifconfigha sido reemplazado por ip aversiones más recientes de debian / ubuntu linuxconfig.org/…
rvazquezglez