Vamos a seguir con nuestro home server en OpenMediaVault. En esta ocasión vamos a configurar un proxy inverso con nginx para poder acceder a la interfaz web de Transmission, y dar una dirección a nuestro servidor OpenVPN.
- Primera Parte (Instalación y configuración de OMV)
- Segunda Parte (OpenVPN, MiniDLNA y Transmission)
- Tercera Parte (Nginx reverse proxy, Let’s Encrypt y Fail2ban)
- Cuarta Parte (Copias de seguridad y hardware)
Instalación de los plugins de OpenMediaVault necesarios
Para empezar, vamos a instalar los plugins necesarios, que serían los siguientes:
- openmediavault-nginx
- openmediavault-letsencrypt
- openmediavault-fail2ban
Si recordáis del capítulo anterior, esto se hace desde Sistema -> Plugins seleccionando los que deseemos y presionando instalar.
Configuracion de Nginx en OpenMediaVault
Vamos a configurar el servidor web Nginx para actuar como reverse proxy y así, poder acceder a nuestras interfaces web desde el exterior.
Ésto lo haremos desde Servicios -> Nginx. Utilizaremos hosts basados en nombre, lo que nos permitirá varios dominios o subdominios en el mismo puerto.
1. Configuración
En la primera pestaña, simplemente tendremos que habilitar el plugin. Para la opción Tamaño de hash dejaremos 32, que es la que viene por defecto.
2. Servidores
Aquí es dónde sucede la magia. Vamos a crear un servidor para cada uno de los servicios a los que queramos acceder desde el exterior y cada uno de ellos tendrá un dominio o subdominio distinto.
Yo he creado cuatro:
- dominio.com -> Actualmente sin uso
- files.domino.com -> Interfaz web de OpenMediaVault
- vpn.dominio.com -> Acceso a OpenVPN
- torrent.dominio.com -> Interfaz web de Transmission
Para crear un servidor, haremos clic en añadir y realizaremos las siguientes configuraciones:



