Diferencia entre revisiones de «Escenario 3C. LXC: Máis sobre contedores Incus»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 327: Línea 327:
  
 
== Contedores e redes wifi ==
 
== 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
 +
 +
<pre>
 +
~$ 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)
 +
</pre>
 +
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 ==
 
== Comunicacións entre contedores no equipo real e máquinas virtuais sobre Virtualbox ==

Revisión del 19:11 19 ene 2026

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

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.

Referencias