Diferencia entre revisiones de «Escenario 3C. LXC: Máis sobre contedores Incus»
| Línea 325: | Línea 325: | ||
== Contedores en modo ponte == | == Contedores en modo ponte == | ||
| + | |||
| + | O modo Bridge permite traballar cos contenedores cun modo semellante ó modo ponte (bridge) de Virtualbox, permitindo a comunicación dos contedores coa rede externa e co equipo anfitrión (e viceversa). A idea é crear un switch virtual onde estarán conectados os contedores, o equipo anfitrión e a rede local. Tamén podemos ter o modo rede interna de Virtualbox creando switches 'illados' de forma que os equipos conectados a eles, únicamente poderán comunicarse entre si (co resto do mundo poderían empregando outro equipo a modo de router). Na seguinte imaxe pode verse unha interpretación gráfica das conexións que teremos ó remate deste apartado: | ||
| + | |||
| + | Esquema conexións modo bridge | ||
| + | |||
| + | Fig. Esquema de conexión no modo bridge | ||
| + | |||
| + | Configuración de rede do equipo anfitrión dos contedores (real ou virtual) | ||
| + | O modo bridge pode usarse sendo o equipo anfitrión un equipo real ou virtual. No caso de equipo virtual hay que facer un par de configuracións previas no adaptador de rede de Virtualbox: | ||
| + | |||
| + | Configuración da interface de rede da máquina virtual anfitrioa dos contedores: | ||
| + | |||
| + | Indico que é unha interface de tipo Adaptador puente e asócioa á interface enp6s0 da miña máquina real. | ||
| + | Activo o Modo Promiscuo | ||
| + | Configuración interface de rede | ||
| + | |||
| + | Fig. Adaptador da máquina virtual: modo ponte e modo promiscuo | ||
| + | |||
| + | Agora, imos ver as instruccións paso a paso (válidas tanto para Xubuntu 20.04 coma Xubuntu 22.04) para crear unha interface de tipo bridge e como crear un profile que a use. A configuración da interface de tipo bridge vaise facer usando o asistente gráfico de configuración de rede do equipo Ubuntu (no caso dun Ubuntu Server habería que facelo usando netplan e editando o arquivo de configuración de rede): | ||
| + | |||
| + | Editando a configuración de rede | ||
| + | |||
| + | Fig. Lanzando o configurador de rede | ||
| + | |||
| + | Editando a configuración de rede | ||
| + | |||
| + | Creando nova interface de tipo bridge | ||
| + | |||
| + | Creando nova interface de tipo bridge | ||
| + | |||
| + | Fig. Engadindo unha nova interface de tipo ponte (bridge) | ||
| + | |||
| + | Configuración interface de rede de tipo bridge | ||
| + | |||
| + | Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge | ||
| + | |||
| + | Engadindo a interface da máquina virtual á ponte | ||
| + | |||
| + | Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge | ||
| + | |||
| + | Engadindo a interface da máquina virtual á ponte | ||
| + | |||
| + | Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge --> enp0s3 | ||
| + | |||
| + | Interface de rede engadida á ponte | ||
| + | |||
| + | Configurando a IP da interface de tipo bridge | ||
| + | |||
| + | Fig. Configurando a IP da interface de tipo bridge | ||
| + | |||
| + | Interface ponte configurada | ||
| + | |||
| + | Reiniciamos o equipo e verificamos a configuración da nova interface. Fíxadevos que a interface bridge0 sí ten asignada unha IP e como enp0s3 agora forma parte da ponte, sí está activa pero non ten asignada unha configuración IP: | ||
| + | <pre> | ||
| + | ~$ 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP group default qlen 1000 | ||
| + | link/ether 08:00:27:ff:fc:1f brd ff:ff:ff:ff:ff:ff | ||
| + | 3: bridge0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 | ||
| + | link/ether 1e:69:e2:83:f4:ca brd ff:ff:ff:ff:ff:ff | ||
| + | inet 192.168.1.150/24 brd 192.168.1.255 scope global noprefixroute bridge0 | ||
| + | valid_lft forever preferred_lft forever | ||
| + | ... | ||
| + | </pre> | ||
| + | |||
| + | === Configuración dos contedores === | ||
| + | Igual que se fixo no modo macvlan, comezaremos creando un novo perfil a partir do default e modificamos o parent a bridge0 para indicar que a tarxeta eth0 do contedor vai conectarse o switch bridge0: | ||
| + | <pre> | ||
| + | ~$ incus profile copy default ponte-br0 | ||
| + | ~$ incus profile edit ponte-br0 | ||
| + | ### This is a yaml representation of the profile. | ||
| + | ### Any line starting with a '# will be ignored. | ||
| + | ### | ||
| + | ### A profile consists of a set of configuration items followed by a set of | ||
| + | ### devices. | ||
| + | ### | ||
| + | ### An example would look like: | ||
| + | ### name: onenic | ||
| + | ### config: | ||
| + | ### raw.lxc: lxc.aa_profile=unconfined | ||
| + | ### devices: | ||
| + | ### eth0: | ||
| + | ### nictype: bridged | ||
| + | ### parent: incusbr0 | ||
| + | ### type: nic | ||
| + | ### | ||
| + | ### Note that the name is shown but cannot be changed | ||
| + | |||
| + | config: | ||
| + | environment.http_proxy: "" | ||
| + | user.network_mode: "" | ||
| + | description: Default Incus profile | ||
| + | devices: | ||
| + | eth0: | ||
| + | name: eth0 | ||
| + | nictype: bridged | ||
| + | parent: bridge0 | ||
| + | type: nic | ||
| + | root: | ||
| + | path: / | ||
| + | pool: default | ||
| + | type: disk | ||
| + | name: ponte-br0 | ||
| + | used_by: [] | ||
| + | </pre> | ||
| + | |||
| + | Se queremos crear un novo contedor que use este perfil temos que executar: | ||
| + | <pre> | ||
| + | ~$ incus launch ubuntu:f platega04 --profile ponte-br0 | ||
| + | Launching platega04 | ||
| + | |||
| + | Se non queremos crear un novo contedor e sí aplicarlle o novo perfil a contedores xa creados, temos que usar incus profile assign: | ||
| + | ~$ incus profile assign platega02 ponte-br0 | ||
| + | Profiles ponte-br0 applied to platega02 | ||
| + | asir@incus:~$ incus profile assign platega03 ponte-br0 | ||
| + | Profiles ponte-br0 applied to platega03 | ||
| + | </pre> | ||
| + | |||
| + | Podemos comprobar que reciben a configuración de rede dende o servidor dhcp da rede local (e non o dhcp asociado a incusbr0): | ||
| + | <pre> | ||
| + | ~$ incus ls -c n,s,4,6,P,S | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | | NOMBRE | ESTADO | IPV4 | IPV6 | PERFILES | SNAPSHOTS | | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | | platega00 | RUNNING | 10.119.191.239 (eth0) | fd42:380b:4b9f:3572:216:3eff:feaf:a7c7 (eth0) | default | 1 | | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | | platega01 | RUNNING | 10.119.191.183 (eth0) | fd42:380b:4b9f:3572:216:3eff:fe1d:1b21 (eth0) | default | 0 | | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | | platega02 | RUNNING | 192.168.1.48 (eth0) | | ponte-br0 | 0 | | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | | platega03 | RUNNING | 192.168.1.49 (eth0) | | ponte-br0 | 0 | | ||
| + | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | ||
| + | <pre> | ||
| + | |||
| + | Facendo probas de conectividade, podemos comprobar que funcionan as comunicacións en todos as direccións: | ||
| + | |||
| + | Entre contedores: | ||
| + | <pre> | ||
| + | asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.49 | ||
| + | PING 192.168.1.49 (192.168.1.49) 56(84) bytes of data. | ||
| + | 64 bytes from 192.168.1.49: icmp_seq=1 ttl=64 time=0.244 ms | ||
| + | 64 bytes from 192.168.1.49: icmp_seq=2 ttl=64 time=0.090 ms | ||
| + | |||
| + | --- 192.168.1.49 ping statistics --- | ||
| + | 2 packets transmitted, 2 received, 0% packet loss, time 1000ms | ||
| + | rtt min/avg/max/mdev = 0.090/0.167/0.244/0.077 ms | ||
| + | Entre contedor e equipo anfitrión (e viceversa): | ||
| + | asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.150 | ||
| + | PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data. | ||
| + | 64 bytes from 192.168.1.150: icmp_seq=1 ttl=64 time=0.203 ms | ||
| + | 64 bytes from 192.168.1.150: icmp_seq=2 ttl=64 time=0.077 ms | ||
| + | |||
| + | --- 192.168.1.150 ping statistics --- | ||
| + | 2 packets transmitted, 2 received, 0% packet loss, time 999ms | ||
| + | rtt min/avg/max/mdev = 0.077/0.140/0.203/0.063 ms | ||
| + | asir@incus:~$ ping -c 2 192.168.1.48 | ||
| + | PING 192.168.1.48 (192.168.1.48) 56(84) bytes of data. | ||
| + | 64 bytes from 192.168.1.48: icmp_seq=1 ttl=64 time=0.066 ms | ||
| + | 64 bytes from 192.168.1.48: icmp_seq=2 ttl=64 time=0.084 ms | ||
| + | |||
| + | --- 192.168.1.48 ping statistics --- | ||
| + | 2 packets transmitted, 2 received, 0% packet loss, time 1001ms | ||
| + | rtt min/avg/max/mdev = 0.066/0.075/0.084/0.009 ms | ||
| + | Entre contedor e o exterior: | ||
| + | asir@incus:~$ incus exec platega02 -- host www.edu.xunta.es 8.8.8.8 | ||
| + | Using domain server: | ||
| + | Name: 8.8.8.8 | ||
| + | Address: 8.8.8.8#53 | ||
| + | Aliases: | ||
| + | |||
| + | www.edu.xunta.es has address 85.91.64.102 | ||
| + | </pre> | ||
| + | |||
| + | Dende equipos externos e o contedor: | ||
| + | <pre> | ||
| + | ~$ ping -c 2 192.168.1.48 | ||
| + | PING 192.168.1.48 (192.168.1.48) 56(84) bytes of data. | ||
| + | 64 bytes from 192.168.1.48: icmp_seq=1 ttl=64 time=0.559 ms | ||
| + | 64 bytes from 192.168.1.48: icmp_seq=2 ttl=64 time=0.386 ms | ||
| + | |||
| + | --- 192.168.1.48 ping statistics --- | ||
| + | 2 packets transmitted, 2 received, 0% packet loss, time 1027ms | ||
| + | rtt min/avg/max/mdev = 0.386/0.472/0.559/0.089 ms | ||
| + | </pre> | ||
| + | |||
| + | Igual que o indicado no modo macvlan, a partir de agora o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, este trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-lxc.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración. | ||
== Contedores e redes wifi == | == Contedores e redes wifi == | ||
Revisión actual del 19:17 19 ene 2026
Sumario
Introdución
Veremos como facer alguhas cousas a maiores das vistas nos anteriores escenarios
- Incus-UI - web interface de xestión
- Modos de rede avanzados: macvlan e ponte.
- Contedores e redes wifi
- Comunicacións entre contedores no equipo real e máquinas virtuais sobre Virtualbox.
- Contedores con contorno gráfico.
Incus-UI - web interface de xestión
Hai unha interface web de xestión que permite realizar as operacións vistas nos capítulos anteriores a través dun navegador.
Hai algún outro proxecto de interfaz gráfica pero éste é o oficial.
A continuación os pasos para a súa instalación e uso:
instalar e habilitar incus-ui
~$ sudo apt install -y incus-ui-canonical
~$ incus config show
config: {}
~$ incus config set core.https_address 127.0.0.1:8443
~$ incus config show
config:
core.https_address: 127.0.0.1:8443
asir@incus:~$ sudo netstat -putan | grep 8443
tcp 0 0 127.0.0.1:8443 0.0.0.0:* ESCUCHAR 957/incusd
Crear certificado e otorgar confianza
Acceder co navegador á: https://127.0.0.1:8443
Entrar premendo en Login with TLS e xerar certificado:
Seguimos os pasos indicados: xerar certificado e protexer con contrasinal, otorgar confianza (ollo que a ruta e o nome do arquivo descargado non ten porque coincidir co indicado no comando incus config trust do exemplo).
~$ incus config trust list +------+------+-------------+----------------+---------------------+ | NAME | TYPE | DESCRIPCIÓN | HUELLA DIGITAL | FECHA DE EXPIRACIÓN | +------+------+-------------+----------------+---------------------+ ~$ ls -lhF Descargas/ total 4,0K -rw-rw-r-- 1 asir asir 1,1K ene 17 17:38 incus-ui.crt ~$ incus config trust add-certificate Descargas/incus-ui.crt ~$ incus config trust list +--------------+--------+-------------+----------------+-----------------------+ | NAME | TYPE | DESCRIPCIÓN | HUELLA DIGITAL | FECHA DE EXPIRACIÓN | +--------------+--------+-------------+----------------+-----------------------+ | incus-ui.crt | client | | 721108b3c8ba | 2028/10/13 18:38 CEST | +--------------+--------+-------------+----------------+-----------------------+
Descargar e importar .pfx
Acceso
Unha vez instalado o certificado no navegador hai que proceder a pechalo e volver a abrilo e acceder á web de INCUS-UI. Aparecerá unha mensace relativa á aceptación do certificado e unha vez aceptado xa poderemos xestionar gráficamente os contedores.
Nas seguintes imaxes poden verse algunhas capturas de pantalla da interface de xestión:
Contedores en modo Macvlan
Deste modo de rede hai que descatar os seguintes puntos:
- É o modo máis sinxelo de conectar os contedores directamente á rede física e non require tocar a configuración de rede do host anfitrión.
- Normalmente ofrece un mellor rendemento que o bridge que veremos máis adiante.
- Permite a comunicación entre os contedores.
- NON permite a comunicación entre os contedores e o host anfitrión. Polo tanto, se precisamos que haxa comunicacións entre contedores e o anfitrión, este modo non nos vale.
- NON funciona en Virtualbox por defecto.
- NON funciona en sistemas anfitrión reais usando wifi
Na seguinte imaxe pode verse unha interpretación das conexións neste modo de rede:
Esquema conexións modo MACVLAN
Fig. Esquema de conexión no modo MACVLAN
MACVLAN (o anfitrión dos contedores é un equipo real)
En primeiro lugar, comezaremos creando un perfil a partir do perfil por defecto e modificamos:
O nictype a macvlan: O parent de incusbr0 a enp0s3 (o nome da interface real do equipo anfitrión a usar).
~$ incus profile copy default macvlan
~$ incus profile edit macvlan
### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
### raw.lxc: lxc.aa_profile=unconfined
### devices:
### eth0:
### nictype: bridged
### parent: lxdbr0
### type: nic
###
### Note that the name is shown but cannot be changed
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
nictype: macvlan
parent: enp0s3
type: nic
root:
path: /
pool: default
type: disk
name: macvlan
used_by: []
project: default
A continuación creamos dous novos contedores aplicándolles o novo perfil macvlan.
~$ incus launch images:ubuntu/jammy platega02 --profile macvlan Launching platega02 asir@incus:~$ incus launch images:ubuntu/jammy platega03 --profile macvlan Launching platega03
Podemos comprobar que reciben a configuración de rede dende o servidor dhcp da rede local 192.168.1.0/24 (e non do dhcp asociado a lxdbr0):
$ incus ls -c n,s,4,6,P,S +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+ | NOMBRE | ESTADO | IPV4 | IPV6 | PERFILES | SNAPSHOTS | +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+ | platega00 | RUNNING | 10.119.191.239 (eth0) | fd42:47c9:add7:7c:216:3eff:fe59:7ec5 (eth0) | default | 1 | +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+ | platega01 | RUNNING | 10.119.191.183 (eth0) | fd42:47c9:add7:7c:216:3eff:fe3e:d63e (eth0) | default | 0 | +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+ | platega02 | RUNNING | 192.168.1.45 (eth0) | | macvlan | 0 | +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+ | platega03 | RUNNING | 192.168.1.46 (eth0) | | macvlan | 0 | +-----------+---------+-----------------------+---------------------------------------------+----------+-----------+
Facendo algunhas probas de conectividade podemos verificar o indicado sobre o modo MACVLAN en relación ás comunicacións co exterior e entre os contedores: sí se permiten.
~$ incus exec platega02 -- host www.xunta.es 8.8.8.8 Using domain server: Name: 8.8.8.8 Address: 8.8.8.8#53 Aliases: www.xunta.es has address 85.91.64.254 asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.1 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.431 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.404 ms --- 192.168.1.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1020ms rtt min/avg/max/mdev = 0.404/0.417/0.431/0.024 ms asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.46 PING 192.168.1.46 (192.168.1.46) 56(84) bytes of data. 64 bytes from 192.168.1.46: icmp_seq=1 ttl=64 time=0.168 ms 64 bytes from 192.168.1.46: icmp_seq=2 ttl=64 time=0.126 ms --- 192.168.1.46 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1021ms rtt min/avg/max/mdev = 0.126/0.147/0.168/0.021 ms As comunicacións co equipo anfitrión non se permiten: asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.150 PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data. From 192.168.1.45 icmp_seq=1 Destination Host Unreachable --- 192.168.1.150 ping statistics --- 2 packets transmitted, 0 received, +1 errors, 100% packet loss, time 1018ms pipe 2 asir@incus:~$ ping -c 2 192.168.1.45 PING 192.168.1.45 (192.168.1.45) 56(84) bytes of data. From 192.168.1.150 icmp_seq=1 Destination Host Unreachable --- 192.168.1.45 ping statistics --- 2 packets transmitted, 0 received, +1 errors, 100% packet loss, time 1017ms pipe 2
A partir de agora, o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, éste trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-lxc.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración.
MACVLAN (o anfitrión dos contedores é unha máquina virtual Virtualbox)
É posible traballar con este modo sendo o anfitrión dos contedores unha máquina virtual de Virtualbox pero hai que facer unhas actuacións previas:
A máquina virtual que funciona como anfitriona dos contedores debe: Ter a interface de rede en modo bridge. Ter activado o modo promiscuo na interface de rede (Virtualbox ten que permitir o envío/recepción de paquetes de rede onde interveñen as diferentes direccións MAC dos contedores en modo macvlan) Hai que crear unha interface de tipo bridge no sistema operativo da máquina virtual que funciona como anfitrioa dos contedores. No profile dos contedores onde se define o modo macvlan, o parent será a interface bridge configurada no punto anterior. Ímos ver as instruccións paso a paso (válidas tanto para Xubuntu 20.04 coma Xubuntu 22.04).
Configuración da interface de rede da máquina virtual anfitrioa dos contedores:
Indico que é unha interface de tipo Adaptador puente e asócioa á interface enp6s0 da miña máquina real. Activo o Modo Promiscuo Configuración interface de rede
A configuración da interface de tipo bridge vaise facer usando o asistente gráfico de configuración de rede do equipo Ubuntu (no caso dun Ubuntu Server habería que facelo usando netplan e editando o arquivo de configuración de rede):
Editando a configuración de rede
Fig. Lanzando o configurador de rede
Editando a configuración de rede
Creando nova interface de tipo bridge
Creando nova interface de tipo bridge
Fig. Engadindo unha nova interface de tipo ponte (bridge)
Configuración interface de rede de tipo bridge
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge
Engadindo a interface da máquina virtual á ponte
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge
Engadindo a interface da máquina virtual á ponte
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge --> enp0s3
Interface de rede engadida á ponte
Configurando a IP da interface de tipo bridge
Fig. Configurando a IP da interface de tipo bridge
Interface ponte configurada
Reiniciamos o equipo e verificamos a configuración da nova interface. Fíxadevos que a interface bridge0 sí ten asignada unha IP e como enp0s3 agora forma parte da ponte, sí está activa pero non ten asignada unha configuración IP:
~$ 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP group default qlen 1000
link/ether 08:00:27:ff:fc:1f brd ff:ff:ff:ff:ff:ff
3: bridge0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 1e:69:e2:83:f4:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.1.150/24 brd 192.168.1.255 scope global noprefixroute bridge0
valid_lft forever preferred_lft forever
...
Agora créase un profile de tipo macvlan usando como parent a interface bridge0:
asir@incus:~$ incus profile copy default macvlan
asir@incus:~$ incus profile edit macvlan
### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
### raw.lxc: lxc.aa_profile=unconfined
### devices:
### eth0:
### nictype: bridged
### parent: lxdbr0
### type: nic
###
### Note that the name is shown but cannot be changed
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
nictype: macvlan
parent: bridge0
type: nic
root:
path: /
pool: default
type: disk
name: macvlan
used_by: []
Probamos a crear un par de contedores usando este profile:
~$ incus launch images:ubuntu/jammy macvlan00 -p macvlan ~$ incus launch images:ubuntu/jammy macvlan01 -p macvlan ~$ i incus ls -c n,s,4,6,P,S +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | NAME | STATE | IPV4 | IPV6 | PROFILES | SNAPSHOTS | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | alpine00 | RUNNING | 10.79.128.80 (eth0) | fd42:a317:cbc5:dbd:216:3eff:fe99:e07f (eth0) | default | 0 | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | alpine01 | RUNNING | 10.79.128.123 (eth0) | fd42:a317:cbc5:dbd:216:3eff:fe94:dca7 (eth0) | default | 0 | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | alpine02 | STOPPED | | | default | 0 | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | macvlan00 | RUNNING | 192.168.1.38 (eth0) | | macvlan | 0 | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+ | macvlan01 | RUNNING | 192.168.1.41 (eth0) | | macvlan | 0 | +-----------+---------+----------------------+----------------------------------------------+----------+-----------+
A partir de agora, o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, éste trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración.
Contedores en modo ponte
O modo Bridge permite traballar cos contenedores cun modo semellante ó modo ponte (bridge) de Virtualbox, permitindo a comunicación dos contedores coa rede externa e co equipo anfitrión (e viceversa). A idea é crear un switch virtual onde estarán conectados os contedores, o equipo anfitrión e a rede local. Tamén podemos ter o modo rede interna de Virtualbox creando switches 'illados' de forma que os equipos conectados a eles, únicamente poderán comunicarse entre si (co resto do mundo poderían empregando outro equipo a modo de router). Na seguinte imaxe pode verse unha interpretación gráfica das conexións que teremos ó remate deste apartado:
Esquema conexións modo bridge
Fig. Esquema de conexión no modo bridge
Configuración de rede do equipo anfitrión dos contedores (real ou virtual) O modo bridge pode usarse sendo o equipo anfitrión un equipo real ou virtual. No caso de equipo virtual hay que facer un par de configuracións previas no adaptador de rede de Virtualbox:
Configuración da interface de rede da máquina virtual anfitrioa dos contedores:
Indico que é unha interface de tipo Adaptador puente e asócioa á interface enp6s0 da miña máquina real. Activo o Modo Promiscuo Configuración interface de rede
Fig. Adaptador da máquina virtual: modo ponte e modo promiscuo
Agora, imos ver as instruccións paso a paso (válidas tanto para Xubuntu 20.04 coma Xubuntu 22.04) para crear unha interface de tipo bridge e como crear un profile que a use. A configuración da interface de tipo bridge vaise facer usando o asistente gráfico de configuración de rede do equipo Ubuntu (no caso dun Ubuntu Server habería que facelo usando netplan e editando o arquivo de configuración de rede):
Editando a configuración de rede
Fig. Lanzando o configurador de rede
Editando a configuración de rede
Creando nova interface de tipo bridge
Creando nova interface de tipo bridge
Fig. Engadindo unha nova interface de tipo ponte (bridge)
Configuración interface de rede de tipo bridge
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge
Engadindo a interface da máquina virtual á ponte
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge
Engadindo a interface da máquina virtual á ponte
Fig. Engadir unha das interfaces de rede da máquina virtual ó bridge --> enp0s3
Interface de rede engadida á ponte
Configurando a IP da interface de tipo bridge
Fig. Configurando a IP da interface de tipo bridge
Interface ponte configurada
Reiniciamos o equipo e verificamos a configuración da nova interface. Fíxadevos que a interface bridge0 sí ten asignada unha IP e como enp0s3 agora forma parte da ponte, sí está activa pero non ten asignada unha configuración IP:
~$ 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP group default qlen 1000
link/ether 08:00:27:ff:fc:1f brd ff:ff:ff:ff:ff:ff
3: bridge0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 1e:69:e2:83:f4:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.1.150/24 brd 192.168.1.255 scope global noprefixroute bridge0
valid_lft forever preferred_lft forever
...
Configuración dos contedores
Igual que se fixo no modo macvlan, comezaremos creando un novo perfil a partir do default e modificamos o parent a bridge0 para indicar que a tarxeta eth0 do contedor vai conectarse o switch bridge0:
~$ incus profile copy default ponte-br0
~$ incus profile edit ponte-br0
### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
### raw.lxc: lxc.aa_profile=unconfined
### devices:
### eth0:
### nictype: bridged
### parent: incusbr0
### type: nic
###
### Note that the name is shown but cannot be changed
config:
environment.http_proxy: ""
user.network_mode: ""
description: Default Incus profile
devices:
eth0:
name: eth0
nictype: bridged
parent: bridge0
type: nic
root:
path: /
pool: default
type: disk
name: ponte-br0
used_by: []
Se queremos crear un novo contedor que use este perfil temos que executar:
~$ incus launch ubuntu:f platega04 --profile ponte-br0 Launching platega04 Se non queremos crear un novo contedor e sí aplicarlle o novo perfil a contedores xa creados, temos que usar incus profile assign: ~$ incus profile assign platega02 ponte-br0 Profiles ponte-br0 applied to platega02 asir@incus:~$ incus profile assign platega03 ponte-br0 Profiles ponte-br0 applied to platega03
Podemos comprobar que reciben a configuración de rede dende o servidor dhcp da rede local (e non o dhcp asociado a incusbr0):
~$ incus ls -c n,s,4,6,P,S +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | NOMBRE | ESTADO | IPV4 | IPV6 | PERFILES | SNAPSHOTS | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | platega00 | RUNNING | 10.119.191.239 (eth0) | fd42:380b:4b9f:3572:216:3eff:feaf:a7c7 (eth0) | default | 1 | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | platega01 | RUNNING | 10.119.191.183 (eth0) | fd42:380b:4b9f:3572:216:3eff:fe1d:1b21 (eth0) | default | 0 | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | platega02 | RUNNING | 192.168.1.48 (eth0) | | ponte-br0 | 0 | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | platega03 | RUNNING | 192.168.1.49 (eth0) | | ponte-br0 | 0 | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ <pre> Facendo probas de conectividade, podemos comprobar que funcionan as comunicacións en todos as direccións: Entre contedores: <pre> asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.49 PING 192.168.1.49 (192.168.1.49) 56(84) bytes of data. 64 bytes from 192.168.1.49: icmp_seq=1 ttl=64 time=0.244 ms 64 bytes from 192.168.1.49: icmp_seq=2 ttl=64 time=0.090 ms --- 192.168.1.49 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.090/0.167/0.244/0.077 ms Entre contedor e equipo anfitrión (e viceversa): asir@incus:~$ incus exec platega02 -- ping -c 2 192.168.1.150 PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data. 64 bytes from 192.168.1.150: icmp_seq=1 ttl=64 time=0.203 ms 64 bytes from 192.168.1.150: icmp_seq=2 ttl=64 time=0.077 ms --- 192.168.1.150 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.077/0.140/0.203/0.063 ms asir@incus:~$ ping -c 2 192.168.1.48 PING 192.168.1.48 (192.168.1.48) 56(84) bytes of data. 64 bytes from 192.168.1.48: icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from 192.168.1.48: icmp_seq=2 ttl=64 time=0.084 ms --- 192.168.1.48 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.066/0.075/0.084/0.009 ms Entre contedor e o exterior: asir@incus:~$ incus exec platega02 -- host www.edu.xunta.es 8.8.8.8 Using domain server: Name: 8.8.8.8 Address: 8.8.8.8#53 Aliases: www.edu.xunta.es has address 85.91.64.102
Dende equipos externos e o contedor:
~$ ping -c 2 192.168.1.48 PING 192.168.1.48 (192.168.1.48) 56(84) bytes of data. 64 bytes from 192.168.1.48: icmp_seq=1 ttl=64 time=0.559 ms 64 bytes from 192.168.1.48: icmp_seq=2 ttl=64 time=0.386 ms --- 192.168.1.48 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1027ms rtt min/avg/max/mdev = 0.386/0.472/0.559/0.089 ms
Igual que o indicado no modo macvlan, a partir de agora o contedor debe ter unha configuración válida para a rede da organización. Neste momento se arrincamos o contenedor, este trataría de obter unha configuración de rede por dhcp en base ó seu arquivo /etc/netplan/10-lxc.yaml. Se queremos asignarlle unha configuración estática, simplemente habería que indicar no /etc/netplan/10-lxc.yaml do contedor a nova configuración.
Contedores e redes wifi
Ás veces temos que traballar con equipos con conexión á rede mediante wifi e poden xurdir dificultades; xa que o modo ponte con interfaces wifi é problemático, polo que podemos atoparnos con dúas solucións:
Contedores correndo directamente sobre un equipo anfitrión real con wifi
Nesta situación a solución máis sinxela é aproveitar a rede incusbr0 creada durante a inicialización de incus e asociada ó perfil por defecto (profile default). Lembrando o explicado nun punto anterior
~$ ifconfig -a
enp0s3 Link encap:Ethernet direcciónHW 08:00:27:48:e3:f7
Direc. inet:192.168.1.150 Difus.:192.168.1.255 Másc:255.255.255.0
Dirección inet6: fe80::a00:27ff:fe48:e3f7/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:3685 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:1229 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:3736822 (3.7 MB) TX bytes:131513 (131.5 KB)
lo Link encap:Bucle local
Direc. inet:127.0.0.1 Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO MTU:65536 Métrica:1
Paquetes RX:160 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:160 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1
Bytes RX:11840 (11.8 KB) TX bytes:11840 (11.8 KB)
incusbr0 Link encap:Ethernet direcciónHW fe:77:8a:5a:b1:09
Direc. inet:10.119.191.1 Difus.:0.0.0.0 Másc:255.255.255.0
Dirección inet6: fe80::94c6:34ff:fe9e:9f92/64 Alcance:Enlace
Dirección inet6: fd42:380b:4b9f:3572::1/64 Alcance:Global
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:224 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:243 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:21346 (21.3 KB) TX bytes:38451 (38.4 KB)
Gráficamente a rede incusbr0 podería entenderse como:
rede lxdbr0
Fig. Rede en Incus - interfaz incusbr0
Asociado á interface incusbr0 hai unha regras de filtrado, DNAT e SNAT que permite que os contedores situados nesa rede poidan saír a través da interface facendo SNAT (ip masquerade) e temos o seguinte:
- Os contedores e o equipo anfitrión poden comunicarse directamente ó estar conectados ambos á rede incusbr0.
- Os contedores nesa rede poderán saír ó exterior grazas o SNAT. Polo tanto, a ip que se verán os equipos externos é a do equipo anfitrión.
- Se desexamos facer accesible algún servizo dos contedores dende o exterior hai que facer DNAT ou empregar un dispositivo tipo proxy.
Contedores correndo nunha máquina virtualbox e o equipo real con wifi
Caso#1: máquina virtual en modo ponte e contedores usando a rede lxdbr0
Nesta situación os contedores sairán sen problema grazas á rede incusbr0 e as regras NAT; eso si, as comunicacións aparecerán para o resto dos equipos da rede local como procedentes da máquina virtual que actúa como anfitriona para os contedores.
Caso#2: máquina virtual en modo ponte e contedores usando unha ponte br0
Pode dar problemas en función do hardware do equipo wifi e o punto de partida sería:
- Equipo real con wifi.
- Máquina virtual de virtualbox anfitriona dos contedores en modo ponte coa tarxeta wifi e con conexión a Internet polo wifi.
Na máquina virtual de virtualbox anfitriona dos contedores hai definida unha ponte br0 á que se conectan os contedores. Se os contedores non teñen conexión co exterior podemos adoptar algunha das seguintes solucións:
- A primeira solución podería ser traballar na máquina virtual de virtualbox anfitriona dos contedores con rede incusbr0 como se explicou no punto anterior.
- A segunda solución consiste en crear unha rede NAT en virtualbox e colocar ahí a máquina virtual de virtualbox anfitriona dos contedores e que éstes traballen en modo ponte co br0 do seu anfitrión. Os pasos a seguir nesta solución serían:
- Para crear a rede NAT en Virtualbox: Menú Archivo --> Preferencias --> Rede --> Redes NAT --> crear e indicar unha rede (p.e. na miña imaxe sería a 10.0.2.0/24)
- Rede NAT en virtualbox
Fig. Creando rede NAT en virtualbox
Na máquina virtual anfitriona cambiar o modo de rede do adaptador de ponte a rede NAT e escoller a rede NAT creada Rede NAT en virtualbox
Fig. Escollendo a rede NAT en virtualbox para a máquina anfitriona dos contedores
No sistema operativo da máquina virtual cambiar a configuración de rede do bridge br0: IP e máscara da rede NAT creada (non podes escoller a primeira que ven sendo o router NAT que fai virtualbox) Pasarela predeterminada: a primeira IP da rede NAT. No meu exemplo, 10.0.2.1. Os contedores que queiras que teñan saída debes poñelos cun perfil co parent br0 e con IP/máscara da rede NAT e gateway a primeira IP da rede NAT. Todas as máquinas virtuais conectadas a esa rede NAT poderá saír a Internet, e virtualbox encárgase de facer NAT de forma que saen ó exterior usando a IP do equipo real. Como recoñecen os programadores de virtualbox, o modo NAT funciona sempre en caso de usar wifi pero o modo bridge depende do hardware da tarxeta wifi e do punto de acceso.
O maior problema das redes NAT virtualbox é que os equipos situados nesas redes únicamente poden falar con equipos situados na mesma rede e con Internet. Se tes que comunicarte con esa máquina virtual (iniciar conexións hacia ela) dende o equipo real tes dúas opcións:
Colocar outra máquina virtual na mesma rede NAT. Configurar o reenvío de portos na rede NAT (semellante ó DNAT que vimos en iptables) mapeando a IP do equipo real e un porto cun equipo da rede NAT e un porto seu. Reenvío de portos
Fig. Reenvío de portos para facer accesible un servizo nun contedor a través da IP do anfitrión virtualbox
Comunicacións entre contedores no equipo real e máquinas virtuais sobre Virtualbox
nha cousa curiosa que me aconteceu ó traballar con contedores foi que había problemas de comunicación na seguinte situación:
Contedores LXC/Incus correndo directamente nun equipo real e traballando en modo ponte (usando a interfaz br0 do equipo real). Máquina virtual sobre Virtualbox traballando en modo ponte. As comunicacións dos contedores con outros contedores, co equipo real, con equipos da rede local e con equipos da Internet non teñen problema. O mesmo acontece coas comunicacións entre a máquina virtual sobre Virtualbox e o equipo anfitrión, equipos da rede local e equipos da Internet. Sen embargo, entre contedores e máquina virtual non.
Tamén sucedía o mesmo se quería 'enganchar' unha máquina virtual Virtualbox a unha das redes Incus (por exemplo a rede incusbr0): configuraba o adaptador de rede da máquina virtual para conectarse a incusbr0 e non había comunicación entre os contedores da rede lxdbr0 e a máquina virtual.
O realmente curioso é que entre o contedor e a máquina virtual si se podía facer ping pero non funcionaba outro tipo de conexión. Tras buscar información, atopei que outra xente sufría o mesmo problema (que é achacado á forma de manexar o tráfico de rede por parte de Virtualbox) e que a solución era crear unha nova interface de rede a usar por Virtualbox e integrala na rede lxdbr0 ou no switch br0.
De non telo, instálanse os paquetes bridge-utils e uml-utilities e continuación creamos o seguinte script para incluir máquinas virtuais na rede lxdbr0:
~$ sudo apt update ~$ sudo apt install bridge-utils uml-utilities ~$ nano interfaz_incusdbr0_para_virtualbox.sh #!/bin/bash tunctl -u root -g vboxusers -t vbox0 ip link set up dev vbox0 brctl addif incusbr0 vbox0 ~$ chmod 755 interfaz_incusdbr0_para_virtualbox.sh
E para executalo:
~$ sudo ./interfaz_incusdbr0_para_virtualbox.sh Set 'vbox0' persistent and owned by uid 0 gid 122
Deste xeito, creouse unha nova interface chamada vbox0 conectada á rede lxdbr0:
~$ sudo brctl show bridge name bridge id STP enabled interfaces incusbr0 8000.902b343d8912 no veth2ac995c0
vbox0
Esta interface será a que temos que indicar na configuración de rede en Virtualbox para que as comunicacións contedor <-> máquina virtual funcionen correctamente:
interface Vbox
Fig. Escollendo a nova interface vbox nas propiedades da máquina virtual.
Para non ter que executar a man o script, podemos configurar o equipo para que se execute ó inicio do equipo anfitrión
Contedores con contorno gráfico
É posible ter contedores correndo un contorno gráfico. Explicarei unha forma que relativamente sinxela, empregando como contorno gráfico XFCE (é dicir Xubuntu, un Ubuntu co contorno gráfico liviano XFCE) e usando X2Go para acceder ó contorno gráfico.
Preparando o contedor
Procedemos a crear un contedor ó que poidamos conectarnos vía remota (no exemplo emprego un perfil coa rede en modo ponte pero pode usarse outros perfil, como o perfil default coa rede lxdbr0):
~$ incus launch images:ubuntu/jammy lxde
Entramos no contedor e poñemos un contrasinal á conta ubuntu que xa está creada por defecto:
~# passwd ubuntu Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Actualizamos a llista de paquetes dispoñibles nos repositorios e procedemos á instalación de todos os paquetes do contorno gráfico Xubuntu Desktop:
~# apt update ~# apt install xubuntu-desktop
X2Go permite acceder ó contorno gráfico dun equipo usando unha conexión de rede. A idea básica é que no contedor instalaremos o servidor X2Go e noutro equipo o cliente X2Go; desta forma, dende o equipo cliente poderemos traballar co contorno gráfico correndo no contedor.
Para instalar o servidor X2Go simplemente executamos:
~# apt install x2goserver x2goserver-xsession
Instamos OpenSSH Server e modificaremos un par de parámetros de configuración do servidor ssh en /etc/ssh/sshd_config e reiniciaremos o servizo:
~# apt install openssh-server nano root@xubuntu:~# nano /etc/ssh/sshd_config ... ChallengeResponseAuthentication yes PasswordAuthentication yes ... ~# systemctl ssh restart ssh stop/waiting ssh start/running, process 2584
Preparando o equipo cliente
Unha vez preparado o contedor co contorno gráfico XFCE e o servidor X2Go, temos que preparar o equipo dende nos imos a conectar instalando o cliente X2Go:
- ~$ sudo apt update
- ~$ sudo apt install x2goclient
Arrincamos o cliente X2Go e configuramos unha nova sesión indicando a IP do contedor, o usuario que usaremos para iniciar sesión no contedor (ubuntu) e o tipo de sesión (XFCE):
Configurando a conexión no cliente X2Go
Configurando a conexión no cliente X2Go
Fig. Configurando a conexión no cliente X2Go.
Unha vez creada a conexión, procedemos a conectarnos:
Iniciando conexión X2Go co contedor
Iniciando conexión X2Go co contedor
Fig. Establecendo conexión X2Go co contedor Xubuntu.
Unha vez dentro do contedor, podemos empregar o contorno gráfico como se estivesemos sentados diante dun equipo Xubuntu:
Traballando co contedor usando X2Go
Fig. Traballando no contedor Xubuntu.