Crearemos tantos servidores cómo deseemos. Yo he creado los mencionados anteriormente.
Ahora, en Opciones extra pondremos lo siguiente:
1 2 3 4 5 6 7 8 9 10 | location ^~/.well-known { allow all; auth_basic off; root /var/www/html; } location / { auth_pam "Secure zone"; auth_pam_service_name "nginx"; } |
1 2 3 | location / { proxy_pass http://127.0.0.1:1194/; } |
1 2 3 4 5 6 7 8 9 10 11 | location /.well-known { allow all; auth_basic off; root /var/www/html; } location / { auth_pam "Auth Required"; auth_pam_service_name "nginx"; proxy_pass http://127.0.0.1:9091/; } |
1 2 3 4 5 6 7 8 9 10 11 | location /.well-known { allow all; auth_basic off; root /var/www/html; } location / { auth_pam "Auth Required"; auth_pam_service_name "nginx"; proxy_pass http://127.0.0.1/; } |
Vamos a ver que hacen estas opciones extra:
El primer bloque que vemos location /.well-known, desactiva la autenticación para ese directorio y establece su raiz a /var/www/html. Esto es usado por Let’s Encrypt para la creación y renovación de certificados.
El segundo bloque activa la Autenticación Pam, ese decir, para acceder tendremos que autenticarnos con un usuario del sistema que previamente habremos creado en OpenMediaVault, tal y como vimos en la parte 1 de esta guía.
A continuación, vemos la línea proxy_pass en que redirigimos la petición que recibimos en el puerto 80 o 443 al puerto local en que escucha el servicio en cuestión.
Generando certificados SSL con Let’s Encrypt
Una vez tenemos los servidores pasamos a configurar Let’s Encrypt para configurar nuestros certificados desde Servicios -> Let’s Encrypt.
1. Configuración
Antes de añadir nuestros certificados necesitaremos configurar Let’s Encrypt tal que así:

Obviamente podéis poner el Email y Certificate name que queráis.
2. Domains
En la pestaña Domains es dónde configuraremos nuestros certificados. Yo he creado uno para mi dominio y subdominios y lo he hecho con las siguientes opciones:

Si como yo habéis usado subdominios podéis crear un certificado para todos ellos. Si tenéis varios dominios distintos deberéis crear un certificado para cada uno de ellos.
Fijaos en que Web root coincide con lo que hemos puesto anteriormente en nuestros servidores location /.well-known
Por último sólo quedaría hacer clic en Certificate -> Generate para generar nuestro certificado. Una vez generado lo tendremos disponible en Sistema -> Certificados -> SSL
Previniendo ataques de fuerza bruta con Fail2Ban
Fail2ban es un software que analiza los ficheros log de nuestros servicios en busca de errores de autenticación y baneando las IPs que han intentado autenticarse erróneamente un número determinado de veces.
Fail2ban se basa en el concepto de Jails. Una Jail es un filtro el cual se aplica en un fichero log en busca de un patrón determinado para detectar intentos de acceso erróneos.
1. Configuración
La configuración no es demasiado complicada, debemos tener en cuenta lo siguiente:

- Ignorar IP: Aquí añadiremos nuestra IP local y nuestra VPN
- Num. Max. Reintentos: cuantos intentos erróneos se permiten antes del baneo
- Mail de destino: dónde recibiremos los avisos de baneo
Con esto configurado pasaremos a crear las Jails.
2. Jails
Como hemos dicho, una Jail es un filtro que se aplica a un archivo log para detectar intentos de acceso fallidos. Además de las jails que vienen preconfiguradas nosotros añadiremos unas personalizadas para Nginx.
Para hacerlo necesitamos acceso SSH al servidor puesto que necesitaremos crear un archivo para cada una de las Jails que vamos a crear.
Vamos a comenzar creando los filtros necesarios, para ello nos conectamos mediante SSH y creamos los siguientes archivos en el directorio /etc/fail2ban/filter.d/ con sudo nano nombre_archivo :
1 2 3 4 5 | [Definition] failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi) ignoreregex = |
1 2 3 4 5 | [Definition] failregex = ^ -.*GET .*/~.* ignoreregex = |
1 2 3 4 5 | [Definition] failregex = ^ -.*GET http.* ignoreregex = |
Lo siguiente sería crear las Jails en OpenMediaVault. Yo sólo voy a mostraros cómo crear una, el resto se crearían exactamente igual. Para ello, observad las siguientes imagenes:


Cómo vemos, las opciones se explican solas. Para los filtros NGinx tendremos en cuenta lo siguiente:
- Nombre: pondremos el que queramos. A mi me gusta poner el mismo nombre que el filtro
- Puerto: HTTP y HTTPS
- Número máximo de reintentos: Los que queramos, 3 está bien
- Tiempo de baneo: El que queramos, está en segundos. -1 significa infinito.
- Filtro: El nombre del filtro a usar sin el .conf
- Ruta del log: Archivo log en que se aplicará el filtro. Será access.log para todos los filtros Nginx excepto para nginx-http-auth que será error.log
Podéis crear tantos filtros como necesiteis y activarlos en OpenMediaVault cómo hemos visto. Una buena fuente para filtros es esta página, donde tenéis por ejemplo, un filtro para OpenVPN:
1 2 3 4 5 6 7 8 9 | [Definition] failregex = ^ TLS Error: incoming packet authentication failed from \[AF_INET\]<HOST>:\d+$ ^ <HOST>:\d+ Connection reset, restarting ^ <HOST>:\d+ TLS Auth Error ^ <HOST>:\d+ TLS Error: TLS handshake failed$ ^ <HOST>:\d+ VERIFY ERROR ignoreregex = |
Y ésto es todo por esta entrega. En la siguiente, que será la última, nos ocuparemos de copias de seguridad y os enseñaré el hardware que estoy usando para este proyecto.