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
- Instalar Iocage Jail Manager
- Descargar la versión de FreeBSD
- Configurar IP Compartida y Firewall pf
- Crear una nueva jaula con Iocage
- 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’.