
Estoy experimentando con lxc/lxd en Vagrant, pero soy bastante nuevo en esto. Logré crear un contenedor en ejecución, pero no puedo hacer ping a nada (incluido 8.8.8.8) desde su interior. Puedo hacer ping a su IP desde mi sistema no virtual de nivel superior, pero rechaza conexiones SSH. Puedo ingresar al contenedor solo directamente desde el host del contenedor directo (Vagrant) usando lxc exec my-container /bin/bash
.
Intenté configurar mi contenedor en el routed
modo y todavía lo quiero para fines de aprendizaje. Sin embargo, parece que falta algo de documentación LXD/LXC.
Intenté seguir esta instrucción:https://blog.simos.info/how-to-get-lxd-containers-get-ip-from-the-lan-with-routed-network/pero al final no me funcionó. Podría perderme algo porque todavía no estoy bien versado en las redes de Linux.
Mi host Vagrant se está ejecutando en Ubuntu 20.04
.
Mi contenedor LXC se está ejecutando en Debian 10
.
Configuración de LXC en mi host Vagrant:
config:
core.https_address: '[::]:8443'
core.trust_password: true
networks: []
storage_pools:
- config:
source: /home/luken/lxd-storage-pools
description: ""
name: default
driver: dir
profiles:
- name: default
config: {}
description: ""
devices:
root:
path: /
pool: default
type: disk
- name: mail-server
config:
user.network-config: |
version: 2
ethernets:
eth0:
addresses:
- 192.168.33.11/32
nameservers:
addresses:
- 8.8.8.8
search: []
routes:
- to: 0.0.0.0/0
via: 169.254.0.1
description: Mail Server LXD profile
devices:
eth0:
ipv4.address: 192.168.33.11
nictype: routed
parent: eth1
type: nic
cluster: null
ip addr
en mi anfitrión vagabundo:
luken@luken-tech-test:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:be:4a:e8 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
valid_lft 76347sec preferred_lft 76347sec
inet6 fe80::a00:27ff:febe:4ae8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:65:e6:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.33.2/24 brd 192.168.33.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe65:e628/64 scope link
valid_lft forever preferred_lft forever
6: vetha8400046@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:48:28:3e:e4:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 169.254.0.1/32 scope global vetha8400046
valid_lft forever preferred_lft forever
inet6 fe80::fc48:28ff:fe3e:e4fa/64 scope link
valid_lft forever preferred_lft forever
ip addr
en mi contenedor:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 9a:14:96:30:67:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.33.11/32 brd 255.255.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9814:96ff:fe30:6743/64 scope link
valid_lft forever preferred_lft forever
ip r
en mi anfitrión vagabundo:
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100
192.168.33.0/24 dev eth1 proto kernel scope link src 192.168.33.2
192.168.33.11 dev vetha8400046 scope link
ip r
en mi contenedor:
default via 169.254.0.1 dev eth0
169.254.0.1 dev eth0 scope link
¿Hay algo que me perdí (probablemente mucho)?
Respuesta1
Se requieren varias cosas para que su esquema funcione:
Verifique el reenvío en las interfaces del host:
ip -4 netconf show dev vetha8400046
yip -4 netconf show dev eth0
. Deberías ver el reenvío habilitado en el resultado. De lo contrario, habilítelo con elsysctl -w net.ipv4.conf.<iface>.forwarding=1
comando. Agregue las cadenas correspondientes al/etc/sysctl.conf
archivo para hacerlo persistente.Verifique la ruta en el host:
ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046
. Deberías ver la ruta válida a través de tu puerta de enlace predeterminada (... via 10.0.2.2 dev ...
. Verifica también la ruta inversa con el archivoip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0
.Haga ping al contenedor desde el host y viceversa.
Configure la NAT en el host:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
. Haga ping a algún host externo desde el contenedor. Los contadores de esta regla en eliptables-save -c
deben ser distintos de cero.Haga la pregunta si se quedó atascado.
Respuesta2
Esta es la configuración correcta para que los contenedores de Debian 10 sean accesibles en nuestra red local mediante sus propias IP estáticas y que tengan acceso a Internet.
Nuestro Vagrantfile
:
Vagrant.configure("2") do |config|
config.vm.define "main" do |main|
main.vm.box = "bento/ubuntu-20.04"
main.vm.box_version = "202010.24.0"
main.vm.hostname = "lxc-host"
main.vm.network "public_network", auto_config: false
main.vm.provision "shell",
run: "always",
inline: "ip address add **192.168.1.200**/24 dev eth1"
main.vm.provision "shell",
run: "always",
inline: "ip link set eth1 up"
main.vm.provider :virtualbox do |vb|
vb.memory = 1024
end
end
end
Tenga en cuenta que estamos configurando una red "pública", lo que significa que al iniciar Vagrant, se le pedirá que elija la interfaz que desea usar, elija la que está utilizando para conectarse a su red local.
Tenga en cuenta también que estamos configurando una sola IP por ahora, esta (192.168.1.200) será la IP de nuestro host.No estamos configurando la IP del contenedor aquí.
Luego de iniciar nuestro host, habilite el reenvío de IP en su configuración, descomentando: net.ipv4.ip_forward=1
in /etc/sysctl.conf
y reiniciando sysctl ejecutando systemctl restart systemd-sysctl
.
Ahora, asumiendo que instaló y configuró LXD
correctamente en el host, puede iniciar lxd
con la siguiente configuración:
config:
core.https_address: '[::]:8443'
core.trust_password: true
networks: []
storage_pools:
- config:
source: [path-to-storage-pools-directory]
description: ""
name: default
driver: dir
profiles:
- name: default
config:
description: ""
devices:
root:
path: /
pool: default
type: disk
- name: test-container
config:
user.user-data: |
#cloud-config
bootcmd:
- echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/tail
- systemctl restart resolvconf
description: Mail Server LXD profile
devices:
eth0:
ipv4.address: 192.168.1.201
nictype: routed
parent: eth1
type: nic
cluster: null
Cambiar[ruta-al-directorio-de-grupos-de-almacenamiento]en la ruta real al directorio donde va a almacenar sus grupos.
Tenga en cuenta que no estamos utilizando cloud-init para configurar la red, ya que colisionaría con el servicio de red de Debian y no podría iniciarse.
Tenga en cuenta también que estamos usando cloud-init para configurar el servidor de nombres para que lo utilice nuestro invitado.
192.168.1.201 será la IP de nuestro huésped. Esta configuración supone que la red local es 192.168.1.0; si su red es diferente, cambie las IP en consecuencia. También asegúrese de que las IP utilizadas aquí no sean utilizadas por nada más en la red.
Estamos usando dos perfiles aquí, pero depende de usted cómo organiza su configuración.
Ahora ejecutemos nuestro contenedor:
lxc launch images:debian/10/cloud our-actual-test-container --profile default --profile test-container
Debería estar ejecutándose y disponible en la red local, pero no tendrá acceso a Internet, y esa es la parte complicada. Esto se debe al enrutamiento configurado por el lxd
basado en la suposición de que la puerta de enlace predeterminada es la de la red vagrant/virtualbox. Necesitamos arreglar eso.
Al ejecutar ip r
en el host, debería ver la lista de rutas, algo así:
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.200
192.168.1.201 dev vethc5cebe03 scope link
El problema está en el predeterminado, que enruta el tráfico a la red vagrant/virtualbox en lugar de a nuestra puerta de enlace real. Eliminémoslo:
ip route del default via 10.0.2.2
Y agreguemos la regla que reenviará los paquetes a la puerta de enlace real de nuestra red local:
ip route add default via 192.168.1.1
(asumiendo que 192.168.1.1 es la IP de nuestra puerta de enlace local)
Ahora el tráfico del contenedor irá a la puerta de enlace correcta y ¡listo!