<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>server &#8211; El Cornijal de Linux</title>
	<atom:link href="https://linuxete.duckdns.org/category/server/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxete.duckdns.org</link>
	<description>Un blog sobre Linux</description>
	<lastBuildDate>Sat, 30 Aug 2025 22:19:52 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Instalación y configuración ReadyMedia con systemd (Mejorado)</title>
		<link>https://linuxete.duckdns.org/instalacion-y-configuracion-readymedia-con-systemd-mejorado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalacion-y-configuracion-readymedia-con-systemd-mejorado</link>
					<comments>https://linuxete.duckdns.org/instalacion-y-configuracion-readymedia-con-systemd-mejorado/#comments</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sat, 04 Jan 2025 20:53:57 +0000</pubDate>
				<category><![CDATA[minidlna]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[dlna]]></category>
		<category><![CDATA[dlna disco externo]]></category>
		<category><![CDATA[dlna disco usb]]></category>
		<category><![CDATA[minidlna systemd]]></category>
		<category><![CDATA[ReadyMedia]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=2478</guid>

					<description><![CDATA[ReadyMedia, anteriormente conocido como MiniDLNA, es un servidor DLNA de código abierto muy ligero que nos va a permitir convertir cualquier ordenador con sistema operativo Linux en un centro multimedia a través del cual brindar todo tipo de contenido a otros dispositivos compatibles con el protocolo DLNA a través de nuestra red local. En este [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>ReadyMedia</strong>, anteriormente conocido como <a href="https://sourceforge.net/projects/minidlna/" target="_blank" rel="noreferrer noopener">MiniDLNA</a>, es un servidor DLNA de código abierto muy ligero que nos va a permitir convertir cualquier ordenador con sistema operativo Linux en un centro multimedia a través del cual brindar todo tipo de contenido a otros dispositivos compatibles con el protocolo DLNA a través de nuestra red local.</p>



<p>En este mismo blog hay una entrada en la que explico como <a href="https://linuxete.duckdns.org/instalar-servidor-dlna-en-debian-12/">configurar ReadyMedia</a>, Ahora te ensenaré a configurarlo de forma mas segura.</p>



<p>Este servidor es bastante simple de configurar, pero a veces las cosas sencillas se pueden complicar.</p>



<h3 class="wp-block-heading">El problema.</h3>



<p>El problema de ReadyMedia, es debido al permiso predeterminado del directorio de inicio <code><strong>/home</strong></code>.</p>



<p>Anteriormente, el permiso del directorio de inicio del usuario se establecía en 755, lo que permitía a otros usuarios ver el directorio, así como los archivos y subdirectorios que lo contenían. Para evitar este problema de seguridad, los desarrolladores establecieron el permiso para los directorios de inicio como 700, lo que significa que solo el propietario del directorio de inicio puede ver el contenido.</p>



<p>Si quieres compartir cualquier carpeta dentro de tu directorio <code><strong>/home</strong></code>, esto causa un gran problema con minidlna, ya que el propietario del directorio de inicio es el único que puede acceder o atravesar la carpeta ya sea localmente o a través de su LAN. Este cambio se realizó únicamente por razones de seguridad, y creo que fue el camino correcto, ya que no hay ninguna razón por la que otros usuarios puedan ver el contenido del directorio de inicio de los demás.</p>



<h1 class="wp-block-heading">1-. Instalación.</h1>



<p>Como sistema operativo voy a utilizar <strong>Debian 12</strong>, como servidor DLNA voy a utilizar <strong>ReadyMedia</strong> en su versión actual 1.3.0 y mi usuario será <strong>Pantuflo</strong>.</p>



<p>Para instalar el servidor DLNA ReadyMedia en Debian escribe lo siguiente en la terminal:</p>



<pre class="wp-block-code"><code>sudo apt install minidlna</code></pre>



<h2 class="wp-block-heading">2-. Crea los directorios</h2>



<p>Como dije antes, el directorio <code>/home</code> está protegido contra escritura, así que nosotros crearemos en la raiz, un directorio llamado <code>minidlna</code> al que haremos de nuestra propiedad.</p>



<p>Abre tu terminal para iniciar en tu <code>/home</code>, cambia al directorio raíz de la siguiente manera:</p>



<pre class="wp-block-code"><code>cd /</code></pre>



<p>Si haces un <code>ls</code> verás que estás en la raiz del sistema.</p>



<pre class="wp-block-code"><code>Pantuflo@computer:/$ <strong>ls</strong>
bin   etc         initrd.img.old  lost+found  opt   run   sys  var
boot  home        lib             media       proc  sbin  tmp  vmlinuz
dev   initrd.img  lib64           mnt         root  srv   usr  vmlinuz.old
</code></pre>



<p>Ahora crea la carpeta llamada <code>minidlna</code> y dentro de esta, un subdirectorio llamado<code> cache</code>.</p>



<pre class="wp-block-code"><code>sudo mkdir -p minidlna/cache</code></pre>



<p>Una vez creada la carpeta, esta pertenecerá a <strong>root</strong>, pero nosotros la haremos propiedad del usuario <strong>Pantuflo</strong></p>



<pre class="wp-block-code"><code>sudo chown -R Pantuflo:Pantuflo minidlna</code></pre>



<p>Con esto hemos cambiado la carpeta <strong>minidlna</strong> y el subdirectorio <strong>cache</strong> a nuestra propiedad.</p>



<h2 class="wp-block-heading">3-. Configuración de minidlna.</h2>



<p>La configuración de este servidor multimedia se encuentra almacenada dentro del fichero “<code>minidlna.conf</code>”</p>



<p>Accedemos a la configuración con el siguiente comando:</p>



<pre class="wp-block-code"><code>sudo nano /etc/minidlna.conf</code></pre>



<h4 class="wp-block-heading">Nombre de usuario.</h4>



<p>Comenzamos por la línea que dice <strong>#user=minidlna</strong>, sustituye por:</p>



<pre class="wp-block-code"><code>user=Pantuflo</code></pre>



<h3 class="wp-block-heading">Añade los directorios a compartir.</h3>



<p>Se pueden añadir directorios dentro de nuestro propio sistema, o bien desde fuera, como un disco usb. Si nuestros archivos están en otro disco, diferente del sistema operativo, tendrás que montarlos al inicio siguiendo esta guía <a href="https://linuxete.duckdns.org/montar-particiones-al-inicio-en-debian-12/">Montar particiones al inicio en Debian 12</a></p>



<p>Busca la siguientes lineas</p>



<pre class="wp-block-code"><code># set this to the directory you want scanned.
# * if you want multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to specific content types, you
#   can prepend the types, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#   + "PV" for pictures and video (eg. media_dir=PV,/home/jmaggard/digital_camera)

<strong>media_dir=AV,/home/Pantuflo/.aMule/Inconming
media_dir=APV,/mnt/Delos/
media_dir=APV,/mnt/Delfos/</strong></code></pre>



<p>Justamente debajo escribe las rutas a los archivos a compartir. En mi caso voy compartir los audios y vídeos de la carpeta <strong>Incoming</strong> y los Audios, Vídeos y Fotos de los discos llamados <strong>Delos</strong> y <strong>Delfos</strong>.</p>



<p>Según la letra que elijamos (A,V,P) podemos configurar rutas diferentes para:</p>



<pre class="wp-block-code"><code>A audios
V vídeos
P pictures o fotos</code></pre>



<p>Ejemplo de configuración de algunas carpetas.</p>



<pre class="wp-block-code"><code>#Compartir audios de la carpeta Musica
media_dir=A,/home/tu_usuario/Música

#Compartir los videos de la carpeta Videos
media_dir=V,/home/tu_usuario/Vídeos

#Compartir las imágenes de la carpeta imágenes
media_dir=P,/home/tu_usuario/Imágenes

#Compartir audio, video e imágenes de directorio
media_dir=AVP,/home/tu_usuario/directorio</code></pre>



<h4 class="wp-block-heading">Base de datos y caché de carátulas.</h4>



<p>Sigue buscando hasta llegar a <strong>#db_dir/=/var/cache/minidln</strong>a y modifica a lo siguiente:</p>



<pre class="wp-block-code"><code>db_dir=/minidlna/cache</code></pre>



<h4 class="wp-block-heading">Archivo de Registro: </h4>



<p>Hacemos lo mismo con el directorio de <code><strong>logs</strong></code> o registros, <strong>#log_dir=/var/log/minidlna</strong>, y modifica a lo siguente:</p>



<pre class="wp-block-code"><code>log_dir=/minidlna</code></pre>



<h4 class="wp-block-heading">Añade un nombre al servidor.</h4>



<p>Busca la línea <em><strong>friendly_name</strong></em> y elige el nombre de tu interés. Yo llamaré a mi servidor <em><strong><strong>ReadyMedia</strong></strong></em></p>



<pre class="wp-block-code"><code>friendly_name=ReadyMedia</code></pre>



<h4 class="wp-block-heading">Auto-actualizar el contenido.</h4>



<p>Si queremos que cada vez que hayamos añadido nuevo contenido a cualquiera de los directorios anteriormente indicados sea detectado por el servidor de forma automática, deberemos de agregar o descomentar la siguiente directiva:</p>



<pre class="wp-block-code"><code>inotify=yes</code></pre>



<h4 class="wp-block-heading">Tiempo de actualización.</h4>



<p>Configurar el intervalo de notificación SSDP, en segundos</p>



<pre class="wp-block-code"><code>notify_interval=60</code></pre>



<p>Una vez termines de cambiar todos estos parámetros guarda con <strong>Ctrl + o</strong> y sal con <strong>Ctrl + x</strong></p>



<h2 class="wp-block-heading">4-. Configuracion de systemd</h2>



<p>Una vez terminada la configuración reiniciamos el servidor con:</p>



<pre class="wp-block-code"><code>sudo systemctl restart minidlna.service</code></pre>



<p>Ahora comprueba el estado del servidor con:</p>



<pre class="wp-block-code"><code>  <strong>sudo systemctl status minidlna.service</strong>
● minidlna.service - MiniDLNA lightweight DLNA/UPnP-AV server
     Loaded: loaded (/lib/systemd/system/minidlna.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-01-02 23:13:35 CET; 22h ago
       Docs: man:minidlnad(1)
             man:minidlna.conf(5)
   Main PID: 2630 (minidlnad)
      Tasks: 2 (limit: 9573)
        CPU: 2.230s
     CGroup: /system.slice/minidlna.service
             └─2630 /usr/sbin/minidlnad -f /etc/minidlna.conf -P /run/minidlna/minidlna.pid -S -r
</code></pre>



<p>Fíjate en la línea que dice «Loaded» ahí está la ruta de configuración de nuestro servicio y es la que vamos a modificar.</p>



<p>Escribe en consola lo siguiente:</p>



<pre class="wp-block-code"><code>sudo nano /lib/systemd/system/minidlna.service</code></pre>



<p>Esto nos muestra el archivo de configuración, en el que solo vamos a añadir y cambiar un par de cosas de la sección de <strong>[Service]</strong>. </p>



<p>Añadimos la línea <strong>ProtectHome=read-only</strong> y cambiamos el usuario y el grupo por <strong>Pantuflo</strong></p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=MiniDLNA lightweight DLNA/UPnP-AV server
Documentation=man:minidlnad(1) man:minidlna.conf(5)
After=local-fs.target remote-fs.target autofs.service

&#91;Service]
<mark style="background-color:#f7ec08" class="has-inline-color">ProtectHome=read-only
User=Pantuflo
Group=Pantuflo</mark>

Environment=CONFIGFILE=/etc/minidlna.conf
Environment=DAEMON_OPTS=-r
EnvironmentFile=-/etc/default/minidlna

RuntimeDirectory=minidlna
LogsDirectory=minidlna
PIDFile=/run/minidlna/minidlna.pid
ExecStart=/usr/sbin/minidlnad -f $CONFIGFILE -P /run/minidlna/minidlna.pid -S $DAEMON_OPTS

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>Guarda con <strong>Ctrl + o </strong>y salimos con <strong>Ctrl + x</strong></p>



<p>Recargamos systemd con:</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload</code></pre>



<p>y reiniciamos el servicio minidlna</p>



<pre class="wp-block-code"><code>sudo systemctl restart minidlna.service</code></pre>



<p>Y con todo esto, debemos de tener todo terminado.</p>



<h2 class="wp-block-heading">5-. Funcionamiento.</h2>



<p>Para saber si nuestro servidor está funcionando bien, tecleamos en nuestro navegador lo siguiente:</p>



<p><strong><em><a href="http://localhost:8200/" target="_blank" rel="noreferrer noopener">http://localhost:8200/</a></em></strong></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69b69a0030be3&quot;}" data-wp-interactive="core/image" data-wp-key="69b69a0030be3" class="wp-block-image size-large wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1024" height="818" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxete.duckdns.org/wp-content/uploads/2025/01/Seleccion_006-1024x818.png" alt="" class="wp-image-2504" srcset="https://linuxete.duckdns.org/wp-content/uploads/2025/01/Seleccion_006-1024x818.png 1024w, https://linuxete.duckdns.org/wp-content/uploads/2025/01/Seleccion_006-300x240.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2025/01/Seleccion_006-768x613.png 768w, https://linuxete.duckdns.org/wp-content/uploads/2025/01/Seleccion_006.png 1137w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Agrandar"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Nos ofrece información sobre el número de audios, videos e imágenes compartidas, así como los dispositivos que hay conectados a nuestro servidor.</p>



<h2 class="wp-block-heading">Busca tus archivos.</h2>



<p>Ahora tan solo debes de ir a la aplicación de tu SmartTV, Smartphone o PC para encontrar el contenido multimedia de tu servidor.</p>



<p>Por ejemplo para encontrar los archivos multimedia de tu servidor con el reproductor VLC. </p>



<p>Abre tu reproductor VLC ve al menú <strong>Ver</strong>, <strong>Lista de Reproducción</strong> y el menú de la izquierda busca <strong>Plug&#8217;n Play Universal</strong> y haz click. Sobre el lado derecho aparecerán los servidores Ready Media que tengas configurados.</p>



<p></p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="885" height="685" src="https://linuxete.duckdns.org/wp-content/uploads/2025/01/Reproductor-multimedia-VLC_001.png" alt="" class="wp-image-2534" srcset="https://linuxete.duckdns.org/wp-content/uploads/2025/01/Reproductor-multimedia-VLC_001.png 885w, https://linuxete.duckdns.org/wp-content/uploads/2025/01/Reproductor-multimedia-VLC_001-300x232.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2025/01/Reproductor-multimedia-VLC_001-768x594.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></figure>



<p>Ahora entra en el que te aparece a ti, y busca las carpetas con el contenido multimedia.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/instalacion-y-configuracion-readymedia-con-systemd-mejorado/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Conexiones seguras con SSH</title>
		<link>https://linuxete.duckdns.org/conexiones-seguras-con-ssh/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conexiones-seguras-con-ssh</link>
					<comments>https://linuxete.duckdns.org/conexiones-seguras-con-ssh/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sat, 30 Nov 2024 21:18:35 +0000</pubDate>
				<category><![CDATA[server]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[openssh-client]]></category>
		<category><![CDATA[openssh-server]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ssh Debian 12]]></category>
		<category><![CDATA[ssh linux]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=2096</guid>

					<description><![CDATA[SSH, (Secure Shell), es un protocolo de administración remota por el cual los usuarios pueden controlar sus equipos a través de Internet. Se creó para sustituir a Telnet, un protocolo no cifrado que no ofrecía ningún tipo de seguridad a los usuarios. En cambio, SSH hace uso de las técnicas de criptografía más innovadoras con [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="728" height="250" src="https://linuxete.duckdns.org/wp-content/uploads/2024/11/ssh.jpg" alt="" class="wp-image-2119" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/11/ssh.jpg 728w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/ssh-300x103.jpg 300w" sizes="(max-width: 728px) 100vw, 728px" /></figure>



<p>SSH, (Secure Shell), es un protocolo de administración remota por el cual los usuarios pueden controlar sus equipos a través de Internet.</p>



<p>Se creó para sustituir a Telnet, un protocolo no cifrado que no ofrecía ningún tipo de seguridad a los usuarios. En cambio, SSH hace uso de las técnicas de criptografía más innovadoras con el claro objetivo de que todas las comunicaciones realizadas entre los usuarios y los servidores remotos sean seguras. Dispone de una herramienta que permite autenticar al usuario remoto para posteriormente transferir las entradas desde el cliente al host y, finalmente, realizar la salida de vuelta a los usuarios.</p>



<h3 class="wp-block-heading">Instalación del servidor y del cliente</h3>



<p>Generalmente <strong>SSH</strong> suele venir preinstalado en tu distribución Linux, pero si no es así, procede a la instalación de los paquetes correspondientes, que son el servidor (openssh-server) y el cliente (openssh-client).</p>



<pre class="wp-block-code"><code><strong>sudo apt-get install openssh-server openssh-client</strong> <strong>-y</strong></code></pre>



<p>El paquete <strong>openssh-server</strong> proporciona el demonio <strong>sshd</strong> y <strong>sftp-server</strong> que permite a los clientes <strong>ssh</strong> y <strong>scp</strong> establecer conexiones seguras, y a los clientes <strong>sftp</strong> transferir archivos, también de forma segura.</p>



<p>El paquete <strong>openssh-client</strong> proporciona los clientes de <strong>ssh</strong>, <strong>scp</strong> y <strong>sftp</strong>, los programas <strong>ssh-agent</strong> y <strong>ssh-add</strong> para hacer más cómoda la identificación de clave pública, y las utilidades <strong>ssh-keygen</strong>, <strong>ssh-keyscan</strong>, <strong>ssh-copy-id</strong> y <strong>ssh-argv0</strong>.</p>



<h3 class="wp-block-heading">Test SSH</h3>



<p>Comprueba que el servidor SSH está habilitado y activo con la siguiente orden:</p>



<pre class="wp-block-code"><code><strong>sudo systemctl status sshd</strong></code></pre>



<p>En la siguiente imagen, resaltado en color verde vemos que es así.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1022" height="495" src="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-18-50-48.png" alt="" class="wp-image-2097" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-18-50-48.png 1022w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-18-50-48-300x145.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-18-50-48-768x372.png 768w" sizes="auto, (max-width: 1022px) 100vw, 1022px" /></figure>



<p>Hay otros comandos como son:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<pre class="wp-block-code"><code><strong>sudo systemctl enable sshd</strong> = Habilita el servicio</code></pre>



<pre class="wp-block-code"><code><strong>sudo systemctl disable sshd</strong> = Deshabilita el servicio</code></pre>



<pre class="wp-block-code"><code><strong>sudo systemctl start sshd</strong> = Inicia el servicio</code></pre>



<pre class="wp-block-code"><code><strong>sudo systemctl stop sshd</strong> = Para el servicio</code></pre>



<pre class="wp-block-code"><code><strong>sudo systemctl restart</strong> <strong>sshd</strong> = reinicia el servicio</code></pre>



<pre class="wp-block-code"><code><strong>sudo systemctl reload</strong> <strong>sshd</strong> = recarga el servicio</code></pre>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nota: La diferencia entre <strong>restart</strong> y <strong>reload</strong> es que, en el primer caso, el servicio se detiene y se vuelve a iniciar y en el segundo caso, sigue ejecutándose y vuelve a leer los archivos de configuración.</p>
</blockquote>



<h3 class="wp-block-heading">Archivos de configuración:</h3>



<p>SSH dispone de varios archivos de configuración, que son los siguientes:</p>



<p><strong>/etc/ssh/sshd_config</strong>: Archivo principal de configuración del servidor SSH.<br><br><strong>/etc/ssh/ssh_config</strong>: Archivo principal de configuración de los clientes SSH.<br><br><strong>~/.ssh/config</strong>: Archivo personal de cada usuario. Contiene la configuración utilizada por los clientes SSH. Permite al usuario local utilizar una configuración distinta a la definida en el archivo /etc/ssh/ssh_config.<br><br><strong>~/.ssh/known_hosts</strong>: Archivo personal de cada usuario. Contiene las firmas digitales de los servidores SSH a los que se conectan los clientes. Cuando éstas firmas cambian, se pueden actualizar ejecutando el comando ssh-keygen -R, pasando el nombre del anfitrión o la IP del anfitrión como argumento. Este comando elimina la entrada correspondiente en el archivo ~/.ssh/known_hosts y, permite añadir de nuevo al anfitrión con una nueva firma digital. La sintaxis genérica sería:</p>



<pre class="wp-block-code"><code><strong>ssh-keygen -R nombre_o_ip_del_servidor_SSH</strong></code></pre>



<p><strong>~/.ssh/authorized_keys</strong>: Archivo personal para cada usuario. Contiene los certificados de los clientes SSH, para permitir autenticación hacia servidores SSH sin requerir contraseña.</p>



<h3 class="wp-block-heading">Configurar SSH</h3>



<p>Tras la instalación procederemos a la configuración del servidor, para ello, editaremos el fichero de configuración /etc/ssh/sshd_config.</p>



<p>NOTA: es importante hacer copia de seguridad del archivo /etc/ssh/sshd_config antes de realizar cualquier cambio.</p>



<pre class="wp-block-code"><code>sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak</code></pre>



<p>Abrimos el archivo de confirmación con nano</p>



<pre class="wp-block-code"><code>sudo nano /etc/ssh/sshd_config</code></pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="786" height="605" src="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-21-12-17.png" alt="" class="wp-image-2102" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-21-12-17.png 786w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-21-12-17-300x231.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-29-21-12-17-768x591.png 768w" sizes="auto, (max-width: 786px) 100vw, 786px" /></figure>



<p>Una forma de elevar la seguridad del servidor SSH, consiste en cambiar el número de puerto predeterminado por otro que sólo el administrador del sistema conozca. Aunque cambiar de puerto disminuye considerablemente la posibilidad de una intrusión, en internet hay cientos de robots escaneando IPs y sus respectivos puertos abiertos, con lo que al final acabas siendo encontrado.</p>



<p><strong>Port</strong> &#8211; De forma predeterminada, el servicio SSH escucha por el puerto 22. Los atacantes buscarán servidores que estén escuchando dicho puerto.Sustituye el 22 a otro puerto, preferiblemente entre el 1024 y 65535.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="786" height="605" src="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-30-19-13-31.png" alt="" class="wp-image-2113" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-30-19-13-31.png 786w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-30-19-13-31-300x231.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/11/Captura-desde-2024-11-30-19-13-31-768x591.png 768w" sizes="auto, (max-width: 786px) 100vw, 786px" /></figure>



<p>Veamos algunas otras opciones interesantes a tener en cuenta a la hora de configurar el servidor:</p>



<p><strong>AddressFamily</strong> -Especifica qué familia de direcciones debe utilizar sshd. Los argumentos válidos son any (por defecto), inet (sólo IPv4), o inet6 (sólo IPv6).</p>



<p><strong>ListenAddress</strong> &#8211; De forma predeterminada, el servicio SSH escuchará peticiones a través de todas las direcciones IP correspondientes a todas las interfaces de red del sistema. La directriz por defecto sería: ListenAddress 0.0.0.0. Si queremos que el servidor solo escuche por la interfaz de red con IP 192.168.1.30, a la cual sólo se puede acceder desde la red local:</p>



<pre class="wp-block-code"><code>ListenAddress 192.168.1.30</code></pre>



<p><strong>LoginGraceTime</strong> &#8211; Establece el tiempo, en segundos, durante el cual la pantalla de login estará disponible para que el usuario introduzca su nombre de usuario y contraseña, si no lo hace durante ese período de tiempo el login se cerrará, evitando así dejar por tiempo indeterminado pantallas de login sin que nadie las use, o que alguien este intentando mediante un&nbsp;<strong>script</strong>&nbsp;adivinar un usuario y su contraseña. Si el valor es&nbsp;<strong>0</strong>, no hay límite de tiempo para que un usuario se autentique, lo cual no es recomendable ya que de esta forma un atacante podría utilizar ataques de fuerza bruta o usando métodos de diccionario para adivinar la contraseña, por lo tanto no es recomendable dejar esta directriz a&nbsp;<strong>0</strong>. Lo podemos dejar en&nbsp;<strong>10 segundos</strong>.</p>



<pre class="wp-block-code"><code>LoginGraceTime 10</code></pre>



<p><strong>PermitRootLogin</strong> &#8211; Probablemente sea la directriz de seguridad más importante que podemos establecer para asegurar nuestro servidor SSH. En los sistemas Unix y Linux se crea por defecto al usuario root, lo que implica que ya conocemos la existencia de al menos un usuario, ¡y que usuario!, con privilegios de adnimistrador. Muchos ataques de fuerza bruta se concentran en atacar al usuario root con la esperanza de que tenga una contraseña débil.<br>Sabiendo una parte de la ecuación (root) solo será cuestión de tiempo para que alguien con paciencia y suerte vulnere el sistema. En esta directriz denegamos el acceso al usuario root y por lo tanto, cualquier intento de ataque directo al usuario root será inútil.<br>Al denegar el acceso al usuario root, cada vez que necesitemos realizar tareas administrativas, accederemos como un usuario normal y una vez dentro, utilizando alguno de los comandos su o sudo podremos realizar dichas tareas administrativas. Por lo tanto, denegando el acceso al usuario root, el atacante tendrá que acertar tanto el nombre de un usuario del sistema como su contraseña, algo que disminuye notablemente la probabilidad de una intrusión.</p>



<p><strong>StrictModes</strong> &#8211; En esta directriz se establece que sshd revisara los modos y permisos de los archivos de los usuarios y el directorio $HOME de el usuario antes de aceptar la sesión. Esto es normalmente deseable porque a veces algunos usuarios dejan sus directorios, accidentalmente, con permiso de escritura para cualquiera. El valor predeterminado es yes, por lo tanto, lo dejaremos con su valor predeterminado.</p>



<pre class="wp-block-code"><code>StrictModes yes</code></pre>



<p><strong>MaxAuthTries</strong> &#8211; El valor de esta directriz establece el máximo número de intentos de autenticación permitidos por conexión, es decir, la cantidad de veces que podemos equivocarnos al ingresar el usuario y/o contraseña. Una vez que los intentos alcanzan la mitad de este valor, las conexiones fallidas siguientes serán registradas. Después del máximo número de intentos se cerrará la conexión. Es posible volver a intentarlo, pero el límite de intentos por vez evita ataques basados en la persistencia de la conexión.</p>



<pre class="wp-block-code"><code>MaxAuthTries 5</code></pre>



<p><strong>MaxSessions</strong> &#8211; Especifica el número máximo de sesiones abiertas de shell, inicio de sesión o subsistema (por ejemplo, sftp) permitidas por conexión de red. Los clientes que soportan la multiplexación de conexiones pueden establecer múltiples sesiones. Si se establece MaxSessions a 1, se desactivará la multiplexación de sesiones, mientras que si se establece a 0, se evitarán todas las sesiones de shell, login y subsistema, a la vez que se permite el for- warding. El valor predeterminado es 10.</p>



<pre class="wp-block-code"><code>MaxSessions 10</code></pre>



<p>Con todo esto que hemos aprendido  ya puedes entrar a tu sistema remoto de la siguiente forma:</p>



<pre class="wp-block-verse">ssh -p 22343 tu_usuario@host_o_IP</pre>



<p>Si te interesa saber mas de como proteger tu servidor, puedes ver «<a href="https://linuxete.duckdns.org/instalar-fail2ban-en-debian-12-y-que-funcione/">Instalar Fail2ban en Debian 12 y que funcione</a>«</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/conexiones-seguras-con-ssh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Instalar Fail2ban en Debian 12 y que funcione.</title>
		<link>https://linuxete.duckdns.org/instalar-fail2ban-en-debian-12-y-que-funcione/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalar-fail2ban-en-debian-12-y-que-funcione</link>
					<comments>https://linuxete.duckdns.org/instalar-fail2ban-en-debian-12-y-que-funcione/#comments</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 16:11:53 +0000</pubDate>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[fail2ban Debian 12]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=1607</guid>

					<description><![CDATA[Internet está lleno de gente con menos vergüenza que un gato en una matanza, así que imagino que mi Raspberry Pi, al estar las 24 horas conectada a Internet, estará siendo atacada regularmente. Por este motivo, he decidido instalar Fail2ban. Si logras poner este tutorial en marcha, descubrirás que no estoy exagerando. ¿Qué es Fail2ban? [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="509" height="203" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/instalar-y-configurar-fail2ban.png" alt="" class="wp-image-1639" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/instalar-y-configurar-fail2ban.png 509w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/instalar-y-configurar-fail2ban-300x120.png 300w" sizes="auto, (max-width: 509px) 100vw, 509px" /></figure>



<p>Internet está lleno de gente con menos vergüenza que un gato en una matanza, así que imagino que mi Raspberry Pi, al estar las 24 horas conectada a Internet, estará siendo atacada regularmente. Por este motivo, he decidido instalar Fail2ban.</p>



<p>Si logras poner este tutorial en marcha, descubrirás que no estoy exagerando.</p>



<h2 class="wp-block-heading">¿Qué es Fail2ban?</h2>



<p>Fail2ban es una aplicación que te ayudará a proteger tu servidor contra ataques maliciosos y con la que podrás mantener tus datos seguros.</p>



<p>Fail2ban evitará los accesos de bots, es decir, de máquinas automatizadas que realizan intentos de acceso indiscriminados a los servidores. Este tipo de bots son muy comunes en Internet y simplemente se dedican a intentar loguearse en los servidores, probando diferentes usuarios y claves de acceso, para autorizarse correctamente y tomar el control de la máquina.</p>



<p>Fail2ban se encarga de monitorizar los registros de acceso al servidor en busca de fallos de acceso e impidiendo nuevos intentos de login desde las direcciones IP involucradas, por un tiempo determinado.</p>



<h2 class="wp-block-heading">Como instalar Fail2ban</h2>



<p>Para instalar fail2ban deberemos abrir una terminal y escribir lo siguiente:</p>



<pre class="wp-block-code"><code>sudo apt install fail2ban python3-systemd</code></pre>



<h2 class="wp-block-heading">Configuración</h2>



<p>La configuración de Fail2ban se encuentra en la carpeta «/etc/fail2ban/«. Allí encontraremos un archivo llamado «jail.conf» con las configuraciones del sistema. </p>



<p>Pero nosotros trabajaremos con una copia del archivo <strong>jail.conf</strong> a la que llamaremos <strong>jail.local</strong>, ya que así evitaremos que tras una actualización este pueda ser sustituido por la versión por defecto, cambiando así toda nuestra configuración.</p>



<p>El archivo <strong>jail.local</strong> se carga después de <strong>jail.conf</strong> y en él realizaremos nuestra configuración, por lo que todo lo que se escriba en <strong>jail.local</strong> es lo que se va a tener en cuenta definitivamente.</p>



<p>La copia del archivo jail.conf, la haremos desde la terminal con el comando cp (copy)</p>



<pre class="wp-block-code"><code>sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</code></pre>



<p>Ahora abre el archivo en cuestión</p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/jail.local</code></pre>



<h3 class="wp-block-heading">Configuración Default (por defecto)</h3>



<p>En la sección [DEFAULT] encontramos las configuraciones predeterminadas que afectarán a todos los jail. Todas las configuraciones que pongas en [DEFAULT] son heredadas por los jail</p>



<p>En la sección «[DEFAULT]» encontramos la configuración global de las opciones. Allí veremos diversas variables a definir como las siguientes:</p>



<ul class="wp-block-list">
<li><strong>ignoreip:</strong> Aquí puedes añadir direcciones IP que&nbsp;<strong>nunca</strong>&nbsp;serán baneadas por Fail2ban. Por ejemplo, nuestra propia dirección IP.</li>



<li><strong>bantime:</strong> es el tiempo que una IP será baneada, expresado en segundos, minutos, horas, días &#8230;. (por defecto en 10 minutos)</li>



<li><strong>findtime:</strong> es el tiempo que transcurre entre intentos de conexión antes de ser baneado. (por defecto en 10 minutos)</li>



<li><strong>maxretry</strong>: es el número máximo de intentos de login que podrán realizarse antes de que la IP sea baneada. (por defecto en 5 intentos)</li>
</ul>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="725" height="512" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_148.png" alt="" class="wp-image-1669" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_148.png 725w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_148-300x212.png 300w" sizes="auto, (max-width: 725px) 100vw, 725px" /></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nota si quieres que se ignoren todas las ips procedentes de tu red local, escribe la primera dirección IP (que suele ser la del router) seguido de un /24, esto hará que no se tengan en cuenta las direcciones de la 1 a la 254.</p>
</blockquote>



<p>Seguimos cambiando otras cosas de la sección <strong>Default</strong>.</p>



<p>Como yo no uso iptables, ya que el firewall lo tengo activo a nivel de router, haremos algunos cambios.</p>



<p>Busca las siguientes líneas y comenta con el signo #</p>



<pre class="wp-block-code"><code>&#91;Default]

banaction = iptables-multiport
banaction_allports = iptables-allports
</code></pre>



<p>Pega debajo las siguientes líneas.</p>



<pre class="wp-block-code"><code>banaction = nftables
banaction_allports = nftables&#91;type=allports]
</code></pre>



<p>Quedando como en la siguiente imagen.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="541" height="150" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/fail2ban.png" alt="" class="wp-image-1612" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/fail2ban.png 541w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/fail2ban-300x83.png 300w" sizes="auto, (max-width: 541px) 100vw, 541px" /></figure>



<p>Guarda con<code> Ctrl + o</code></p>



<h2 class="wp-block-heading">Configuración de Jail</h2>



<p>Baja hasta la sección <code>JAILS</code>, <code>SSH servers</code>, <code>[sshd]</code>.</p>



<pre class="wp-block-code"><code>#
# JAILS
#

#
# SSH servers
#

&#91;sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and det&gt;
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
</code></pre>



<p>Justo debajo de #mode = normal, añade lo siguiente:</p>



<pre class="wp-block-code"><code>enabled = true</code></pre>



<p>Esto habilitada el jail&nbsp;<strong>sshd</strong>.</p>



<p>Debajo, moddifica  las líneas en negrita, que son, el puerto de conexión, la ruta de log de eventos y el backend</p>



<pre class="wp-block-code"><code>&#91;sshd]
enabled = true
<strong>port    = 2353
logpath = %(sshd_log)s
backend = systemd</strong></code></pre>



<p>Quedando todo así:</p>



<pre class="wp-block-code"><code>#
# JAILS
#

#
# SSH servers
#

&#91;sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and det&gt;
#mode   = normal
<strong>enabled = true
port    = 2353
logpath = %(sshd_log)s
backend = systemd</strong></code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size"><em><strong>Nota: </strong>Cambia port por el puerto que usas en tu servidor ssh</em></p>
</blockquote>



<p>Reinicia el el servicio fail2ban así:</p>



<pre class="wp-block-code"><code>sudo systemctl restart fail2ban</code></pre>



<p>Hasta aquí todo listo, ya solo queda comprobar que todo va bien.</p>



<h3 class="wp-block-heading">Comprobaciones.</h3>



<p>Vamos a realizar una serie comprobaciones para ver si se están ejecutando correctamente los servicios, estados y  advertencias.</p>



<h3 class="wp-block-heading">Test estado del servicio</h3>



<p>Comprobamos el estado del servicio con:</p>



<pre class="wp-block-code"><code>sudo systemctl status fail2ban</code></pre>



<p>Es posible que después de hacer una status, el servicio aparezca inactivo, como se muestra en la siguiente imagen.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="963" height="475" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Captura-desde-2024-11-28-00-00-00.png" alt="" class="wp-image-2094" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Captura-desde-2024-11-28-00-00-00.png 963w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Captura-desde-2024-11-28-00-00-00-300x148.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Captura-desde-2024-11-28-00-00-00-768x379.png 768w" sizes="auto, (max-width: 963px) 100vw, 963px" /></figure>



<p>Para arreglar esto, haz lo siguiente. En una terminal, escribe:</p>



<pre class="wp-block-code"><code>sudo echo "sshd_backend = systemd" &gt;&gt; /etc/fail2ban/paths-debian.conf</code></pre>



<p>Reinicia el servicio con:</p>



<pre class="wp-block-code"><code>sudo systemctl restart fail2ban</code></pre>



<p>Y volvemos a ver el estado de como está el servicio:</p>



<pre class="wp-block-code"><code>sudo systemctl status fail2ban</code></pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="844" height="490" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_001.png" alt="" class="wp-image-1627" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_001.png 844w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_001-300x174.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_001-768x446.png 768w" sizes="auto, (max-width: 844px) 100vw, 844px" /></figure>



<p>Ahora está todo correcto, el servicio aparece activo y corriendo.</p>



<h3 class="wp-block-heading">Test estado general de fail2ban</h3>



<p>Comprobamos el estado y la cantidad de jails en funcionamiento.</p>



<pre class="wp-block-code"><code>sudo fail2ban-client status</code></pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="682" height="553" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_005.png" alt="" class="wp-image-1672" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_005.png 682w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_005-300x243.png 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>



<h3 class="wp-block-heading">Test estado de Jails específicos</h3>



<p>Para comprobar si una jail específica funciona, en mi caso, <strong>ssh</strong>, ejecuta el siguiente comando:</p>



<pre class="wp-block-code"><code>sudo fail2ban-client status sshd</code></pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="682" height="553" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_006.png" alt="" class="wp-image-1673" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_006.png 682w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_006-300x243.png 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>



<p>La salida nos muestra bastante información sobre las IPs baneadas, el número de intentos de conexión, el número de baneos etc etc</p>



<h3 class="wp-block-heading">Visualizar el log de eventos</h3>



<p>Veamos si el archivo log de fail2ban contiene algún error. Visualiza el archivo log en tiempo real para ver los cambios que se van produciendo instantáneamente.</p>



<p>Copia y pega el siguiente comando:</p>



<pre class="wp-block-code"><code>sudo tail -f /var/log/fail2ban.log</code></pre>



<p>En la siguiente imagen verás que no aparece ningún error y se carga nuestro jail  <strong>sshd</strong></p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="296" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_002-1024x296.png" alt="" class="wp-image-1628" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_002-1024x296.png 1024w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_002-300x87.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_002-768x222.png 768w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_002.png 1258w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Test de Fail2ban</h3>



<p>Fail2ban tiene un comando testar la configuración. Para esta comprobación tienes que usar este comando:</p>



<pre class="wp-block-code"><code>sudo fail2ban-client --test</code></pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="844" height="280" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_007.png" alt="" class="wp-image-1676" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_007.png 844w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_007-300x100.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_007-768x255.png 768w" sizes="auto, (max-width: 844px) 100vw, 844px" /><figcaption class="wp-element-caption">Test de la configuración de fail2ban</figcaption></figure>



<p>Vaya! tenemos un mensaje de advertencia. No es un error, tampoco afectará al funcionamiento de fail2ban, pero se puede arreglar.</p>



<h3 class="wp-block-heading">Corregir advertencia Warning IPV6</h3>



<p>Para arreglar esto tendremos que abrir el archivo de configuración que se encuentra en <strong>/etc/fail2ban/fail2ban.conf</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/fail2ban.conf</code></pre>



<p>Ve al apartado <strong>[Definition]</strong>, verás que está vacío y escribe debajo lo siguiente:</p>



<pre class="wp-block-code"><code> <strong>allowipv6 = auto</strong></code></pre>



<p>Quedando de la siguiente manera:</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="844" height="427" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_008.png" alt="" class="wp-image-1678" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_008.png 844w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_008-300x152.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_008-768x389.png 768w" sizes="auto, (max-width: 844px) 100vw, 844px" /></figure>



<p>Volvemos a repetir el test y ahora se habrá quitado el mensaje de advertencia.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="844" height="427" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_009.png" alt="" class="wp-image-1680" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_009.png 844w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_009-300x152.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-_009-768x389.png 768w" sizes="auto, (max-width: 844px) 100vw, 844px" /></figure>



<h2 class="wp-block-heading">Test de Baneo</h2>



<p>Provocamos un ban sobre nosotros para ver si la configuración es correcta.</p>



<p>Intento entrar por ssh desde mi teléfono móvil con una contraseña errónea. Debe de haber 5 intentos de conexión y un baneo de 10 minutos.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="433" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_003-1-1024x433.png" alt="" class="wp-image-1635" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_003-1-1024x433.png 1024w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_003-1-300x127.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_003-1-768x325.png 768w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_003-1.png 1258w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Conexión baneada por excesos de inicio de sesión fallidos. </figcaption></figure>



<p>Al quinto intento nos banea y como vimos antes, hasta transcurridos 10 minutos no dejará que volvamos a probar.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="461" height="1024" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-29-461x1024.jpg" alt="" class="wp-image-1630" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-29-461x1024.jpg 461w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-29-135x300.jpg 135w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-29.jpg 576w" sizes="auto, (max-width: 461px) 100vw, 461px" /><figcaption class="wp-element-caption">Conexión baneada por excesos de inicio de sesión fallidos. </figcaption></figure>



<p>Pasados 10 minutos, tal como está configurado en [Default] se levanta el baneo y dará permiso para volver a dejarnos entrar.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="433" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_004-1-1024x433.png" alt="" class="wp-image-1634" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_004-1-1024x433.png 1024w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_004-1-300x127.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_004-1-768x325.png 768w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/chapuboot@debian-etc-fail2ban_004-1.png 1258w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Desbaneo de una IP a los 10 minutos.</figcaption></figure>



<p>Mi teléfono vuelve a dejarnos escribir la contraseña. </p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="461" height="1024" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-35-461x1024.jpg" alt="" class="wp-image-1631" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-35-461x1024.jpg 461w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-35-135x300.jpg 135w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/photo_2024-08-28_17-27-35.jpg 576w" sizes="auto, (max-width: 461px) 100vw, 461px" /></figure>



<h2 class="wp-block-heading">Desbanear una IP</h2>



<p>Las IP baneadas pueden ser sacadas de la lista de ban sin tener que esperar al tiempo de ban por defecto. Para ello usa unban y la ip a desbanear.</p>



<pre class="wp-block-code"><code>sudo fail2ban-client unban 192.168.1.1</code></pre>



<h2 class="wp-block-heading">Envío de alertas por email.</h2>



<p>Para que <strong>fail2ban</strong> envíe alertas por email, debes de tener instalado y configurado algún programa que envíe correos electrónicos. En mi caso uso <strong>sSMTP</strong> y la configuración que usaré en fail2ban, será con este programa.</p>



<p><strong>sSMTP</strong> es un programa que envía correo electrónico desde un equipo a un servidor de correo configurado. Es decir que este no es un servidor de correo como si lo es sendmail o postfix sino que solo se encarga del envío de correos.</p>



<p>Fail2ban te avisará cuando una IP sea baneada, aportando una valiosa información acerca de su procedencia, proveedor etc etc</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><mark style="background-color:rgba(0, 0, 0, 0);color:#cf2e2e" class="has-inline-color">Importante, es indispensable instalar y configurar sSMTP</mark></p>
</blockquote>



<p>Si no tienes instalado y configurado sSMTP entra aquí <strong>«<a href="https://linuxete.duckdns.org/como-enviar-emails-con-ssmtp/">Como enviar emails con sSMTP</a>»  </strong>y seguir los pasos que allí te indico.</p>



<p>Si ya tienes configurado sSMTP, puedes seguir con la configuración <strong>jail.local</strong> &#8230;.</p>



<p>En una terminal homologada, escribe el siguiente comando:</p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/jail.local</code></pre>



<p>Ve al apartado <strong>Actions</strong></p>



<p>Busca la líneas que dicen, destemail y mta</p>



<pre class="wp-block-code"><code># Some options used for actions

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
<strong>destemail = root@localhost</strong>

# Sender email address used solely for some actions
sender = root@&lt;fq-hostname&gt;

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
<strong>mta = sendmail</strong></code></pre>



<p>En <strong>destemail</strong> escribe la dirección de correo a la que llegarán las alertas, por ejemplo mi_email@gmail.com<br>En <strong>mta</strong> aquí usa el modo en que tu programa envía mails, en el caso de sSMTP pondré sendmail</p>



<pre class="wp-block-code"><code># Some options used for actions

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
<strong>destemail = mi_email@gmail.com</strong>

# Sender email address used solely for some actions
sender = root@&lt;fq-hostname&gt;

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
<strong>mta = sendmail</strong></code></pre>



<p>Ve al Jail <strong>[sshd ]</strong> de la ruta <code>/etc/fail2ban/jail.local</code></p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/jail.local</code></pre>



<p>Añade al fina la siguiente línea</p>



<pre class="wp-block-code"><code>action = %(action_mwl)s</code></pre>



<p>action = “mw” después de “action_” le dice a Fail2ban que le envíe correos electrónicos. “mwl” además adjunta los registros.</p>



<p>Ahora nuestra <strong>Jail sshd</strong> queda de la siguiente manera:</p>



<pre class="wp-block-code"><code>&#91;sshd]
enabled = true
port    = 2353
logpath = %(sshd_log)s
backend = systemd
<strong>action = %(action_mwl)s</strong></code></pre>



<p>Reinicia el servicio fail2ban</p>



<pre class="wp-block-code"><code>sudo systemctl restart fail2ban</code></pre>



<p>Vuelve a visualizar el log de eventos a ver si todo está correcto</p>



<pre class="wp-block-code"><code>sudo tail -f /var/log/fail2ban.log</code></pre>



<p>Si todo anda bien y no recibes errores, puedes intentar loguearte por ssh de forma errónea por 5 veces consecutivas y recibirás un bonito mail de baneo.</p>



<h3 class="wp-block-heading">Fallo de email al inicio (corrección)</h3>



<p>Aunque todo marcha bien, es muy probable que al arrancar el sistema, no lleguen los emails de inicio del servicio.</p>



<p>Esto se debe a que Fail2ban inicia su servicio de envío de correo antes de que el servicio de red esté completamente disponible. Como resultado, no puede alcanzar el servidor SMTP y el proceso falla. Cuando reinicias el servicio manualmente, la red ya está en pleno funcionamiento y la conexión se realiza sin problemas.</p>



<h4 class="wp-block-heading">Visualiza en busca de errores</h4>



<p>Una vez iniciado el sistema, haz un tail al registro de fail2ban para ver si tienes algún error</p>



<pre class="wp-block-code"><code>raspberry@pi5:~
<strong>sudo tail -f /var/log/fail2ban.log</strong>
To: mi_email@gmail.com\n
Hi,\n
The jail sshd has been started successfully.\n
Regards,\n
Fail2Ban" | /usr/sbin/sendmail -f "email@gmail.com" "mi_email@gmail.com"
2025-08-30 06:30:04,525 fail2ban.utils          &#91;932]: <mark style="background-color:#fcb900" class="has-inline-color">ERROR   7fff679379b0 -- stderr: 'sendmail: Cannot open smtp.gmail.com:587'</mark>
2025-08-30 06:30:04,525 fail2ban.utils          &#91;932]: ERROR   7fff679379b0 -- returned 1
2025-08-30 06:30:04,526 fail2ban.actions        &#91;932]: <mark style="background-color:#fcb900" class="has-inline-color">ERROR   Failed to start jail 'sshd' action 'sendmail-whois-lines': Error starting action Jail('sshd')/sendmail-whois-lines: 'Script error'</mark>
2025-08-30 06:30:05,506 fail2ban.filtersystemd  &#91;932]: INFO    &#91;sshd] Jail is in operation now (process new journal entries)
2025-08-30 06:38:04,525 fail2ban.filter         &#91;932]: INFO    &#91;sshd] Ignore 192.168.1.50 by ip
</code></pre>



<p>El primer error <strong><code>sendmail: Cannot open smtp.gmail.com:587</code></strong>, nos indica que fail2ban no pudo establecer una conexión con el servidor de correo de Gmail </p>



<p>Como resultado del fallo anterior <strong><code>Failed to start jail 'sshd' action 'sendmail-whois-lines': Error starting action Jail('sshd')/sendmail-whois-lines: 'Script error'</code></strong>nos dice que Fail2ban intentó ejecutar una acción (<code>sendmail-whois-lines</code>) para notificar que la <em>jail</em> de <code>sshd</code> se había iniciado, pero debido a que el envío de correo falló, la acción completa no pudo completarse.</p>



<h4 class="wp-block-heading">Solución al problema.</h4>



<p>Dentro de la ruta <code>etc/systemd/system/</code> crearemos un directorio con el nombre <code>fail2ban.service.d</code> y a su vez dentro de este crearemos un archivo con el nombre <code>override.conf</code>. Systemd lo detectará y le dará prioridad sobre la configuación original del servicio.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nota, nunca edites los archivos originales de la ruta <code>/lib/systemd/system/</code> ya que pueden ser modificados tras un actualización del sistema.</p>
</blockquote>



<p>Usa el comando <code>mkdir -p</code> para crear el directorio.</p>



<pre class="wp-block-code"><code>sudo mkdir -p /etc/systemd/system/fail2ban.service.d/</code></pre>



<p>Utiliza el comando <code>sudo nano</code> para crear el archivo.</p>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/fail2ban.service.d/override.conf</code></pre>



<p>Dentro del archivo pega las siguientes líneas:</p>



<pre class="wp-block-code"><code>&#91;Unit]
After=network.target network-online.target
Wants=network-online.target</code></pre>



<p><strong>Guarda el archivo</strong>,  presiona <strong><code>Ctrl + O</code></strong> (para «Write Out», que es guardar), confirma el nombre del archivo y luego presiona <strong><code>Enter</code></strong>. <br><strong>Sal del editor</strong>. Presiona <strong><code>Ctrl + X</code></strong>.</p>



<p>Estas tres líneas de configuración en <code>systemd</code> le dicen al sistema <strong>cómo y cuándo</strong> iniciar un servicio en relación con el estado de la red. Sirven para asegurar que un servicio, como Fail2ban, no se inicie antes de que la conexión a Internet esté completamente operativa.</p>



<p>Ahora, recarga <code>systemd</code> para que lea el nuevo archivo de configuración.</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload</code></pre>



<p>Reinicia el sistema</p>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="111" src="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038-1024x111.png" alt="" class="wp-image-3127" srcset="https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038-1024x111.png 1024w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038-300x32.png 300w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038-768x83.png 768w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038-1536x166.png 1536w, https://linuxete.duckdns.org/wp-content/uploads/2024/08/Seleccion_038.png 1553w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Cuando cargue el sistema completamente, mira en tu bandeja de entrada y comprobarás los email de <strong>stopped</strong>, pero sobre todo los de <strong>started</strong> te aparecen.</p>



<h2 class="wp-block-heading">Control de fallos (incremento de la seguridad)</h2>



<p>Tenemos una opción con la que incrementar el tiempo de baneos de una ip. Con esta configuración, proporcionamos una protección más dinámica contra ataques de fuerza bruta, por lo que, si los atacantes persisten, serán bloqueados por períodos de tiempo cada vez más largos, lo que dificulta sus intentos de acceso.</p>



<p>Esto lo realizaremos con <strong>fail.increment</strong>, con lo que <strong>fail2ban</strong> aumentará el tiempo de bloqueo para cada intento fallido adicional de una IP.</p>



<h4 class="wp-block-heading">¿Cómo funciona?</h4>



<p>Si una IP falla X veces en X minutos, se bloqueará durante X horas.</p>



<p>Si la misma IP intenta conectarse nuevamente y falla otras X veces en X minutos, el tiempo de bloqueo se multiplicará por X horas.</p>



<p>Este proceso continúa, aumentando el tiempo de bloqueo en cada intento fallido adicional, hasta alcanzar el tiempo máximo de bloqueo definido en <strong>fail2ban_increment_max_bantime</strong>.</p>



<h4 class="wp-block-heading">¿Cómo lo hago?</h4>



<p>Vuelve a editar el archivo <strong>jail.local</strong> desde la terminal.</p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/jail.local</code></pre>



<p>Ahora en nuestro jail sshd, continua añadiendo las siguientes líneas.</p>



<pre class="wp-block-code"><code>maxretry = 3
findtime = 10m
bantime = 1h
bantime.increment = true 
bantime.factor = 1.5 
bantime.maxtime = 1d</code></pre>



<p>Quedando de la siguiente manera</p>



<pre class="wp-block-code"><code>&#91;sshd]
enabled = true
port = 2353
logpath = %(sshd_log)s
backend = systemd
action = %(action_mwl)s
maxretry = 3
findtime = 10m
bantime = 1h
bantime.increment = true
bantime.factor = 1.5
bantime.maxtime = 1d</code></pre>



<p>Explicación de los parámetros clave</p>



<ul class="wp-block-list">
<li>enabled = true: Activa el jail para SSH.</li>



<li>port = ssh: Especifica el puerto SSH (generalmente 22).</li>



<li>logpath = %(sshd_log)s Define la ruta al archivo de registro de autenticación.</li>



<li>maxretry = 3: Establece el número máximo de intentos fallidos antes de bloquear una IP.</li>



<li>bantime = 1h: Tiempo de bloqueo inicial de 1 hora.</li>



<li>findtime = 10m: Tiempo en el que se buscan los intentos fallidos (10 minutos).</li>



<li>fail2ban_actions: Define las acciones que se realizarán al bloquear una IP (bloqueo, envío de correo electrónico, etc.).</li>



<li>bantime.increment = true: Habilita la función de incremento de tiempo de bloqueo.</li>



<li>bantime.factor  = 1.5: Factor por el cual se multiplicará el tiempo de bloqueo en cada intento fallido adicional.</li>



<li>bantime.maxtime = 1d: Tiempo de bloqueo máximo de 1 día.</li>
</ul>



<h4 class="wp-block-heading">¿Cómo funciona fail.increment?</h4>



<p>En el ejemplo anterior, <strong>fail2ban</strong> aumentará el tiempo de bloqueo para cada intento fallido adicional de una IP. Por ejemplo:</p>



<p>Si una IP falla 3 veces en 10 minutos, se bloqueará durante 1 hora.</p>



<p>Si la misma IP intenta conectarse nuevamente y falla otras 3 veces en 10 minutos, el tiempo de bloqueo se multiplicará por 1.5 (1.5 horas).</p>



<p>Este proceso continúa, aumentando el tiempo de bloqueo en cada intento fallido adicional, hasta alcanzar el tiempo máximo de bloqueo definido en <strong>fail2ban_increment_max_bantime</strong>.</p>



<h2 class="wp-block-heading">Reincidentes</h2>



<p>¿Y que pasa con aquellos que son como moscas cojoneras, esos que no se dan por vencidos, y duran y duran como el conejito de Duracell? A esos los llamaremos los <strong>reincidentes</strong>, y para ellos existe un lugarl llamado <strong>Recidive Jail </strong>(cárcel para reincidentes).</p>



<h3 class="wp-block-heading">¿Qué es el <code>recidive jail</code>?</h3>



<p>La palabra «recidive» se refiere a la reincidencia. El <code>recidive jail</code> es un jail especial de fail2ban diseñado para detectar y banear a las <strong>direcciones IP reincidentes</strong>, es decir, aquellas que han sido baneadas en múltiples ocasiones por diferentes jails (o el mismo jail) en un corto período de tiempo.</p>



<p>En lugar de banear a una IP por un único ataque de fuerza bruta, el <code>recidive jail</code> la considera una amenaza persistente y la castiga con un bloqueo mucho más largo.</p>



<h3 class="wp-block-heading">¿Cómo funciona?</h3>



<p>A diferencia de otros jails que monitorean archivos de registro de servicios específicos (como SSH o Apache), el <code>recidive jail</code> monitorea el <strong>propio archivo de registro de fail2ban</strong> (<code>/var/log/fail2ban.log</code>). Busca entradas que indiquen que una IP ha sido baneada y, si el mismo atacante ha sido baneado varias veces, aplica un nuevo bloqueo, mucho más largo.</p>



<h3 class="wp-block-heading">¿Cómo lo activo?</h3>



<p>El <code>recidive jail</code> suele venir preconfigurado en las instalaciones de fail2ban. Para activarlo, generalmente solo necesitas editar tu archivo de configuración <code>jail.local</code> y asegurarte de que la sección <code>[recidive]</code> esté habilitada (<code>enabled = true</code>).</p>



<p>Escribe en tu terminal homologada:</p>



<pre class="wp-block-code"><code>sudo nano /etc/fail2ban/jail.local</code></pre>



<p>Busca las siguientes líneas, donde dice <code>[recidive]</code> (si usas el editor nano, Crtl + w te permite buscar por palabra clave)</p>



<pre class="wp-block-code"><code># Jail for more extended banning of persistent abusers
# !!! WARNINGS !!!
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
#    is not at DEBUG level -- which might then cause fail2ban to fall into
#    an infinite loop constantly feeding itself with non-informative lines
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
#    to maintain entries for failed logins for sufficient amount of time
<mark style="background-color:#7bdcb5" class="has-inline-color">&#91;recidive]</mark>

logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime  = 1w
findtime = 1d
</code></pre>



<p>Si no lo tienes o lo tienes en <code>false</code>, añade debajo de <code>[recidive]</code> la variable <code>enabled=true</code></p>



<pre class="wp-block-code"><code># Jail for more extended banning of persistent abusers
# !!! WARNINGS !!!
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
#    is not at DEBUG level -- which might then cause fail2ban to fall into
#    an infinite loop constantly feeding itself with non-informative lines
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
#    to maintain entries for failed logins for sufficient amount of time
&#91;recidive]

<mark style="background-color:#fcb900" class="has-inline-color">enabled = true</mark>
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime  = 1w
findtime = 1d
<mark style="background-color:#fcb900" class="has-inline-color">maxretry = 3</mark></code></pre>



<p>También he añadido un <code>maxretry = 3</code>, ya que no tampoco estaba en la configuración inicial.</p>



<p>Que significa esto:</p>



<ul class="wp-block-list">
<li><code><strong>bantime</strong></code>: Este es el tiempo que durará el bloqueo por reincidencia. En este ejemplo, es 1 semana (<code>1w</code>). Puedes ajustarlo a tu gusto (por ejemplo, <code>1d</code> para 1 día, <code>24h</code> para 24 horas, o incluso <code>1y</code> para 1 año, tambien con -1 sería por tiempo indefinido).</li>



<li><code><strong>findtime</strong></code>: Este es el período de tiempo durante el cual fail2ban buscará reincidencias. En este ejemplo, el jail buscará si una IP ha sido baneada en cualquier otro jail durante el último día (<code>1d</code>).</li>



<li><strong><code>maxretry = 3</code>:</strong>  Este valor significa que si una misma IP es baneada en cualquiera de tus jails (SSH, WordPress, etc.) 3 veces en el período de <code>1d</code> (<code>findtime</code>), el <code>recidive jail</code> se activará y le aplicará el baneo de 1 año. El valor de <code>3</code> es un buen punto de partida, ya que un atacante podría haber sido baneado dos veces en <code>sshd</code> o en <code>wordpress</code> y la tercera vez, independientemente del servicio, será baneado por el <code>recidive jail</code>.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nota: Revisando la documentación de fail2ban, la manera en que el <code>recidive jail</code> detecta la reincidencia es mediante la lectura de su propio registro (<code>/var/log/fail2ban.log</code>). El jail se activa cuando encuentra la palabra «Ban» un número de veces dentro del <code>findtime</code> especificado.</p>
</blockquote>



<p>Veamos ahora que nos dice nuestro fail2ban.log</p>



<pre class="wp-block-code"><code>sudo tail -f /var/log/fail2ban.log</code></pre>



<pre class="wp-block-code"><code>raspberry@pi5:~
$ <strong>sudo tail -f /var/log/fail2ban.log</strong>
2025-08-25 22:50:46,292 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Ignore 192.168.1.1 by ip
2025-08-25 22:51:26,359 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Ignore 192.168.1.1 by ip
2025-08-25 22:52:26,340 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Ignore 192.168.1.1 by ip
2025-08-25 22:52:31,651 fail2ban.actions        &#91;374644]: NOTICE  &#91;wordpress] Unban 59.125.157.215
2025-08-25 22:53:37,381 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 65.109.154.253 - 2024-08-29 22:53:37
2025-08-25 22:53:37,563 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 65.109.154.253 - 2024-08-29 22:53:37
2025-08-25 22:53:44,556 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 65.109.154.253 - 2024-08-29 22:53:44
2025-08-25 22:53:44,881 fail2ban.actions        &#91;374644]: NOTICE  &#91;wordpress] Ban 65.109.154.253
2025-08-25 22:53:44,885 fail2ban.filter         &#91;374644]: <mark style="background-color:#7bdcb5" class="has-inline-color">INFO    &#91;recidive] Found 65.109.154.253</mark> - 2024-08-29 22:53:44
2025-08-25 22:54:54,188 fail2ban.filter         &#91;374644]: INFO    &#91;sshd] Ignore 192.168.1.50 by ip
2025-08-25 22:58:51,595 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 101.68.43.75 - 2024-08-29 22:58:51
2025-08-25 22:58:52,296 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 101.68.43.75 - 2024-08-29 22:58:52
2025-08-25 22:58:58,201 fail2ban.filter         &#91;374644]: INFO    &#91;wordpress] Found 101.68.43.75 - 2024-08-29 22:58:57
2025-08-25 22:58:58,261 fail2ban.actions        &#91;374644]: NOTICE  &#91;wordpress] Ban 101.68.43.75
2025-08-25 22:58:58,266 fail2ban.filter         &#91;374644]: <mark style="background-color:#7bdcb5" class="has-inline-color">INFO    &#91;recidive] Found 101.68.43.75</mark> - 2024-08-29 22:58:58
</code></pre>



<p>La línea <code>INFO [recidive] Found 65.109.154.253</code> e <code>INFO [recidive] Found 101.68.43.75</code> significan que <code>recidive</code> se ha dado cuenta de que esa IP ha sido baneada en mas de una ocasión, pero aún no han sido baneadas por <code>recidive</code> porque no han cumplido los criterios de reincidencia.</p>



<p>Como podemos ver en la salida del comando:</p>



<pre class="wp-block-code"><code>sudo fail2ban-client status recidive</code></pre>



<p>Esto no significa que recidive haya enviado  ya la haya baneado.</p>



<pre class="wp-block-code"><code>raspberry@pi5:~
$ <strong>sudo fail2ban-client status recidive</strong>
Status for the jail: recidive
|- Filter
|  |- Currently failed:	19
|  |- Total failed:	19
|  `- File list:	/var/log/fail2ban.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	
</code></pre>



<p>En la salida de <code>fail2ban-client status recidive</code>, observamos que:</p>



<ul class="wp-block-list">
<li><code>Currently failed: 19</code> y <code>Total failed: 19</code>: Esto confirma que el filtro del <code>recidive jail</code> ha detectado 19 baneos totales en otros jails. El <code>recidive jail</code> está haciendo su trabajo de contar los baneos.</li>



<li><code>Currently banned: 0</code> y <code>Total banned: 0</code>: Esto indica que ninguna de las IPs ha alcanzado el umbral para ser considerada reincidente. Las IPs anteriormente mostradas en el <code>log</code> (65.109.154.253 y 101.68.43.75) han sido baneadas una sola vez en el <code>log</code>, por lo que no han activado la acción de ban del <code>recidive jail</code>.</li>
</ul>



<h2 class="wp-block-heading">Mi configuración.</h2>



<p>Y para terminar, después de un tiempo de uso, he estado probando varias configuraciones, y estas son las que uso actualmente:</p>



<h3 class="wp-block-heading">Configuración [sshd]</h3>



<pre class="wp-block-code"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-ast-global-color-1-color">&#91;sshd]
enabled = true
port    = 2353
logpath = %(sshd_log)s
backend = systemd
action = %(action_mwl)s
maxretry = 3
findtime = 10m
bantime = 1h
bantime.increment = true
bantime.factor = 24
bantime.maxtime = 5w</mark></code></pre>



<h3 class="wp-block-heading">Configuración [recidive]</h3>



<pre class="wp-block-code"><code># Jail for more extended banning of persistent abusers
# !!! WARNINGS !!!
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
#    is not at DEBUG level -- which might then cause fail2ban to fall into
#    an infinite loop constantly feeding itself with non-informative lines
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
#    to maintain entries for failed logins for sufficient amount of time
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-ast-global-color-1-color">&#91;recidive]

enabled = true
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime  = 1y
findtime = 1d</mark>
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-ast-global-color-1-color">maxretry = 3</mark></code></pre>



<p>Tal vez te estés preguntando, ¿para que usamos b<code>antime.increment</code> con un <code>bantime.maxtime</code> de 5 semanas, si en un día los reincidentes serán expulsados por un año?. ¿No le dará tiempo a bantime.increment a echar a nadie por 5 semanas?</p>



<p>Pues tiene su lógica, imaginemos 2 escenarios distintos:</p>



<h5 class="wp-block-heading">Escenario 1: Ataques que no cumplen los criterios de <code>recidive</code></h5>



<ul class="wp-block-list">
<li><strong>Un atacante muy lento y persistente:</strong> Un atacante podría hacer un par de intentos, ser baneado, y no volver a intentar nada por 36 horas. Luego, repite el proceso. Como el <code>findtime</code> de tu <code>recidive jail</code> es <code>1d</code> (un día), los intentos de este atacante podrían quedar fuera del rango de detección de <code>recidive</code>. En este caso, el <code>bantime.increment</code> seguirá aumentando el tiempo de baneo con cada nuevo intento, sin que <code>recidive</code> se active.</li>
</ul>



<h5 class="wp-block-heading">Escenario 2: Ataques contra un solo servicio y de forma intermitente</h5>



<ul class="wp-block-list">
<li>Si un atacante solo se enfoca en SSH y va incrementando su tiempo de espera entre ataques, el <code>bantime.increment</code> del <code>sshd</code> jail se encargará de él. Un atacante podría ser baneado por 1 hora, luego 24 horas, y luego 5 días. Si el atacante vuelve a intentar después de los 5 días, el <code>bantime.increment</code> seguiría su progresión hasta alcanzar las 5 semanas, castigando el comportamiento persistente en <strong>ese servicio en particular</strong>, sin que el <code>recidive jail</code> se active si no cumple con sus criterios de frecuencia.</li>
</ul>



<h5 class="wp-block-heading">Conclusión</h5>



<p>Pensemos en nuestros jails como una defensa por capas:</p>



<ol start="1" class="wp-block-list">
<li><strong>Capa 1: Jails individuales</strong> (<code>sshd</code>, <code>wordpress</code>, etc.). Son tu primera línea de defensa, con reglas para bloquear ataques de fuerza bruta rápidos.</li>



<li><strong>Capa 2: <code>bantime.increment</code></strong>. Es la capa que maneja la <strong>persistencia</strong> contra un <strong>único servicio</strong>. Su propósito es hacer cada vez más costoso para un atacante seguir intentando contra ese servicio.</li>



<li><strong>Capa 3: <code>recidive jail</code></strong>. Es la defensa definitiva contra la <strong>reincidencia general</strong> en tu sistema. Se encarga de los atacantes más serios que atacan múltiples servicios o persisten a pesar de los baneos iniciales.</li>
</ol>



<p>El <code>bantime.maxtime</code> garantiza que la Capa 2 sea muy efectiva por sí misma, incluso si el atacante no cumple los criterios para ser considerado «reincidente» por el <code>recidive jail</code>. Por lo que conviene usarlo, ya que cubre escenarios que el <code>recidive jail</code> no. Esta configuración es muy sólida y está bien pensada, ya que combina de manera excelente estas diferentes capas de seguridad.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/instalar-fail2ban-en-debian-12-y-que-funcione/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
	</channel>
</rss>
