[1/3] Container networking con AppJail: puentes, vnet, virtualnets y mucho más

Iniciado por DtxdF, Febrero 21, 2023, 04:20:41 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.


Fuente: IONOS

En una No tienes permitido ver los links. Registrarse o Entrar a mi cuenta se brindó una breve introducción a los contenedores en FreeBSD usando AppJail, pero eso solo es una pequeña parte de todo el conjunto. Las redes son un aspecto fundamental cuando se trata de contenedores, ya que son la forma en cómo interactúan los contenedores tanto con los clientes, como con nosotros mismos, los administradores, y también como interactúan entre ellos mismos. No solo es una forma de comunicación, también es una cuestión de organización.

AppJail está hecho para tratar con estos aspectos adaptándose a diferentes necesidades, como se verá a continuación.

No se mostrarán las configuraciones que necesita el host, ni como configurar el firewall o cosas similares, ya que de eso se encarga la documentación: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


IP aliasing:

Aunque el IP aliasing no provea aislamiento, para cierto tipo de aplicaciones puede ser bastante útil.

Código: sh
# IPv4
appjail quick myjail alias=jext ip4="192.168.1.120/24" overwrite start resolv_conf
# IPv6
appjail quick myjail alias=jext ip6="2001:db8:0:1::2/64" overwrite start resolv_conf
# Dual
appjail quick myjail alias=em0 ip4="192.168.1.120/24" ip6="2001:db8:0:1::2/64" overwrite start resolv_conf
# Múltiples interfaces
appjail quick myjail alias ip4="jext|192.168.1.120/24" ip6="em0|2001:db8:0:1::2/64" overwrite start resolv_conf

Tanto `ip4` como `ip6` pueden ser especificadas múltiples veces. La opción `overwrite` detiene y destruye la jaula si existe, y `resolv_conf` copia el archivo `/etc/resolv.conf` del host a la jaula. Aunque la opción `resolv_conf` realmente no sea necesaria especificarla, ya que en el archivo de configuración de AppJail está habilitada por defecto, es útil para ilustrar como es el proceso manualmente.

Redes virtuales:


AppJail puede crear redes aisladas y privadas, las cuales son llamadas «redes virtuales». Una jaula puede estar en más de una red virtual. Esto es increiblemente útil para organizar de forma lógica un montón de jaulas.

Recomiendo usar rangos privados especificados con más detalles en RFC 1918:

* 10.0.0.0/8
* 172.16.0.0/12
* 192.168.0.0/16

Antes de crear una jaula, necesitamos tres cosas: la dirección de red, el CIDR y el nombre. En el siguiente ejemplo, la red `development` tendrá como dirección de red `10.42.0.0` y el CIDR será `24`.


Código: sh
appjail network add development 10.42.0.0/24

Ahora que tenemos nuestra red, es posible crear una jaula que esté en ella.

Código: sh
appjail quick myjail virtualnet="development:myjail" overwrite start

En este caso la jaula llamada `myjail` estará en la red `development` y usará una interfaz llamada `myjail`. El nombre de la interfaz puede ser igual al nombre de la jaula, pero recomiendo mantenerlo corto (menos de 10 caracteres).

Una forma de ilustrar las redes virtuales es creando otra que esté en la misma red que `myjail`.


Código: sh
appjail quick otherjail virtualnet="development:otherjail" overwrite start

Una vez lo anterior esté concluido, necesitamos conocer la dirección IP de cada jaula, lo cual se puede lograr usando el comando `appjail network hosts`.

myjail:
Código: text
# appjail network hosts -REj myjail
10.42.0.2      development

otherjail:
Código: text
# appjail network hosts -REj otherjail
10.42.0.3      development

Ahora podemos utilizar `ping(8)` para verificar el éxito de la comunicación.

Código: text
# appjail cmd jexec otherjail ping -c4 10.42.0.2
PING 10.42.0.2 (10.42.0.2): 56 data bytes
64 bytes from 10.42.0.2: icmp_seq=0 ttl=64 time=0.369 ms
64 bytes from 10.42.0.2: icmp_seq=1 ttl=64 time=0.211 ms
64 bytes from 10.42.0.2: icmp_seq=2 ttl=64 time=0.172 ms
64 bytes from 10.42.0.2: icmp_seq=3 ttl=64 time=0.129 ms

--- 10.42.0.2 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.129/0.220/0.369/0.090 ms

IP aliasing & Redes virtuales:

La razón principal por la que las redes virtuales y el IP aliasing se pueden combinar es para proveer opciones de red para las jaulas que no pueden utilizar `vnet(9)`, como las jaulas con linux, aunque perfectamente se puede utilizar una jaula estándar.

Código: sh
appjail quick jalias alias="appjail0" virtualnet="development" start

Herendado el stack del host:

Aunque esto puede causar algunos problemas con algunas aplicaciones, heredar el stack de red del host puede ser útil para ciertas aplicaciones, aunque este método no provee aislamiento de ninguna manera.

Código: sh
appjail quick myjail alias ip4_inherit ip6_inherit resolv_conf overwrite start

Deshabilitando el stack de red:

AppJail puede crear una jaula con IPv4 o IPv6 deshabilitado usando `ip4_disable` y `ip6_disable`.

Código: sh
appjail quick myjail alias ip4_disable ip6_disable resolv_conf overwrite start

Netgraph:

AppJail puede utilizar Netgraph para crear puentes y enlaces de la misma forma que los puentes. AppJail utiliza el script `jng` por lo que es necesario tenerlo instalado de antemano:

Código: sh
install -m 555 /usr/share/examples/jails/jng /usr/local/bin/jng

Ahora podemos usar la opción `jng` del comando `appjail quick` para crear nuestra jaula con el tipo de configuración mencionada anteriormente.

Código: sh
appjail quick myjail jng="myjail jext" overwrite start

El nombre `myjail` será utilizado por los enlaces y `jext` es la interfaz de nuestro sistema que será agregada como miembro del puente que creará `jng`. En el ejemplo anterior, se creará un nodo llamado `ng0_myjail` y un puente llamado `jextbridge`.

Puentes:


AppJail puede crear puentes, interfaces y agregar interfaces existentes como miembros del puente en demanda. Esta opción provee una forma distinta de manejar el apartado de redes para las jaulas, y es mucho más flexible.

Código: sh
appjail quick jbridge bridge="jpub iface:jext" start
# Si no se define ningún puente, como en el anterior ejemplo,
# appjail será usado.
appjail quick jbridge bridge="jpub iface:jext bridge:public" start

En el ejemplo anterior, dos interfaces serán creadas: `sa_jpub` que será agregada como miembro del puente y `sb_jpub` será para la jaula.

Supongamos que ya hemos instalado los paquetes que necesitamos para la jaula anterior, y no queramos que esa jaula vuelva a tener conexión con el exterior hasta que realmente se vuelva a necesitar. AppJail puede lograr esto quitando `jpub` como miembro del puente.


Código: sh
appjail network detach jpub

Sin embargo, es necesario editar la plantilla de la jaula y eliminar las líneas donde se hace referencia a esta interfaz para que en un reinicio no la vuelva a crear y agregar.

Cabe aclarar que dado que `jpub` no es miembro del puente, AppJail no la destruirá al detener la jaula, para forzar esto podríamos usar `appjail detach -df`.


Código: sh
appjail network detach -df jpub

VNET:

Probablemente se tiene una tarjeta de red sobrante que una jaula puede aprovechar para su máximo rendimiento. AppJail puede tomar ventaja de esto usando la opción `vnet`.

Código: sh
appjail quick jvnet vnet=em0 start

Conclusión:

En este pequeño artículo de una serie de artículos se explica lo básico para configurar el apartado de redes de nuestras jaulas. AppJail ofrece más opciones que se adaptan a determinados entornos, cada vez un poco más complejos, por lo que se detallarán en siguientes episodios.

~ DtxdF
~ DtxdF

Como mencioné, está muy bueno e interesante por lo actualizado.

Al principio pensé que era un tipo de sandbox, pero no; es un tipo de virtualización que, entre otras tantas variables pudiera permitir el sandbox en su interior si se le monta.

Incluso, si se es habilidoso se puede crear pequeñas botnet, si se posicionan estratégicamente.

Anoche estuve buscando info.

De lujo, la presentación y tutorial

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Gracias No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o/

Sí, es parecido a la virtualización, aunque se le conoce normalmente como "virtualización imperfecta", "virtualización ligera", "contenedores" o para el caso de FreeBSD, jaulas.

Se puede usar para lo que comenta, para probar aplicaciones que podrían arruinar o desordenar el host, por ejemplo.

En el mismo README dejé documentos o enlaces que hablan en profundidad sobre las jaulas o tecnologías relacionadas. También le recomiendo la wiki de FreeBSD, ahí hay información variada de las jaulas.

~ DtxdF
~ DtxdF