[2/3] Container networking con AppJail: DHCP, SLAAC, NAT y port forwarding

Iniciado por DtxdF, Febrero 22, 2023, 12:05:10 PM

Tema anterior - Siguiente tema

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


Fuente: InfoWorld

En la No tienes permitido ver los links. Registrarse o Entrar a mi cuenta se presentó los usos básicos de redes para los contenedores en FreeBSD utilizando AppJail. AppJail puede lidiar con problemas más complejos para poder adaptarse a entornos o necesidades mucho más específicas, como se verá acontinuación.

Al igual que la parte anterior, no se mostrarán configuraciones del host para que las opciones sean efectivas, ya que de eso se encarga la documentación: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Es importante leer la primera parte para conocer cómo son nombradas las interfaces.


DHCP & SLAAC:

AppJail puede confiar los parámetros de la red a otro nodo de la red, por lo que será más sencillo y rápido crear y administrar jaulas genéricas.

Primero que nada, necesitamos configurar algunas reglas `devfs.ruleset(5)` para habilitar `bpf(4)` ya que `dhclient(8)` lo requerirá.


/etc/devfs.rules:
Código: text
[devfsrules_dhcp=10]
add include $devfsrules_jail_vnet
add path 'bpf*' unhide

Con lo anterior, los ejemplos posteriores serán efectivos.

Código: sh
# VNET + DHCP
 appjail quick jdhcp \
    vnet=em0 \
    dhcp=em0 \
    mount_devfs \
    devfs_ruleset=10 \
    start
# Netgraph + DHCP
appjail quick jdhcp \
    jng="jdhcp em0" \
    dhcp=ng0_jdhcp \
    mount_devfs \
    devfs_ruleset=10 \
    start \
    overwrite
# Netgraph + Bridge + DHCP
appjail quick jdhcp \
    jng="jdhcp em0" \
    bridge="iface:jext jdhcp" \
    dhcp=ng0_jdhcp \
    dhcp=sb_jdhcp \
    mount_devfs \
    devfs_ruleset=10 \
    start \
    overwrite

IPv6 está creciendo rápidamente a lo largo del mundo por lo que AppJail tiene soporte para esta característica. AppJail puede confiar en SLAAC para configurar algunos parámetros de red para una interfaz dada.

Código: sh
# VNET + SLAAC
appjail quick jslaac \
    vnet="em0" \
    slaac="em0" \
    start \
    overwrite
# VNET + SLAAC + Bridge + DHCP
appjail quick jds \
    vnet="em0" \
    slaac="em0" \
    bridge="iface:jext jds" \
    dhcp="sb_jds" \
    mount_devfs \
    devfs_ruleset=10 \
    start

NAT:

Gracias a las redes virtuales, NAT es posible, siendo este un camino alternativo a los puentes para que la jaula pueda comunicarse con el exterior.

Este tipo de configuración es la forma alternativa a los puentes y no tendría sentido combinarla. Ver la documentación para más detalles.


Código: sh
appjail quick jnat virtualnet="development:jnat default" nat start
# explicitly
appjail quick jnat virtualnet="development:jnat default" nat="network:development" overwrite start

La opción `nat` requiere que el parámetro `network` esté definido, pero como se pudo observar, dado que `development` está marcada como la red predeterminada usando el parámetro `default`, se puede usar de forma implícita en opciones como `nat` o `expose` como veremos más adelante. Cuando no hay ninguna red predeterminada, `nat` se quejará si no se define el parámetro `network`.

Es posible aplicar NAT a varias redes en las que se encuentre la jaula, lo cual es útil si se usará la dirección de origen para diferentes propósitos.


Código: text
# appjail quick jnat virtualnet="development:jn1 default" virtualnet="web:jn2" nat nat="network:web" start overwrite
...
# appjail network hosts -REj jnat
192.128.0.2     development
10.0.0.2        web
# appjail cmd jexec jnat ping -c4 -S 192.128.0.2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 192.128.0.2: 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=114 time=45.209 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=44.204 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=44.436 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=44.864 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 44.204/44.678/45.209/0.387 ms
# appjail cmd jexec jnat ping -c4 -S 10.0.0.2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.0.0.2: 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=114 time=44.984 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=45.167 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=44.426 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=44.581 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 44.426/44.789/45.167/0.298 ms

También podemos realizar el proceso de `appjail quick` de forma manual.

Código: sh
appjail quick jnat virtualnet="development:jn1 default" overwrite
appjail nat add jail -n development jnat
appjail config -Ia 'exec.prestart="appjail nat on jail ${name}"' -j jnat
appjail config -Ia 'exec.poststop="appjail nat off jail ${name}"' -j jnat
appjail start jnat

AppJail también puede aplicar NAT a una red entera en lugar de hacerlo por cada jaula.

Código: text
# appjail nat add network db
# appjail nat on network db
# appjail nat boot on network db
# service appjail-natnet status
NAT Information:

BOOT  NAME  RULE
1     db    nat on "jext" from 10.42.0.0/24 to any -> ("jext:0")

Status:

nat on jext inet from 10.42.0.0/24 to any -> (jext:0) round-robin

En el ejemplo anterior, NAT se aplicará al inicio del servicio `appjail-natnet`, ya que el boot flag está ajustado a 1.

Aplicar NAT a una red entera ahorra tiempo y recursos, pero hay veces en las que determinadas jaulas no deberían comunicarse con el exterior. AppJail soluciona esto aplicando una regla NONAT evitando así enmascarar la dirección IP de la jaula.


Código: text
# Usando appjail quick:
appjail quick jnonat virtualnet="db:jnonat default" nonat overwrite start
# Manualmente:
appjail quick jnonat virtualnet="db:jnonat default" overwrite
appjail nat add jail -n db -N jnonat
appjail config -Ia 'exec.prestart="appjail nat on jail ${name}"' -j jnonat
appjail config -Ia 'exec.poststop="appjail nat off jail ${name}"' -j jnonat
appjail start jnonat

Port forwarding:

Exponer los servicios de red que se encuentren en una jaula hacia el exterior para que nuestros clientes puedan aprovechar esto resulta bastante útil. Por ejemplo, NGINX puede ser usado para proveer un servidor web a nuestros clientes:

Código: sh
# Usando appjail quick:
appjail quick nginx virtualnet="web:nginx default" nat expose=80 start
# Mnualmente:
appjail quick nginx virtualnet="web:nginx default" nat overwrite
appjail expose set -k web -p 80 nginx
appjail config -Ia 'exec.prestart="appjail expose on ${name}"' -j nginx
appjail config -Ia 'exec.poststop="appjail expose off ${name}"' -j nginx
appjail start nginx
# www/nginx:
appjail pkg jail nginx install -y nginx
appjail sysrc jail nginx nginx_enable="YES"
appjail service jail nginx nginx start

Dado que somos el host, podemos realizar una petición HTTP directamente a la dirección IP de la jaula:

Código: text
# fetch -qo - http://10.0.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

En cambio otro host dentro de la red podría usar la dirección IP del host, asumiendo en este caso que es `192.168.1.105`:

Código: text
# fetch -qo - http://192.168.1.105
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Conclusión:

En este pequeño artículo se mostraron más características de AppJail que permiten tener más control acerca de la red y sus parámetros. Es un complemento de la parte anterior, por lo que es recomendable leer ambas partes. No obstante, tanto esta como la anterior parte forman lo esencial para adaptar una o más jaulas a nuestro entorno. En la parte siguiente se mostrarán configuraciones más complejas asumiendo lo anteriormente aprendido.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF