Cómo configurar la cárcel con Iocage en FreeBSD

Jail es un término para la virtualización a nivel de SO en FreeBSD. Fue introducido por Poul-Henning Kamp en 1999 y adoptado por FreeBSD desde la versión 4.x.

La Cárcel permite al administrador del sistema crear un minisistema aislado e independiente o ‘cárcel’ dentro del sistema FreeBSD. La ‘cárcel’ tiene su sistema raíz y su configuración, y es útil si quieres desplegar una aplicación en un entorno aislado.

Iocage es un gestor de jaulas FreeBSD que está escrito en Python. Es sencillo y viene con una sintaxis de comandos fácil. El gestor de jaulas Iocage está dedicado al conjunto de datos ZFS dentro de las jaulas y te permite crear una jaula basada en las pilas de redes virtuales «VNET» y/o la jaula basada en «IP compartida». Con Iocage, puedes crear la plantilla de jaula, la jaula base y la jaula normal.

Este tutorial te mostrará cómo instalar y configurar la cárcel FreeBSD utilizando Iocage Jail Manager. Instalaremos el Iocage en FreeBSD, configuraremos una nueva jaula usando IP compartida, configuraremos el cortafuegos pf, y luego instalaremos el servidor web nginx dentro de la jaula para hacer pruebas.

Requisitos previos

Para esta guía, será necesario que instales y configures Iocage Jail Manager en el sistema FreeBSD instalado en el ZFS (Z File System). Y asegúrate de que tienes activado el Firewall pf en tu sistema FreeBSD.

A continuación encontrarás la guía para la instalación de FreeBSD en ZFS y la configuración del cortafuegos pf.

Cómo instalarFreeBSD 12.0 en ZFS
Cómo configurar el cortafuegos pf en FreeBSD

Qué vamos a hacer

  1. Instalar Iocage Jail Manager
  2. Descargar la versión de FreeBSD
  3. Configurar IP Compartida y Firewall pf
  4. Crear una nueva jaula con Iocage
  5. Probar

Paso 1 – Instalar Iocage en FreeBSD

En primer lugar, instalaremos y configuraremos el gestor de Cárceles Iocage en el sistema FreeBSD. Iocage está escrito en Python y está disponible en el repositorio de paquetes binarios de FreeBSD.

Instala Iocage en el sistema FreeBSD utilizando el comando pkg que aparece a continuación.

pkg install py36-iocage

Escribe ‘y’ para aceptar la instalación del paquete python Iocage, y comenzará la instalación.

Una vez finalizada la instalación, comprueba el pool ZFS disponible en el sistema utilizando el comando zpool que aparece a continuación.

zpool list

Ahora elige el pool ZFS para la instalación de Iocage. Para esta guía, utilizaremos el pool ZFS por defecto para FreeBSD instalado llamado ‘zroot’.

Activa el pool ‘zroot’ para el uso de Iocage utilizando el comando de abajo.

iocage activate zroot

Ahora la instalación de Iocage en FreeBSD 12.0 se ha completado, y puedes utilizar la línea de comandos iocage para crear y gestionar la jaula FreeBSD.

Además, puedes habilitar la jaula en el arranque del sistema añadiendo el servicio iocage al archivo ‘/etc/rc.conf’ mediante el comando sysrc que se indica a continuación.

sysrc iocage_enable=yes

Paso 2 – Descarga la versión de FreeBSD

Para crear una nueva jaula, necesitarás descargar la Release de FreeBSD. Y puedes crear una nueva jaula que sea una versión diferente de la versión de tu FreeBSD anfitrión.

Comprueba las versiones Release disponibles utilizando el comando iocage que aparece a continuación.

iocage fetch

Ahora obtendrás una versión diferente de la Release. Selecciona la versión que necesites y escribe el número. Elige el número «2» para descargar la última versión de la Release.

Espera a que se descargue la imagen de la Release de FreeBSD.

Si quieres descargar una imagen diferente, puedes utilizar la siguiente orden.

iocage fetch 11.3-RELEASE

Como resultado, se ha descargado la imagen de la release de FreeBSD para la cárcel.

Paso 3 – Configurar la IP compartida y el cortafuegos Pf

Tras descargar las imágenes de origen para jail, configuraremos la red y el cortafuegos pf en el sistema. Crearemos una nueva interfaz de red llamada ‘bridge0’ con la dirección IP de red ‘10.8.8.1/24’, y será utilizada por la jaula.

Añade la nueva configuración al archivo ‘/etc/rc.conf’ ejecutando el siguiente comando.

sysrc cloned_interfaces+="bridge0"
sysrc ifconfig_bridge0="10.8.8.1/24"

Crea una nueva interfaz ‘bridge0’ con la dirección IP de red ‘10.8.8.1/24’.

ifconfig bridge0 create
ifconfig bridge0 10.8.8.1/24 up

Ahora que se ha creado la interfaz ‘bridge0’, compruébala utilizando el siguiente comando.

ifconfig bridge0

Y obtendrás el resultado que se muestra a continuación.

A continuación, configuraremos el cortafuegos pf y añadiremos una nueva configuración para el entorno jail. En esta guía utilizaremos la configuración simple del cortafuegos pf.

Cómo configurar el cortafuegos pf en FreeBSD 12.0

Ve al directorio ‘/usr/local/etc’ y edita el archivo de configuración ‘pf.conf’.

cd /usr/local/etc/
vim pf.conf

Añade la interfaz de red interna ‘bridge0’ y su dirección IP como variables ‘int_if’ y ‘localnet’.

# Internal interface
int_if = "bridge0"
localnet = $int_if:network

Ahora define la dirección IP de la jaula y los puertos que se reenviarán a la jaula. Reenviaremos las conexiones HTTP y HTTPS de la interfaz externa del sistema a la dirección IP del host de la jaula ‘10.8.8.5’.

# Port-Forward http and https to Jail '10.8.8.5'
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"

Habilita nat en la interfaz externa ‘ext_if’ para la variable ‘localnet’ de la cárcel, y luego habilita la redirección de puertos desde la variable ‘ports_to_forward’ al host ‘forward_host’.

# nat jail to internet and internet to jail (http and https only)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host

Ahora pasa todas las conexiones desde la interfaz ‘bridge0’ y pasa las conexiones entrantes en la interfaz externa a los ‘ports_to_forward’ HTTP y HTTPS.

pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state

Guarda y cierra.

Ahora prueba la configuración del cortafuegos pf y asegúrate de que no hay ningún error, luego vuelve a cargar el servicio pf.

service pf check
service pf reload

Después, comprueba todas las reglas del cortafuegos pf utilizando el siguiente comando.

pfctl -s rules

Y obtendrás el resultado que se muestra a continuación.

Además, puedes comprobar el estado nat en el cortafuegos pf.

pfctl -v -s nat

Como resultado, se ha creado la nueva interfaz «bridge0» y se ha configurado el cortafuegos pf. Y ya estamos listos para crear la primera nueva jaula.

A continuación se muestra la configuración completa del cortafuegos pf.

cat /usr/local/etc/pf.conf
# Define External Interface and IP Address
ext_if="vtnet0"
ext_ip="198.13.39.207"

# Define TCP and UDP Services
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"

# Internal interface
int_if = "bridge0"
localnet = $int_if:network

# Port-Forward http and https to Jail '10.8.8.5'
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"

# Skip the localhost
set skip on lo0

# Log interface
set loginterface $ext_if

# nat jail to internet and internet to jail (http and https only)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host


# Default Policy
block in all
pass out all keep state

# Allow Ping
pass inet proto icmp icmp-type echoreq

pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state

# Allow Services
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto tcp from any to any port $ext_udp_ports

# Log access for ssh and http
pass log quick proto tcp from any to any port { ssh,http }

Paso 4 – Crear una nueva jaula utilizando Iocage

Tras configurar la red y el cortafuegos pf en el sistema FreeBSD, estamos listos para crear una nueva jaula usando iocage.

Crea una nueva jaula llamada ‘jail01’ con la versión de FreeBSD ‘12.0-RELEASE’ utilizando el comando iocage que aparece a continuación.

iocage create -n jail01 -r 12.0-RELEASE

Ahora añade la dirección IP y la puerta de enlace del router por defecto de la jaula. Le daremos a la ‘jail01′ una dirección IP 10.8.8.5’ y la puerta de enlace del router por defecto es la dirección IP del host ‘bridge0’ ‘10.8.8.1’.

iocage set ip4_addr="bridge0|10.8.8.5" jail01
iocage set defaultrouter="10.8.8.1" jail01

Activa la jaula para que se inicie al arrancar.

iocage set boot=on jail01

Ahora comprueba la lista de jaulas.

iocage list

Y obtendrás la ‘jail01’ con la dirección IP ‘10.8.8.5’ y basada en la release ‘12.0’ de FreeBSD.

A continuación, inicia la «jail01» utilizando el siguiente comando.

iocage start jail01

Una vez iniciada la jaula, accede a ella utilizando el siguiente comando.

iocage console jail01

Obtendrás una nueva shell dentro de jail01, como se muestra a continuación.

Dentro de la jaula, comprueba la dirección IP de la interfaz ‘bridge0’ en la ‘jail01’.

ifconfig bridge0

Y obtendrás que la interfaz ‘bridge0’ tiene configurada la dirección IP ‘10.8.8.5’.

Como resultado, se ha creado una nueva jaula llamada ‘jail01’.

Paso 5 – Pruebas

En este paso, probaremos la «jaula01» instalando en ella el servidor web Nginx e intentaremos acceder a Nginx desde el exterior de la red, y la conexión será redirigida a la «jaula01».

En primer lugar, actualiza los paquetes binarios de la jaula utilizando el comando pkg que se indica a continuación.

pkg update

Después, instala el servidor web nginx dentro de la jaula utilizando el siguiente comando pkg.

pkg install nginx

Una vez completada la instalación, añade el servicio nginx al arranque del sistema e inícialo.

sysrc nginx_enable=yes
service nginx start

Ahora comprueba la lista de puertos abiertos en la ‘jail01’.

sockstat -l4

Y obtendrás que el servicio Nginx está funcionando en el puerto HTTP ’80’.

A continuación, cambiaremos la página index.html por defecto en la ‘jail01’.

Ve al directorio ‘/usr/loca/www/’ y edita el archivo ‘index.html’.

cd /usr/local/www/
edit nginx-dist/index.html

Haz algunos cambios y sal.

cat nginx-dist/index.html

Ahora accede a la dirección IP externa del servidor desde tu navegador web.

http://198.xx.xx.207/

Y obtendrás la página index.html de nginx dentro de la ‘jail01’.

Como resultado, la ‘jaula01’ está funcionando con Nginx instalado en ella. Todas las conexiones HTTP y HTTPS al servidor serán redirigidas a la ‘jaula01’.

Referencia

También te podría gustar...