<?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>Aprende IT</title>
	<atom:link href="https://aprendeit.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://aprendeit.com/</link>
	<description>Todas las novedades sobre IT</description>
	<lastBuildDate>Wed, 03 Sep 2025 16:19:14 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://aprendeit.com/wp-content/uploads/2020/02/LOGO-CORTO-100x100.png</url>
	<title>Aprende IT</title>
	<link>https://aprendeit.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Usando socat para redirección de puertos TCP</title>
		<link>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/</link>
					<comments>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 03 Sep 2025 08:08:12 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=7048</guid>

					<description><![CDATA[<p>Usando socat para redirección de puertos TCP En el mundo de la administración de sistemas y la ciberseguridad, conocer herramientas flexibles y potentes es clave. Una de esas herramientas es ...</p>
<p>La entrada <a href="https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/">Usando socat para redirección de puertos TCP</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Usando socat para redirección de puertos TCP</h2>
<p>En el mundo de la administración de sistemas y la ciberseguridad, conocer herramientas flexibles y potentes es clave. Una de esas herramientas es socat, una utilidad de red que puede parecer sencilla, pero que es extremadamente poderosa tanto para tareas legítimas como para pruebas de penetración. En este artículo, exploraremos cómo usar socat para redirección de puertos HTTP y también cómo puede ser utilizada en movimientos laterales dentro de una red.</p>
<h2>¿Qué es socat?</h2>
<p>socat (SOcket CAT) es una herramienta de línea de comandos que permite establecer conexiones bidireccionales entre dos flujos de datos. Estos flujos pueden ser sockets TCP, UDP, archivos, terminales, dispositivos serie, y más. Piensa en socat como el «netcat con esteroides».</p>
<h2>Redirección de puertos HTTP con socat</h2>
<p>Un caso de uso muy común es redirigir tráfico HTTP desde un puerto a otro. Por ejemplo, si tienes un servidor web corriendo en el puerto 8080 y quieres exponerlo en el puerto 80 sin cambiar la configuración del servicio, puedes hacer lo siguiente:</p>
<pre>sudo socat TCP-LISTEN:80,fork TCP:127.0.0.1:8080</pre>
<h2>¿Qué hace este comando?</h2>
<p>TCP-LISTEN:80 escucha en el puerto 80.</p>
<p>fork permite manejar múltiples conexiones simultáneamente.</p>
<p>TCP:127.0.0.1:8080 redirige todo el tráfico al puerto 8080 de localhost.</p>
<p>Con esto, cualquier petición a tu servidor en el puerto 80 será reenviada automáticamente al 8080. Es muy útil en entornos donde se quiere evitar modificar la configuración de un servicio que ya está corriendo.</p>
<h2 data-start="229" data-end="272">Socat y los movimientos laterales en red</h2>
<p data-start="274" data-end="584">Además de ser útil para redirección de puertos a nivel local, <code data-start="336" data-end="343">socat</code> también es ampliamente utilizado en <strong data-start="380" data-end="405">movimientos laterales</strong> dentro de una red interna comprometida. Esta técnica es habitual en <strong data-start="474" data-end="508">escenarios de post-explotación</strong>, cuando un atacante ya ha ganado acceso a una máquina intermedia en la red.</p>
<h3 data-start="586" data-end="606">Escenario típico</h3>
<p data-start="608" data-end="862">Imagina que un atacante tiene acceso a una máquina que <strong data-start="663" data-end="707">sí está expuesta a Internet (IP pública)</strong>, y desde esa máquina puede acceder internamente a otra máquina que <strong data-start="775" data-end="814">no tiene exposición directa externa</strong>, pero sí está conectada a la misma red interna.</p>
<p data-start="864" data-end="1019">Esta segunda máquina, por ejemplo, podría tener corriendo un servicio (como SSH, RDP, MySQL, etc.) en un puerto que solo es accesible desde la red interna.</p>
<p data-start="1021" data-end="1209">El atacante, desde la máquina comprometida expuesta a Internet, puede usar <code data-start="1096" data-end="1103">socat</code> para <strong data-start="1109" data-end="1151">exponer ese puerto interno al exterior</strong> y acceder al servicio como si estuviera en su propia red.</p>
<h3 data-start="1211" data-end="1254">Comando <code data-start="1223" data-end="1230">socat</code> para exponer el puerto:</h3>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">socat TCP-LISTEN:puerto_externo,<span class="hljs-built_in">bind</span>=0.0.0.0,fork,reuseaddr TCP:ip_interna:puerto_interno<br />
</code></div>
</div>
<h3 data-start="1359" data-end="1380"></h3>
<h3 data-start="1359" data-end="1380">Ejemplo práctico:</h3>
<p data-start="1382" data-end="1614">Supón que la IP interna del segundo equipo es <code data-start="1428" data-end="1442">192.168.1.20</code> y tiene SSH en el puerto <code data-start="1468" data-end="1472">22</code>. La máquina intermedia (la comprometida) tiene una IP pública, y quieres acceder a ese SSH desde tu equipo remoto a través de esa IP pública.</p>
<p data-start="1616" data-end="1649">Ejecuta en la máquina intermedia:</p>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">socat TCP-LISTEN:2222,<span class="hljs-built_in">bind</span>=0.0.0.0,fork,reuseaddr TCP:192.168.1.20:22<br />
</code></div>
</div>
<p data-start="1734" data-end="1743">Con esto:</p>
<ul data-start="1745" data-end="1914">
<li data-start="1745" data-end="1792">
<p data-start="1747" data-end="1792">El puerto <code data-start="1757" data-end="1763">2222</code> queda expuesto públicamente.</p>
</li>
<li data-start="1793" data-end="1914">
<p data-start="1795" data-end="1914">Todo lo que llegue a <code data-start="1816" data-end="1829">puerto 2222</code> en la máquina intermedia se redirige al puerto <code data-start="1877" data-end="1881">22</code> de la IP interna <code data-start="1899" data-end="1913">192.168.1.20</code>.</p>
</li>
</ul>
<p data-start="1916" data-end="1961">Desde fuera, el atacante solo necesita hacer:</p>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">ssh usuario@ip_publica -p 2222<br />
</code></div>
</div>
<p data-start="2007" data-end="2094">Y estará accediendo a la máquina que antes <strong data-start="2050" data-end="2093">solo era accesible desde la red interna</strong>.</p>
<h3 data-start="2096" data-end="2136">¿Por qué esto es útil (o peligroso)?</h3>
<ul data-start="2138" data-end="2358">
<li data-start="2138" data-end="2187">
<p data-start="2140" data-end="2187">Permite al atacante <strong data-start="2160" data-end="2171">pivotar</strong> entre máquinas.</p>
</li>
<li data-start="2188" data-end="2257">
<p data-start="2190" data-end="2257">Expone servicios que normalmente estarían <strong data-start="2232" data-end="2256">aislados de Internet</strong>.</p>
</li>
<li data-start="2258" data-end="2358">
<p data-start="2260" data-end="2358">Es una técnica difícil de detectar si no se monitoriza adecuadamente el tráfico saliente/entrante.</p>
</li>
</ul>
<p>La entrada <a href="https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/">Usando socat para redirección de puertos TCP</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Qué es el ARP Spoofing y cómo se convierte en un ataque «Man-in-the-Middle»?</title>
		<link>https://aprendeit.com/que-es-el-arp-spoofing-y-como-se-convierte-en-un-ataque-man-in-the-middle/</link>
					<comments>https://aprendeit.com/que-es-el-arp-spoofing-y-como-se-convierte-en-un-ataque-man-in-the-middle/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Thu, 14 Aug 2025 14:08:29 +0000</pubDate>
				<category><![CDATA[Otros]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=7044</guid>

					<description><![CDATA[<p>El ARP Spoofing es una técnica de ciberataque que explota la forma en que los dispositivos se comunican en una red local. Para entenderlo, primero debemos conocer el Protocolo de ...</p>
<p>La entrada <a href="https://aprendeit.com/que-es-el-arp-spoofing-y-como-se-convierte-en-un-ataque-man-in-the-middle/">¿Qué es el ARP Spoofing y cómo se convierte en un ataque «Man-in-the-Middle»?</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>El ARP Spoofing es una técnica de ciberataque que explota la forma en que los dispositivos se comunican en una red local. Para entenderlo, primero debemos conocer el Protocolo de Resolución de Direcciones (ARP). En una red local IPv4, los dispositivos utilizan direcciones IP y direcciones MAC para identificarse. La tabla ARP es una especie de «guía» interna que cada dispositivo mantiene, donde asocia cada dirección IP de la red con su correspondiente dirección MAC.</p>
<p>Cuando un dispositivo (como tu ordenador) quiere enviar un paquete de datos a otro, primero busca la dirección MAC de destino en su tabla ARP. Si no la encuentra, envía una solicitud ARP a toda la red preguntando: «¿Quién tiene esta dirección IP?». El dispositivo con esa IP responde con su dirección MAC, y así la tabla se actualiza.</p>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/czOSoKhdDNM?si=zASMtultQwCufAY6" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h2>La Configuración del Laboratorio del Ataque</h2>
<p>El video ilustra este ataque en un entorno de laboratorio con una red 192.168.56.0/24 que incluye tres dispositivos clave:</p>
<ul>
<li>Un dispositivo con la IP 192.168.56.20 y la dirección MAC terminada en 80.</li>
<li>Otro dispositivo con la IP 192.168.56.19 y la dirección MAC terminada en AB.</li>
<li>El gateway (la puerta de enlace, o router) con la IP 192.168.56.1 y la dirección MAC terminada en 02.</li>
</ul>
<p>El objetivo del ataque es que el dispositivo con la IP .20 se haga pasar por el dispositivo con la IP .19 para el resto de la red.</p>
<h2>El Proceso del Ataque de ARP Spoofing</h2>
<p>El ataque se ejecuta enviando paquetes ARP de «respuesta» falsos. El atacante no espera a que alguien pregunte, sino que proactivamente envía información incorrecta a la red.</p>
<p>Envenenamiento de la tabla ARP del gateway: El dispositivo atacante envía repetidamente paquetes ARP al gateway, afirmando que la dirección MAC para la IP 192.168.56.19 ahora es la misma que la del atacante (la que termina en 80).</p>
<p>Envenenamiento de la tabla ARP de la víctima: De manera similar, el atacante envía paquetes ARP al dispositivo víctima (el .19), afirmando que la dirección MAC del gateway (el .1) ahora es la del atacante (la que termina en 80).</p>
<p>Como resultado, las tablas ARP del gateway y de la víctima se «envenenan». El gateway piensa que la IP .19 está en la dirección MAC del atacante, y la víctima piensa que el gateway está en la dirección MAC del atacante.</p>
<p>Esto crea un escenario de «hombre en el medio» (Man-in-the-Middle). A partir de este momento, todo el tráfico que el dispositivo .19 intente enviar al gateway (es decir, a internet) será redirigido al atacante. De igual manera, todo el tráfico que el gateway intente enviar al dispositivo .19 también será redirigido al atacante.</p>
<p>El atacante puede interceptar este tráfico, registrarlo, modificarlo o incluso descartarlo, todo sin que la víctima o el gateway se den cuenta. Esta técnica es especialmente peligrosa en redes Wi-Fi públicas y permite a un atacante robar credenciales de inicio de sesión, datos personales y otra información sensible.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://aprendeit.com/que-es-el-arp-spoofing-y-como-se-convierte-en-un-ataque-man-in-the-middle/">¿Qué es el ARP Spoofing y cómo se convierte en un ataque «Man-in-the-Middle»?</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/que-es-el-arp-spoofing-y-como-se-convierte-en-un-ataque-man-in-the-middle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Protegiendo tu Sistema Linux: La Importancia de `rp_filter` contra el IP Spoofing y los DDoS</title>
		<link>https://aprendeit.com/protegiendo-tu-sistema-linux-la-importancia-de-rp_filter-contra-el-ip-spoofing-y-los-ddos/</link>
					<comments>https://aprendeit.com/protegiendo-tu-sistema-linux-la-importancia-de-rp_filter-contra-el-ip-spoofing-y-los-ddos/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Mon, 14 Jul 2025 20:42:50 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6987</guid>

					<description><![CDATA[<p>En el panorama actual de las ciberamenazas, asegurar nuestros sistemas es más crucial que nunca. Como expertos en Linux y ciberseguridad, sabemos que una de las técnicas de ataque más ...</p>
<p>La entrada <a href="https://aprendeit.com/protegiendo-tu-sistema-linux-la-importancia-de-rp_filter-contra-el-ip-spoofing-y-los-ddos/">Protegiendo tu Sistema Linux: La Importancia de `rp_filter` contra el IP Spoofing y los DDoS</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En el panorama actual de las ciberamenazas, asegurar nuestros sistemas es más crucial que nunca. Como expertos en Linux y ciberseguridad, sabemos que una de las técnicas de ataque más comunes y peligrosas es el <strong>IP spoofing</strong>. Este método, donde un atacante falsifica la dirección IP de origen de un paquete de red, es frecuentemente utilizado en ataques de denegación de servicio (DoS) y <strong>DDoS (Distributed Denial of Service)</strong> para ocultar la verdadera identidad del atacante y evadir defensas. Es vital entender que, si bien `rp_filter` ayuda a mitigar estos ataques, un DDoS masivo aún <strong>puede llegar a tumbar un sitio web si logra saturar el ancho de banda</strong> («llenar el canuto») de la conexión a internet del servidor, incluso si los paquetes falsificados son descartados en el sistema. Afortunadamente, los sistemas Linux nos ofrecen una herramienta fundamental para mitigar este riesgo: el parámetro `rp_filter`.</p>
<p>El `rp_filter`, o Reverse Path Filtering, es una característica del kernel de Linux diseñada para validar la ruta de origen de los paquetes de red entrantes. Su función principal es asegurarse de que un paquete recibido en una interfaz de red podría haber sido enviado a través de esa misma interfaz si la respuesta tuviera que salir por ella. Esto se conoce como «unicast reverse path forwarding». Al verificar la validez de la ruta de origen, `rp_filter` se convierte en una defensa efectiva contra el IP spoofing.</p>
<p>Entender los diferentes modos de `rp_filter` es esencial para configurarlo adecuadamente:</p>
<ul>
<li><strong>`0` (Desactivado):</strong> En este modo, no se realiza ninguna verificación de la ruta de origen. <strong>Es el ajuste menos seguro</strong> y debería evitarse en entornos de producción, ya que deja el sistema vulnerable a ataques de IP spoofing.</li>
<li><strong>`1` (Estricto):</strong> Este es el modo <strong>más seguro y recomendado</strong>. Realiza una verificación rigurosa de la ruta inversa. Si un paquete llega a una interfaz y la tabla de enrutamiento indica que la respuesta a ese paquete saldría por una interfaz diferente, el paquete se descarta. Esto es excelente para prevenir el spoofing, pero puede causar problemas en configuraciones de red complejas o asimétricas donde el tráfico de entrada y salida utiliza rutas distintas intencionadamente.</li>
<li><strong>`2` (Relajado):</strong> Este es el valor por defecto en muchas distribuciones. En este modo, la verificación es menos estricta. Un paquete es aceptado si la respuesta a ese paquete saldría por <em>cualquier</em> interfaz en el sistema. Es una buena opción para redes con enrutamiento asimétrico donde el modo estricto podría causar falsos positivos, aunque ofrece menos protección que el modo estricto.</li>
</ul>
<p>&#8212;</p>
<h3>Implementación y Consideraciones</h3>
<p>Para verificar el estado actual de `rp_filter`, puedes usar el comando `sysctl -a | grep .rp_filter`. Para configurarlo en modo estricto, que es nuestra recomendación general para la mayoría de los servidores:</p>
<pre><code>sysctl -w net.ipv4.conf.all.rp_filter=1</code></pre>
<p>Es crucial recordar que los cambios con `sysctl -w` son temporales. Para persistir la configuración tras un reinicio, debes añadir la línea `net.ipv4.conf.all.rp_filter=1` (o el valor deseado) al archivo `/etc/sysctl.conf` y luego aplicar los cambios con `sysctl -p`.</p>
<p>En resumen, la correcta configuración de `rp_filter` es un paso fundamental en cualquier estrategia de ciberseguridad para un sistema Linux. Aunque no es una bala de plata contra todos los ataques DDoS, ya que un volumen de tráfico masivo puede saturar la red independientemente de si los paquetes son válidos o no, sí <strong>ayuda a descartar tráfico malicioso con IPs falsificadas a nivel del kernel</strong>, reduciendo la carga de procesamiento y haciendo el sistema más resiliente. Al comprender y aplicar este control, podemos fortalecer significativamente nuestras defensas contra ataques basados en IP spoofing.</p>
<p>La entrada <a href="https://aprendeit.com/protegiendo-tu-sistema-linux-la-importancia-de-rp_filter-contra-el-ip-spoofing-y-los-ddos/">Protegiendo tu Sistema Linux: La Importancia de `rp_filter` contra el IP Spoofing y los DDoS</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/protegiendo-tu-sistema-linux-la-importancia-de-rp_filter-contra-el-ip-spoofing-y-los-ddos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</title>
		<link>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/</link>
					<comments>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 22:36:54 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6912</guid>

					<description><![CDATA[<p>Comprobar si un puerto está abierto en un servidor remoto es una tarea común para administradores de sistemas. Aunque herramientas como telnet o netcat (nc) suelen usarse para este fin, ...</p>
<p>La entrada <a href="https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/">Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Comprobar si un puerto está abierto en un servidor remoto es una tarea común para administradores de sistemas. Aunque herramientas como telnet o netcat (nc) suelen usarse para este fin, Bash ofrece una alternativa incorporada que no necesita instalar nada adicional: el uso de /dev/tcp/ y /dev/udp/.</p>
<p>En este artículo aprenderás cómo usar estas funciones integradas de Bash para verificar puertos TCP y UDP de forma rápida, simple y sin dependencias externas.</p>
<h2>¿Qué es /dev/tcp/host/puerto y /dev/udp/host/puerto?</h2>
<p>Bash tiene una característica oculta que permite usar redirecciones especiales para crear conexiones de red. Estas rutas (/dev/tcp/ y /dev/udp/) no existen en el sistema de archivos, pero Bash las interpreta internamente para abrir sockets.</p>
<pre>echo &gt; /dev/tcp/host/puerto
</pre>
<p>Esto intenta abrir una conexión TCP al host y puerto especificado.</p>
<p>Verificar un Puerto TCP desde Línea de Comandos</p>
<p>Para probar si un puerto está abierto, simplemente ejecuta:</p>
<pre>echo &gt; /dev/tcp/google.com/80 &amp;&amp; echo "Puerto abierto" || echo "Puerto cerrado"
</pre>
<h3>¿Qué hace esto?</h3>
<p>Si la conexión se abre exitosamente, Bash continúa y muestra «Puerto abierto».</p>
<p>Si falla (por ejemplo, el puerto está cerrado o el host no responde), muestra «Puerto cerrado».</p>
<h3>Con timeout</h3>
<p>Para evitar que el comando quede colgado si el host no responde, puedes usar timeout:</p>
<pre>timeout 3 bash -c "echo &gt; /dev/tcp/google.com/80" &amp;&amp; echo "Abierto" || echo "Cerrado o Timeout"
</pre>
<p>🛈 Requiere Bash con soporte de redirección /dev/tcp. No funciona en shells como sh o dash.</p>
<h2>Verificar un Puerto UDP con /dev/udp</h2>
<p>El uso para UDP es similar:</p>
<pre>echo &gt; /dev/udp/8.8.8.8/53 &amp;&amp; echo "Enviado" || echo "Fallo"
</pre>
<p>Pero hay un detalle importante: UDP no garantiza entrega ni respuesta, por lo que este método no te dice si el puerto está abierto realmente.</p>
<h3>¿Cómo recibir respuesta?</h3>
<p>Puedes usar un descriptor de archivo para enviar y luego intentar leer:</p>
<pre>exec 3&lt;&gt; /dev/udp/8.8.8.8/53
echo -ne '\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00' &gt;&amp;3
read -t 2 -u 3 respuesta &amp;&amp; echo "Respuesta: $respuesta" || echo "Sin respuesta"
</pre>
<p>Este ejemplo envía una consulta DNS vacía al puerto 53 y espera una respuesta.</p>
<p>Limitaciones del Método<br />
Característica TCP UDP<br />
Detectar si el puerto está abierto Fiable No confiable<br />
Requiere herramientas externas No No<br />
Recibe respuesta del servicio Sí (si el servicio responde) Solo si esperas una respuesta válida</p>
<h3>¿Y si quiero algo más confiable para UDP?</h3>
<p>Si necesitas verificar si un puerto UDP está realmente abierto y responde, mejor usa herramientas como:</p>
<pre>nc -uzv       # netcat en modo UDP
nmap -sU -p   # escaneo UDP con Nmap
</pre>
<p>Usar /dev/tcp/ y /dev/udp/ es una excelente forma de comprobar puertos rápidamente sin depender de herramientas externas. Es especialmente útil en entornos minimalistas o scripts automatizados.</p>
<h2>Resumen rápido:</h2>
<p>✅ TCP: Funciona muy bien para comprobar puertos abiertos.</p>
<p>⚠️ UDP: Puede enviar datagramas, pero no garantiza saber si el puerto está abierto.</p>
<p>🧰 No necesitas instalar nada si tienes Bash.</p>
<p>¿Ya lo has probado en tus scripts? Déjanos tus dudas o comparte cómo lo usas tú.</p>
<p>La entrada <a href="https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/">Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo proteger tu servidor SSH con Google Authenticator y 2FA</title>
		<link>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/</link>
					<comments>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 05 Feb 2025 06:51:06 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6800</guid>

					<description><![CDATA[<p>Si tienes un servidor Linux y te preocupa la seguridad de tus conexiones SSH, estás en el sitio correcto. La autenticación en dos pasos (2FA) se ha convertido en un ...</p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/">Cómo proteger tu servidor SSH con Google Authenticator y 2FA</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Si tienes un servidor Linux y te preocupa la seguridad de tus conexiones SSH, estás en el sitio correcto. La autenticación en dos pasos (2FA) se ha convertido en un método casi imprescindible para proteger accesos importantes. Con Google Authenticator, puedes implementar una protección extra usando contraseñas de un solo uso basadas en el tiempo (TOTP. Aquí te explico, paso a paso y de forma sencilla, cómo configurarlo.</p>
<h2>Paso 1: Instalar Google Authenticator</h2>
<p>Lo primero que necesitas es instalar Google Authenticator en tu servidor. Este programa se integra fácilmente con PAM (Pluggable Authentication Modules) para añadir 2FA a la autenticación SSH.</p>
<p>Abre una terminal y actualiza los paquetes con:</p>
<pre>sudo apt update</pre>
<p>Luego, instala el paquete necesario:</p>
<pre>sudo apt install libpam-google-authenticator
</pre>
<p>Ahora, es momento de configurar Google Authenticator para el usuario que va a conectarse mediante SSH. Si eres tú, simplemente ejecuta:</p>
<pre>google-authenticator</pre>
<p>Cuando ejecutes este comando, el sistema te mostrará un código QR en la pantalla. Abre la app de Google Authenticator (o cualquier otra app compatible con TOTP, como Authy o FreeOTP) y escanea el código. Así se vincularán la app y tu servidor. La aplicación generará códigos de seis dígitos que cambiarán cada cierto tiempo y que necesitarás para iniciar sesión.</p>
<p>Durante el proceso de configuración, el programa te hará una serie de preguntas (como si quieres permitir tokens de emergencia o establecer límites de tiempo). Te recomiendo que leas cada opción y elijas la configuración que mejor te convenga.</p>
<h2>Paso 2: Configurar PAM para Google Authenticator</h2>
<p>Ahora que tienes la app configurada, hay que decirle al sistema que utilice Google Authenticator como parte del proceso de autenticación.</p>
<p>Para ello, edita el archivo de configuración PAM de SSH:</p>
<pre>sudo nano /etc/pam.d/sshd</pre>
<p>Una vez dentro del archivo, añade esta línea al inicio:</p>
<pre>auth required pam_google_authenticator.so</pre>
<p>Guarda los cambios (con Ctrl + O y Enter, y luego Ctrl + X para salir del editor).</p>
<p>Paso 3: Configurar OpenSSH para soportar 2FA<br />
El siguiente paso es modificar la configuración del servicio SSH para que soporte el 2FA. Para ello, edita el archivo de configuración de OpenSSH:</p>
<pre>sudo nano /etc/ssh/sshd_config</pre>
<p>Dentro del archivo, asegúrate de que estas líneas estén configuradas correctamente:</p>
<pre>UsePAM yes
ChallengeResponseAuthentication yes
</pre>
<p>También debes definir el método de autenticación. Vamos a exigir que se use la clave pública junto con el código TOTP, así que añade o modifica esta línea:</p>
<pre>AuthenticationMethods publickey,keyboard-interactive</pre>
<p>Con esta configuración, SSH pedirá primero la autenticación por clave pública y después el código de Google Authenticator.</p>
<h2>Paso 4: Reinicia el servicio SSH</h2>
<p>Para aplicar todos los cambios, es necesario reiniciar el servicio SSH:</p>
<pre>sudo systemctl restart sshd</pre>
<p>Probando la autenticación en dos pasos</p>
<p>Ahora que todo está configurado, es momento de probar si funciona. Cierra la sesión actual y vuelve a conectarte al servidor mediante SSH. Si todo ha ido bien, el sistema te pedirá:</p>
<ul>
<li>Tu clave o password para conectar por SSH.</li>
<li>El código de seis dígitos generado por Google Authenticator.</li>
</ul>
<p>Si introduces ambos correctamente, tendrás acceso al servidor. ¡Así de fácil!</p>
<h2>Consejos adicionales</h2>
<p>Copia de seguridad del código QR: Cuando configures Google Authenticator, guarda una copia del código QR o las claves de emergencia. Si pierdes tu teléfono, te será muy útil.<br />
Limita los intentos fallidos: Para mayor seguridad, puedes configurar fail2ban para bloquear direcciones IP después de varios intentos fallidos.<br />
Deshabilita la autenticación por contraseña: Si solo permites la autenticación por clave pública y 2FA, tu servidor será mucho más seguro.</p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/">Cómo proteger tu servidor SSH con Google Authenticator y 2FA</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guía Básica para Utilizar strace</title>
		<link>https://aprendeit.com/guia-basica-para-utilizar-strace/</link>
					<comments>https://aprendeit.com/guia-basica-para-utilizar-strace/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Tue, 12 Nov 2024 16:04:39 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6612</guid>

					<description><![CDATA[<p>strace es una herramienta de diagnóstico en sistemas Unix y Linux que permite rastrear las llamadas al sistema que realiza un programa en ejecución. Es muy útil para depurar problemas, ...</p>
<p>La entrada <a href="https://aprendeit.com/guia-basica-para-utilizar-strace/">Guía Básica para Utilizar strace</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> es una herramienta de diagnóstico en sistemas Unix y Linux que permite rastrear las llamadas al sistema que realiza un programa en ejecución. Es muy útil para depurar problemas, analizar el rendimiento y entender cómo interactúa una aplicación con el sistema operativo. Aquí te dejo una guía básica para comenzar a usar </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> y localizar problemas en tiempo de ejecución.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">1. Instalación de strace</span></h2>
<p class="md-end-block md-p"><span class="md-plain">La mayoría de las distribuciones de Linux vienen con </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> preinstalado. Si no lo tienes, puedes instalarlo con:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-comment"># En Debian/Ubuntu</span></span>
<span role="presentation"><span class="cm-builtin">sudo</span> apt-get install strace</span>
<span role="presentation">​</span>
<span role="presentation"><span class="cm-comment"># En CentOS/RHEL</span></span>
<span role="presentation"><span class="cm-builtin">sudo</span> yum install strace</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">2. Ejecutar un programa con strace</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Para iniciar un programa y rastrear sus llamadas al sistema, simplemente usa:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace nombre_programa [argumentos]</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Por ejemplo, para rastrear </span><span class="md-pair-s" spellcheck="false"><code>ls</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-builtin">ls</span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">Esto mostrará todas las llamadas al sistema que </span><span class="md-pair-s" spellcheck="false"><code>ls</code></span><span class="md-plain"> realiza desde que inicia hasta que termina.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">3. Adjuntar strace a un proceso en ejecución</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Si deseas rastrear un programa que ya está ejecutándose, puedes adjuntar </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> a su proceso con el </span><span class="md-pair-s" spellcheck="false"><code>PID</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-p</span> PID</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Para encontrar el </span><span class="md-pair-s" spellcheck="false"><code>PID</code></span><span class="md-plain">, puedes usar el comando </span><span class="md-pair-s" spellcheck="false"><code>ps</code></span><span class="md-plain"> o </span><span class="md-pair-s" spellcheck="false"><code>pgrep</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-builtin">ps</span> aux | <span class="cm-builtin">grep</span> nombre_programa</span>
<span role="presentation">pgrep nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">4. Filtrar tipos específicos de llamadas al sistema</span></h2>
<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> genera mucha salida, por lo que puede ser útil filtrar solo las llamadas que te interesan. Para ello, puedes especificar tipos de llamadas con el parámetro </span><span class="md-pair-s" spellcheck="false"><code>-e</code></span><span class="md-plain">:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Archivo</span></strong></span><span class="md-plain">: Para ver solo las llamadas relacionadas con archivos.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>open,close,read,write nombre_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Red</span></strong></span><span class="md-plain">: Para ver solo las llamadas relacionadas con la red.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>network nombre_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Errores</span></strong></span><span class="md-plain">: Para ver solo las llamadas que resultan en errores.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>error nombre_programa</span></pre>
</li>
</ul>
<h2 class="md-end-block md-heading"><span class="md-plain">5. Identificar y localizar problemas comunes</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">a. Problemas de permisos</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Si una llamada al sistema falla debido a permisos, verás un error </span><span class="md-pair-s" spellcheck="false"><code>EACCES</code></span><span class="md-plain">. Esto puede significar que el usuario que ejecuta el programa no tiene acceso a algún archivo o directorio. Busca líneas como estas:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">open("/ruta/al/archivo", O_RDONLY) = -1 EACCES (Permission denied)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">b. Archivos no encontrados</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Si un programa intenta abrir un archivo inexistente, verás un error </span><span class="md-pair-s" spellcheck="false"><code>ENOENT</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">open("/ruta/al/archivo", O_RDONLY) = -1 ENOENT (No such file or directory)</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Este tipo de error suele indicar rutas de archivo incorrectas o archivos faltantes.</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">c. Problemas de red</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Para rastrear problemas de red, puedes filtrar por llamadas como </span><span class="md-pair-s" spellcheck="false"><code>connect</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>sendto</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>recvfrom</code></span><span class="md-plain">, etc. Si ves un error </span><span class="md-pair-s" spellcheck="false"><code>ECONNREFUSED</code></span><span class="md-plain">, podría indicar que el servidor al que intentas conectarte no está disponible o se está rechazando la conexión.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.1.1")}, 16) = -1 ECONNREFUSED (Connection refused)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">d. Fallos de memoria</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Errores como </span><span class="md-pair-s" spellcheck="false"><code>ENOMEM</code></span><span class="md-plain"> pueden indicar que el sistema se está quedando sin memoria para ejecutar el programa.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">e. Errores de llamadas al sistema específicas</span></h3>
<p class="md-end-block md-p"><span class="md-plain">A veces, verás errores en llamadas específicas como </span><span class="md-pair-s" spellcheck="false"><code>fork</code></span><span class="md-plain"> o </span><span class="md-pair-s" spellcheck="false"><code>execve</code></span><span class="md-plain">. Esto puede deberse a que el programa esté intentando ejecutar otro proceso que no encuentra o no tiene permisos. Para problemas con </span><span class="md-pair-s" spellcheck="false"><code>execve</code></span><span class="md-plain">, revisa la existencia y los permisos de ejecución de los binarios.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">execve("/bin/ls", ["ls"], [/* 23 vars */]) = -1 ENOENT (No such file or directory)</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">6. Registrar salida a un archivo</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Si necesitas analizar la salida de </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> después de la ejecución, redirígela a un archivo con </span><span class="md-pair-s" spellcheck="false"><code>-o</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-o</span> salida_strace.log nombre_programa</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Luego puedes analizar el archivo con herramientas como </span><span class="md-pair-s" spellcheck="false"><code>grep</code></span><span class="md-plain"> para buscar errores específicos.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">7. Analizar el tiempo de cada llamada</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Usa </span><span class="md-pair-s" spellcheck="false"><code>-T</code></span><span class="md-plain"> para mostrar el tiempo que cada llamada al sistema tarda en completarse, útil para detectar cuellos de botella:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-T</span> nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">8. Resumen de estadísticas</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Para obtener un resumen de estadísticas al final de la ejecución, usa </span><span class="md-pair-s" spellcheck="false"><code>-c</code></span><span class="md-plain">. Esto muestra cuántas veces se llamó cada función, cuántos errores ocurrieron y el tiempo total.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-c</span> nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">Ejemplo práctico: Diagnosticar problemas de un programa</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Supongamos que tienes un programa llamado </span><span class="md-pair-s" spellcheck="false"><code>mi_programa</code></span><span class="md-plain"> que está experimentando problemas de rendimiento y fallos ocasionales. Podrías:</span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Ejecutar con strace</span></strong></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-o</span> salida.log mi_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Revisar el archivo de salida</span></strong></span><span class="md-plain"> en busca de errores comunes (</span><span class="md-pair-s" spellcheck="false"><code>ENOENT</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>EACCES</code></span><span class="md-plain">, etc.) usando </span><span class="md-pair-s" spellcheck="false"><code>grep</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-builtin">grep</span> <span class="cm-string">"ENOENT"</span> salida.log</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Analizar las llamadas al sistema más lentas</span></strong></span><span class="md-plain"> para detectar cuellos de botella:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-T</span> <span class="cm-attribute">-o</span> salida_tiempos.log mi_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Revisar las estadísticas de llamadas al sistema</span></strong></span><span class="md-plain"> para ver si alguna se ejecuta inusualmente a menudo o consume demasiado tiempo:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-c</span> mi_programa</span></pre>
</li>
</ol>
<h2 class="md-end-block md-heading md-focus"><span class="md-plain">Resumen final</span></h2>
<p class="md-end-block md-p md-focus"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain md-expand"> es una herramienta poderosa que permite ver la interacción de un programa con el sistema operativo en un nivel profundo. Utilizando filtros y analizando cuidadosamente la salida, puedes identificar problemas de permisos, archivos inexistentes, problemas de red y cuellos de botella de rendimiento.</span></p>
<p>La entrada <a href="https://aprendeit.com/guia-basica-para-utilizar-strace/">Guía Básica para Utilizar strace</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/guia-basica-para-utilizar-strace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo crear un servicio VPN con Wireguard</title>
		<link>https://aprendeit.com/como-crear-un-servicio-vpn-con-wireguard/</link>
					<comments>https://aprendeit.com/como-crear-un-servicio-vpn-con-wireguard/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Sun, 25 Aug 2024 17:30:09 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6545</guid>

					<description><![CDATA[<p>Parte 1: Configuración del Servidor WireGuard en Ubuntu 1. Actualización del Servidor Primero, asegúrate de que el servidor Ubuntu esté actualizado. Ejecutar en el servidor: sudo apt update &#38;&#38; sudo ...</p>
<p>La entrada <a href="https://aprendeit.com/como-crear-un-servicio-vpn-con-wireguard/">Cómo crear un servicio VPN con Wireguard</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Parte 1: Configuración del Servidor WireGuard en Ubuntu</h2>
<h3>1. Actualización del Servidor</h3>
<p>Primero, asegúrate de que el servidor Ubuntu esté actualizado.</p>
<p>Ejecutar en el servidor:</p>
<p>sudo apt update &amp;&amp; sudo apt upgrade -y</p>
<h3>2. Instalación de WireGuard</h3>
<p>Instala WireGuard en el servidor.</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo apt install wireguard -y</pre>
<h3>3. Generación de Llaves del Servidor</h3>
<p>Genera las claves privadas y públicas del servidor.</p>
<p>Ejecutar en el servidor:</p>
<pre>wg genkey | tee /etc/wireguard/server_private.key | wg pubkey &gt; /etc/wireguard/server_public.key</pre>
<h3>4. Configuración del Servidor WireGuard</h3>
<p>Crea el archivo de configuración de WireGuard para el servidor.</p>
<p>Ejecutar en el servidor:</p>
<pre>vim /etc/wireguard/wg0.conf</pre>
<p>Agrega el siguiente contenido al archivo wg0.conf:</p>
<pre>[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = 

# Habilitar NAT e IP Forwarding
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; echo 1 &gt; /proc/sys/net/ipv4/ip_forward
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; echo 0 &gt; /proc/sys/net/ipv4/ip_forward

# Guardar configuración entre reinicios (opcional)
SaveConfig = true
</pre>
<p>Reemplaza con la clave privada del servidor generada previamente:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo cat /etc/wireguard/server_private.key</pre>
<h3>5. Habilitación y Arranque de WireGuard</h3>
<p>Activa y arranca el servicio WireGuard.</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
</pre>
<h3>6. Verificación del Estado del Servidor WireGuard</h3>
<p>Comprueba que WireGuard esté funcionando correctamente.</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo wg
</pre>
<h2>Parte 2: Configuración de los Clientes WireGuard</h2>
<h3>1. Generación de Llaves del Cliente</h3>
<p>Genera las claves privadas y públicas del cliente.</p>
<p>Ejecutar en el servidor:</p>
<pre>wg genkey | tee /etc/wireguard/client1_private.key | wg pubkey &gt; /etc/wireguard/client1_public.key</pre>
<h3>2. Añadir la Configuración del Cliente en el Servidor</h3>
<p>Edita el archivo de configuración del servidor para añadir al cliente.</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo vim /etc/wireguard/wg0.conf
</pre>
<p>Agrega el siguiente bloque al final del archivo:</p>
<pre>[Peer]
PublicKey = 
AllowedIPs = 10.0.0.2/32
</pre>
<p>Reemplaza con la clave pública del cliente que generaste:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo cat /etc/wireguard/client1_public.key</pre>
<h3>3. Creación del Archivo de Configuración del Cliente</h3>
<p>Crea el archivo de configuración del cliente.</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo nano /etc/wireguard/client1.conf</pre>
<p>Agrega el siguiente contenido al archivo client1.conf:</p>
<pre>[Interface]
PrivateKey = 
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = 
Endpoint = :51820
AllowedIPs = 0.0.0.0/0
</pre>
<p>Reemplaza con la clave privada del cliente:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo cat /etc/wireguard/client1_private.key</pre>
<p>Reemplaza con la clave pública del servidor:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo cat /etc/wireguard/server_public.key</pre>
<p>Reemplaza con la dirección IP pública del servidor.</p>
<h3>4. Generación de un Código QR para el Cliente</h3>
<p>WireGuard permite que los clientes móviles configuren fácilmente la VPN mediante un código QR.</p>
<p>Instala la herramienta qrencode en el servidor:</p>
<pre>sudo apt install qrencode -y</pre>
<p>Genera el código QR para la configuración del cliente:</p>
<p>Ejecutar en el servidor:</p>
<pre>qrencode -t ansiutf8 &lt; /etc/wireguard/client1.conf</pre>
<p>Este comando generará un código QR en la terminal que el cliente puede escanear con su aplicación WireGuard en Android o iOS.</p>
<h3>5. Instalación y Configuración de WireGuard en el Cliente</h3>
<p>Instala WireGuard en el dispositivo cliente:</p>
<h4>Linux:</h4>
<p>Ejecutar en el cliente:</p>
<pre>sudo apt update &amp;&amp; sudo apt install wireguard resolvconf iptables -y</pre>
<h4>Windows/Mac:</h4>
<p>Descarga e instala la aplicación WireGuard desde el sitio oficial: https://www.wireguard.com/install/</p>
<h4>Android/iOS:</h4>
<p>Descarga la aplicación WireGuard desde Google Play Store o Apple App Store.</p>
<h3>Configura WireGuard en el cliente:</h3>
<h4>Para Linux/Windows/Mac:</h4>
<p>Importa el archivo de configuración client1.conf en la aplicación WireGuard.</p>
<p>Para dispositivos que no pueden usar un código QR, transfiere el archivo de configuración client1.conf al dispositivo cliente.</p>
<p>Una opción puede ser ejecutar desde el servidor el siguiente SCP si el servidor tiene acceso por SSH al cliente:</p>
<pre>scp /etc/wireguard/client1.conf usuario@ip_cliente:/ruta/de/destino/</pre>
<p>El fichero debe quedar en la ruta «/etc/wireguard/wg0.conf», si has podido hacer el SCP ya lo has completado, si no puedes  hacerlo, crea el fichero directamente en esa ruta y copia el contenido.</p>
<h4>Android/iOS:</h4>
<p>Abre la aplicación WireGuard y escanea el código QR generado anteriormente.<br />
Conecta el Cliente a la VPN:</p>
<p>En la aplicación WireGuard del cliente, activa la conexión.</p>
<h3>6. Verificación de la Conexión</h3>
<p>Una vez conectado, prueba la conexión:</p>
<p>Ejecutar en el cliente:</p>
<pre>ping 10.0.0.1
</pre>
<p>Esto debería devolver respuestas del servidor, indicando que la conexión VPN está funcionando correctamente.</p>
<h2>Parte 3: Mantenimiento y Gestión</h2>
<h3>1. Añadir Más Clientes</h3>
<p>Para añadir más clientes, simplemente repite los pasos de la Parte 2 para generar nuevas llaves, configurar nuevos pares en el servidor, y crear archivos de configuración para cada cliente.</p>
<h3>2. Reiniciar el Servicio WireGuard</h3>
<p>Si realizas cambios en la configuración del servidor, asegúrate de reiniciar el servicio:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo systemctl restart wg-quick@wg0
</pre>
<h3>3. Monitoreo del Estado de la VPN</h3>
<p>Puedes verificar el estado de los pares conectados y sus estadísticas:</p>
<p>Ejecutar en el servidor:</p>
<pre>sudo wg show
</pre>
<h2>Vídeo</h2>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/ER_QOOipuk8?si=J15bV93CnUGj9A5X" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Esto te proporcionará información sobre los clientes conectados y el tráfico que están generando.</p>
<p>Siguiendo esta guía paso a paso, deberías poder configurar un servidor WireGuard en Ubuntu y conectar clientes de manera sencilla, incluyendo la opción de usar un código QR para la configuración en dispositivos móviles.</p>
<p>La entrada <a href="https://aprendeit.com/como-crear-un-servicio-vpn-con-wireguard/">Cómo crear un servicio VPN con Wireguard</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-crear-un-servicio-vpn-con-wireguard/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</title>
		<link>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/</link>
					<comments>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Mon, 19 Aug 2024 14:14:49 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6433</guid>

					<description><![CDATA[<p>En el mundo de la administración de sistemas, es común encontrarse con la necesidad de automatizar tareas a través de shell scripts. Sin embargo, a veces necesitamos hacer que estos ...</p>
<p>La entrada <a href="https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/">Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En el mundo de la administración de sistemas, es común encontrarse con la necesidad de automatizar tareas a través de shell scripts. Sin embargo, a veces necesitamos hacer que estos scripts sean interactivos para facilitar la experiencia del usuario, especialmente en entornos donde no se dispone de una interfaz gráfica completa. Aquí es donde entran en juego herramientas como Dialog y Whiptail.</p>
<p>Tanto Dialog como Whiptail son herramientas que permiten crear interfaces gráficas simples y funcionales dentro de un terminal de texto. Estas herramientas son muy útiles para desarrollar menús, cuadros de diálogo, listas de selección, barras de progreso y mucho más. A lo largo de este artículo, te guiaremos a través de los conceptos básicos y ejemplos prácticos de ambas herramientas para que puedas utilizarlas en tus propios scripts.</p>
<h2>¿Qué es Dialog?</h2>
<p>Dialog es una herramienta de línea de comandos utilizada para generar cuadros de diálogo interactivos en terminales basados en texto. Es ampliamente utilizada en scripts de shell para crear menús interactivos, cuadros de confirmación, formularios, barras de progreso, entre otros.<br />
Dialog permite a los usuarios interactuar con un script a través de una interfaz de usuario basada en texto, lo que es especialmente útil en entornos de servidores donde no se dispone de una interfaz gráfica completa.</p>
<h2>Instalación de Dialog</h2>
<p>Para instalar Dialog en una distribución basada en Debian o Ubuntu, simplemente ejecuta el siguiente comando:</p>
<pre>sudo apt-get update
sudo apt-get install dialog
</pre>
<p>Para distribuciones basadas en Red Hat como CentOS o Fedora:</p>
<pre>sudo yum install dialog
</pre>
<h2>Ejemplos básicos de Dialog</h2>
<h3>Cuadro de mensaje simple</h3>
<p>Este ejemplo muestra un cuadro de mensaje simple que solo tiene un botón «OK»:</p>
<pre>#!/bin/bash
dialog --title "Mensaje" --msgbox "Hola, este es un cuadro de mensaje simple." 6 50
Explicación: En este script, --title define el título del cuadro de diálogo, --msgbox es el tipo de diálogo utilizado, "6 50" son las dimensiones del cuadro (6 líneas de alto y 50 caracteres de ancho).
</pre>
<h3>Menú interactivo</h3>
<p>El siguiente ejemplo crea un menú donde el usuario puede seleccionar una opción:</p>
<pre>#!/bin/bash
opcion=$(dialog --title "Menú Principal" --menu "Selecciona una opción:" 15 50 4
1 "Opción 1"
2 "Opción 2"
3 "Opción 3"
4 "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Has seleccionado la opción: $opcion"
</pre>
<p>Explicación: El menú se muestra con opciones numeradas. 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3 se utiliza para redirigir la selección del usuario de vuelta a la salida estándar.</p>
<h3>Lista de selección</h3>
<p>En este ejemplo, el usuario puede seleccionar uno o más elementos de una lista:</p>
<pre>#!/bin/bash
opciones=$(dialog --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5
1 "Apache" off
2 "MySQL" off
3 "PHP" off
4 "Python" off
5 "Java" off 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Paquetes seleccionados: $opciones"
</pre>
<p>Explicación: &#8211;checklist crea una lista de elementos con casillas de verificación, donde off indica que la casilla está desmarcada por defecto.</p>
<h3>Barra de progreso</h3>
<p>Las barras de progreso son útiles para mostrar el avance de una tarea. Aquí tienes un ejemplo:</p>
<pre>#!/bin/bash
{
for ((i = 0 ; i &lt;= 100 ; i+=10)); do
sleep 1
echo $i
done
} | dialog --title "Progreso" --gauge "Instalando..." 10 70 0
</pre>
<p>Explicación: &#8211;gauge se utiliza para crear una barra de progreso. El bucle for simula el avance de una tarea, incrementando la barra en un 10% cada segundo.</p>
<h2>¿Qué es Whiptail?</h2>
<p>Whiptail es una alternativa ligera a Dialog que también permite crear interfaces interactivas basadas en texto en scripts de shell. Aunque Whiptail ofrece un conjunto similar de funciones, es especialmente útil en sistemas donde Dialog no está disponible o donde se prefiere una herramienta más liviana.<br />
Instalación de Whiptail</p>
<p>Para instalar Whiptail en Debian, Ubuntu y sus derivados:</p>
<pre>sudo apt-get update
sudo apt-get install whiptail
</pre>
<p>En distribuciones como CentOS, Red Hat y Fedora:</p>
<pre>sudo yum install newt
</pre>
<h2>Ejemplos básicos de Whiptail</h2>
<h3>Cuadro de mensaje simple</h3>
<p>Al igual que con Dialog, puedes crear un cuadro de mensaje simple:</p>
<pre>#!/bin/bash

whiptail --title "Mensaje" --msgbox "Este es un mensaje simple usando Whiptail." 8 45
</pre>
<p>Explicación: Este ejemplo es similar al de Dialog, pero utilizando Whiptail. Las dimensiones del cuadro son ligeramente diferentes.</p>
<h3>Menú interactivo</h3>
<p>Crear menús interactivos es sencillo con Whiptail:</p>
<pre>#!/bin/bash

opcion=$(whiptail --title "Menú Principal" --menu "Elige una opción:" 15 50 4 \
"1" "Opción 1" \
"2" "Opción 2" \
"3" "Opción 3" \
"4" "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Has elegido la opción: $opcion"
</pre>
<p>Explicación: Este script funciona de manera similar al ejemplo de Dialog, permitiendo al usuario seleccionar una opción de un menú.</p>
<h3>Lista de selección</h3>
<p>Whiptail también permite crear listas de selección con casillas de verificación:</p>
<pre>#!/bin/bash

opciones=$(whiptail --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5 \
"Apache" "" ON \
"MySQL" "" OFF \
"PHP" "" OFF \
"Python" "" OFF \
"Java" "" OFF 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Paquetes seleccionados: $opciones"
</pre>
<p>Explicación: En este ejemplo, «ON» indica que la casilla de verificación está marcada por defecto, a diferencia del «off» de Dialog.</p>
<h3>Barra de progreso</h3>
<p>Finalmente, aquí tienes un ejemplo de una barra de progreso con Whiptail:</p>
<pre>#!/bin/bash

{
    for ((i = 0 ; i &lt;= 100 ; i+=10)); do
        sleep 1
        echo $i
    done
} | whiptail --gauge "Instalando..." 6 50 0
</pre>
<p>Explicación: Este ejemplo es muy similar al de Dialog, pero usando la sintaxis de Whiptail.</p>
<p>Tanto Dialog como Whiptail son herramientas poderosas y flexibles que permiten a los administradores de sistemas y desarrolladores crear interfaces de usuario interactivas dentro de un terminal. Aunque ambas herramientas son similares en funcionalidad, la elección entre una u otra puede depender de las necesidades específicas del sistema y las preferencias personales.</p>
<p>Dialog es más popular y ampliamente documentado, mientras que Whiptail es una alternativa más ligera que puede ser preferida en sistemas donde la minimización del uso de recursos es crucial.</p>
<p>En este artículo, hemos cubierto los conceptos básicos de Dialog y Whiptail con ejemplos prácticos que te permitirán comenzar a crear tus propios scripts interactivos. Ya sea que necesites un menú simple, un cuadro de mensaje o una barra de progreso, estas herramientas te proporcionarán las funcionalidades necesarias para mejorar la interacción de los usuarios con tus scripts.</p>
<p>Recuerda que la clave para dominar estas herramientas es la práctica. Prueba los ejemplos proporcionados, modifícalos para adaptarlos a tus necesidades, y continúa explorando las múltiples posibilidades que Dialog y Whiptail ofrecen para hacer que tus scripts sean más intuitivos y fáciles de usar.</p>
<h2>Video</h2>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/bYXiE2THyHw?si=vGFVDr6SMaeTa4O9" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h2>Script del video</h2>
<p>A continuación pongo dos scripts de ejemplo de dos menús interactivos:</p>
<p><strong>Dialog</strong></p>
<pre>#!/bin/bash

# Ejemplo de menú usando Dialog
dialog --menu "Seleccione una opción:" 15 50 4 \
1 "Ver información del sistema" \
2 "Mostrar uso del disco" \
3 "Configurar red" \
4 "Salir" 2&gt;seleccion.txt

# Leer la opción seleccionada
opcion=$(cat seleccion.txt)

case $opcion in
    1)
        echo "Mostrando información del sistema..."
        # Aquí irían los comandos correspondientes
        ;;
    2)
        echo "Mostrando uso del disco..."
        # Aquí irían los comandos correspondientes
        ;;
    3)
        echo "Configurando la red..."
        # Aquí irían los comandos correspondientes
        ;;
    4)
        echo "Saliendo..."
        exit 0
        ;;
    *)
        echo "Opción no válida."
        ;;
esac
</pre>
<p>El resultado sería:</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-6448" src="https://aprendeit.com/wp-content/uploads/2024/08/dialog.png" alt="dialog" width="558" height="366" srcset="https://aprendeit.com/wp-content/uploads/2024/08/dialog.png 558w, https://aprendeit.com/wp-content/uploads/2024/08/dialog-300x197.png 300w, https://aprendeit.com/wp-content/uploads/2024/08/dialog-100x66.png 100w" sizes="(max-width: 558px) 100vw, 558px" /></p>
<p><strong>Whiptail</strong></p>
<pre>#!/bin/bash

# Ejemplo de menú usando Whiptail
opcion=$(whiptail --title "Menú Principal" --menu "Seleccione una opción:" 15 50 4 \
"1" "Ver información del sistema" \
"2" "Mostrar uso del disco" \
"3" "Configurar red" \
"4" "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

# Verificar la opción seleccionada
case $opcion in
    1)
        echo "Mostrando información del sistema..."
        # Aquí irían los comandos correspondientes
        ;;
    2)
        echo "Mostrando uso del disco..."
        # Aquí irían los comandos correspondientes
        ;;
    3)
        echo "Configurando la red..."
        # Aquí irían los comandos correspondientes
        ;;
    4)
        echo "Saliendo..."
        exit 0
        ;;
    *)
        echo "Opción no válida."
        ;;
esac
</pre>
<p>Con whiptail el resultado sería este otro:</p>
<p><img decoding="async" class="alignnone size-full wp-image-6449" src="https://aprendeit.com/wp-content/uploads/2024/08/whiptail.png" alt="whiptail" width="675" height="421" srcset="https://aprendeit.com/wp-content/uploads/2024/08/whiptail.png 675w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-300x187.png 300w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-100x62.png 100w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-480x300.png 480w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-640x400.png 640w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>Como se puede ver, los resultados son muy parecidos.</p>
<h2>Referencias y documentación</h2>
<p>Para dialog y whiptail podemos encontrar una amplia documentación en <a href="https://invisible-island.net/dialog/dialog.html" target="_blank" rel="noopener">https://invisible-island.net/dialog/dialog.html</a></p>
<p>La entrada <a href="https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/">Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como Proteger tu Sistema Linux: Guía Definitiva para Instalar y Usar RKHunter</title>
		<link>https://aprendeit.com/como-proteger-tu-sistema-linux-guia-definitiva-para-instalar-y-usar-rkhunter/</link>
					<comments>https://aprendeit.com/como-proteger-tu-sistema-linux-guia-definitiva-para-instalar-y-usar-rkhunter/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Mon, 10 Jun 2024 11:49:30 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6287</guid>

					<description><![CDATA[<p>En este artículo, vamos a explorar cómo instalar y configurar RKHunter (Rootkit Hunter) en un sistema Linux. RKHunter es una herramienta esencial para la seguridad de cualquier servidor, ya que ...</p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-sistema-linux-guia-definitiva-para-instalar-y-usar-rkhunter/">Como Proteger tu Sistema Linux: Guía Definitiva para Instalar y Usar RKHunter</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En este artículo, vamos a explorar cómo instalar y configurar RKHunter (Rootkit Hunter) en un sistema Linux. RKHunter es una herramienta esencial para la seguridad de cualquier servidor, ya que permite detectar rootkits, backdoors y exploits locales en sistemas UNIX. Vamos a detallar cada paso, desde la instalación hasta la configuración y la programación de escaneos automáticos. Este tutorial está diseñado para usuarios con conocimientos básicos de administración de sistemas Linux.</p>
<h2>Instalación de RKHunter</h2>
<h3>Paso 1: Actualizar los Repositorios</h3>
<p>Antes de instalar cualquier paquete nuevo, siempre es una buena práctica asegurarse de que los repositorios del sistema estén actualizados. Esto se puede hacer con el comando apt update.</p>
<pre>apt update</pre>
<h3>Paso 2: Instalar RKHunter</h3>
<p>Una vez que los repositorios estén actualizados, podemos proceder a instalar RKHunter junto con las herramientas básicas del sistema (coreutils).</p>
<pre>apt install coreutils rkhunter -y</pre>
<h3>Paso 3: Descargar los Repositorios de la Base de Datos de RKHunter</h3>
<p>Para que RKHunter funcione correctamente, necesitamos descargar los datos necesarios. Esto se puede hacer con el comando curl.</p>
<pre>curl https://rkhunter.sourceforge.net/1.4/mirrors.dat &gt; /var/lib/rkhunter/db/mirrors.dat</pre>
<h3>Configuración de RKHunter</h3>
<h4>Problema Común: No se Puede Actualizar</h4>
<p>Si intentamos actualizar RKHunter inmediatamente después de la instalación, es probable que encontremos un error similar al siguiente:</p>
<pre>root@host# rkhunter --update
[ Rootkit Hunter version 1.4.6 ]

Checking rkhunter data files...
  Checking file mirrors.dat                                  [ Skipped ]
  Checking file programs_bad.dat                             [ Update failed ]
  Checking file backdoorports.dat                            [ Update failed ]
  Checking file suspscan.dat                                 [ Update failed ]
  Checking file i18n versions                                [ Update failed ]

Please check the log file (/var/log/rkhunter.log)
</pre>
<h4>Solución: Editar el Archivo de Configuración</h4>
<p>Para solucionar este problema, necesitamos editar el archivo de configuración de RKHunter (/etc/rkhunter.conf). Usaremos vi o cualquier otro editor de texto que prefiramos.</p>
<pre>vi /etc/rkhunter.conf
</pre>
<p>Dentro del archivo, modificamos los siguientes parámetros:</p>
<pre>PKGMGR=DPKG
WEB_CMD=wget
UPDATE_MIRRORS=1
MIRRORS_MODE=0
</pre>
<h2>Actualización de RKHunter</h2>
<p>Después de realizar estos cambios, podemos intentar actualizar RKHunter nuevamente.</p>
<pre>rkhunter --update</pre>
<p>Si todo ha ido bien, deberíamos ver un mensaje indicando que los archivos se han actualizado correctamente.</p>
<h2>Verificación de la Versión</h2>
<p>Podemos verificar que estamos utilizando la versión más reciente de RKHunter con el siguiente comando:</p>
<pre>rkhunter --versioncheck</pre>
<h2>Realizar un Escaneo del Sistema</h2>
<p>Una vez que RKHunter esté configurado y actualizado, podemos proceder a realizar un escaneo completo del sistema.</p>
<pre>rkhunter --check</pre>
<p>Ejemplo de Salida de un Escaneo<br />
Durante el escaneo, RKHunter verificará varios aspectos del sistema, incluyendo comandos del sistema, bibliotecas compartidas, y archivos sospechosos. Aquí hay un ejemplo de lo que podríamos ver:</p>
<pre>[ Rootkit Hunter version 1.4.6 ]

Checking system commands...

  Performing 'strings' command checks
    Checking 'strings' command                               [ OK ]

  Performing 'shared libraries' checks
    Checking for preloading variables                        [ None found ]
    Checking for preloaded libraries                         [ None found ]
    Checking LD_LIBRARY_PATH variable                        [ Not found ]

  Performing file properties checks
    Checking for prerequisites                               [ OK ]
    /usr/sbin/adduser                                        [ OK ]
    /usr/sbin/chroot                                         [ OK ]
    /usr/sbin/cron                                           [ OK ]
    /usr/sbin/depmod                                         [ OK ]
    /usr/sbin/fsck                                           [ OK ]
    /usr/sbin/groupadd                                       [ OK ]
    /usr/sbin/groupdel                                       [ OK ]
    /usr/sbin/groupmod                                       [ OK ]
    /usr/sbin/grpck                                          [ OK ]
    /usr/sbin/ifconfig                                       [ OK ]
    /usr/sbin/init                                           [ OK ]
    /usr/sbin/insmod                                         [ OK ]
    /usr/sbin/ip                                             [ OK ]
    /usr/sbin/lsmod                                          [ OK ]
    /usr/sbin/modinfo                                        [ OK ]
    /usr/sbin/modprobe                                       [ OK ]
    /usr/sbin/nologin                                        [ OK ]
    /usr/sbin/pwck                                           [ OK ]
    /usr/sbin/rmmod                                          [ OK ]
    /usr/sbin/route                                          [ OK ]
    /usr/sbin/rsyslogd                                       [ OK ]
    /usr/sbin/runlevel                                       [ OK ]
    /usr/sbin/sshd                                           [ OK ]
    /usr/sbin/sulogin                                        [ OK ]
    /usr/sbin/sysctl                                         [ OK ]
    /usr/sbin/useradd                                        [ OK ]
    /usr/sbin/userdel                                        [ OK ]
    /usr/sbin/usermod                                        [ OK ]
    /usr/sbin/vipw                                           [ OK ]
    /usr/sbin/unhide                                         [ OK ]
    /usr/sbin/unhide-linux                                   [ OK ]
    /usr/sbin/unhide-posix                                   [ OK ]
    /usr/sbin/unhide-tcp                                     [ OK ]
    /usr/bin/awk                                             [ OK ]
    /usr/bin/basename                                        [ OK ]
    /usr/bin/bash                                            [ OK ]
    /usr/bin/cat                                             [ OK ]
    /usr/bin/chattr                                          [ OK ]
    /usr/bin/chmod                                           [ OK ]
    /usr/bin/chown                                           [ OK ]
    /usr/bin/cp                                              [ OK ]
    /usr/bin/curl                                            [ OK ]
    /usr/bin/cut                                             [ OK ]
    /usr/bin/date                                            [ OK ]
    /usr/bin/df                                              [ OK ]
    /usr/bin/diff                                            [ OK ]
    /usr/bin/dirname                                         [ OK ]
    /usr/bin/dmesg                                           [ OK ]
    /usr/bin/dpkg                                            [ OK ]
    /usr/bin/dpkg-query                                      [ OK ]
    /usr/bin/du                                              [ OK ]
    /usr/bin/echo                                            [ OK ]
    /usr/bin/ed                                              [ OK ]
    /usr/bin/egrep                                           [ OK ]
    /usr/bin/env                                             [ OK ]
    /usr/bin/fgrep                                           [ OK ]
    /usr/bin/file                                            [ OK ]
    /usr/bin/find                                            [ OK ]
    /usr/bin/fuser                                           [ OK ]
    /usr/bin/grep                                            [ OK ]
    /usr/bin/groups                                          [ OK ]
    /usr/bin/head                                            [ OK ]
    /usr/bin/id                                              [ OK ]
    /usr/bin/ip                                              [ OK ]
    /usr/bin/ipcs                                            [ OK ]
    /usr/bin/kill                                            [ OK ]
    /usr/bin/killall                                         [ OK ]
    /usr/bin/last                                            [ OK ]
    /usr/bin/lastlog                                         [ OK ]
    /usr/bin/ldd                                             [ OK ]
    /usr/bin/less                                            [ OK ]
    /usr/bin/logger                                          [ OK ]
    /usr/bin/login                                           [ OK ]
    /usr/bin/ls                                              [ OK ]
    /usr/bin/lsattr                                          [ OK ]
    /usr/bin/lsmod                                           [ OK ]
    /usr/bin/lsof                                            [ OK ]
    /usr/bin/mail                                            [ OK ]
    /usr/bin/md5sum                                          [ OK ]
    /usr/bin/mktemp                                          [ OK ]
    /usr/bin/more                                            [ OK ]
    /usr/bin/mount                                           [ OK ]
    /usr/bin/mv                                              [ OK ]
    /usr/bin/netstat                                         [ OK ]
    /usr/bin/newgrp                                          [ OK ]
    /usr/bin/passwd                                          [ OK ]
    /usr/bin/perl                                            [ OK ]
    /usr/bin/pgrep                                           [ OK ]
    /usr/bin/ping                                            [ OK ]
    /usr/bin/pkill                                           [ OK ]
    /usr/bin/ps                                              [ OK ]
    /usr/bin/pstree                                          [ OK ]
    /usr/bin/pwd                                             [ OK ]
    /usr/bin/readlink                                        [ OK ]
    /usr/bin/rkhunter                                        [ OK ]
    /usr/bin/runcon                                          [ OK ]
    /usr/bin/sed                                             [ OK ]
    /usr/bin/sh                                              [ OK ]
    /usr/bin/sha1sum                                         [ OK ]
    /usr/bin/sha224sum                                       [ OK ]
    /usr/bin/sha256sum                                       [ OK ]
    /usr/bin/sha384sum                                       [ OK ]
    /usr/bin/sha512sum                                       [ OK ]
    /usr/bin/size                                            [ OK ]
    /usr/bin/sort                                            [ OK ]
    /usr/bin/ssh                                             [ OK ]
    /usr/bin/stat                                            [ OK ]
    /usr/bin/strace                                          [ OK ]
    /usr/bin/strings                                         [ OK ]
    /usr/bin/su                                              [ OK ]
    /usr/bin/sudo                                            [ OK ]
    /usr/bin/tail                                            [ OK ]
    /usr/bin/telnet                                          [ OK ]
    /usr/bin/test                                            [ OK ]
    /usr/bin/top                                             [ OK ]
    /usr/bin/touch                                           [ OK ]
    /usr/bin/tr                                              [ OK ]
    /usr/bin/uname                                           [ OK ]
    /usr/bin/uniq                                            [ OK ]
    /usr/bin/users                                           [ OK ]
    /usr/bin/vmstat                                          [ OK ]
    /usr/bin/w                                               [ OK ]
    /usr/bin/watch                                           [ OK ]
    /usr/bin/wc                                              [ OK ]
    /usr/bin/wget                                            [ OK ]
    /usr/bin/whatis                                          [ OK ]
    /usr/bin/whereis                                         [ OK ]
    /usr/bin/which                                           [ OK ]
    /usr/bin/who                                             [ OK ]
    /usr/bin/whoami                                          [ OK ]
    /usr/bin/numfmt                                          [ OK ]
    /usr/bin/kmod                                            [ OK ]
    /usr/bin/systemd                                         [ OK ]
    /usr/bin/systemctl                                       [ OK ]
    /usr/bin/gawk                                            [ OK ]
    /usr/bin/bsd-mailx                                       [ OK ]
    /usr/bin/dash                                            [ OK ]
    /usr/bin/x86_64-linux-gnu-size                           [ OK ]
    /usr/bin/x86_64-linux-gnu-strings                        [ OK ]
    /usr/bin/telnet.netkit                                   [ OK ]
    /usr/bin/which.debianutils                               [ OK ]
    /usr/lib/systemd/systemd                                 [ OK ]

[Press  to continue]

...

[Press  to continue]

System checks summary
=====================

File properties checks...
    Files checked: 142
    Suspect files: 0

Rootkit checks...
    Rootkits checked : 498
    Possible rootkits: 0

Applications checks...
    All checks skipped

The system checks took: 4 minutes and 25 seconds

All results have been written to the log file: /var/log/rkhunter.log

One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter.log)
</pre>
<h2>Automatización de Escaneos con Cron</h2>
<p>Para asegurarnos de que nuestro sistema se mantenga seguro, es una buena idea programar escaneos automáticos. Podemos hacer esto editando el archivo /etc/crontab para añadir los trabajos cron necesarios. No olvidemos modificar el correo de destino para recibir las alertas.</p>
<pre>vi /etc/crontab</pre>
<p>Añadimos las siguientes líneas al archivo:</p>
<pre>0 3 * * * root /usr/bin/rkhunter --update &gt;&gt; /var/log/rkhunter_update.log 2&gt;&amp;1
0 2 * * * root /usr/bin/rkhunter --cronjob --update --report-warnings-only | mail -s "RKHunter Daily Scan" tu-email@example.com
</pre>
<p>Con esto, hemos configurado un trabajo cron que actualizará RKHunter diariamente a las 3 AM y realizará un escaneo diario a las 2 AM, enviando un informe por correo electrónico solo si se encuentran advertencias.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/XLwq1cwujHk?si=vOkPHC-ljvYviHMx" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-sistema-linux-guia-definitiva-para-instalar-y-usar-rkhunter/">Como Proteger tu Sistema Linux: Guía Definitiva para Instalar y Usar RKHunter</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-proteger-tu-sistema-linux-guia-definitiva-para-instalar-y-usar-rkhunter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo crear tu Propio Chatbot de IA con Ollama y Open-WebUI</title>
		<link>https://aprendeit.com/como-crear-tu-propio-chatbot-de-ia-con-ollama-y-open-webui/</link>
					<comments>https://aprendeit.com/como-crear-tu-propio-chatbot-de-ia-con-ollama-y-open-webui/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Sun, 26 May 2024 19:54:25 +0000</pubDate>
				<category><![CDATA[Otros]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6274</guid>

					<description><![CDATA[<p>Cómo crear tu Propio Chatbot de IA con Ollama y Open-WebUI En la era digital, los chatbots de IA se están convirtiendo en herramientas indispensables para mejorar la experiencia del ...</p>
<p>La entrada <a href="https://aprendeit.com/como-crear-tu-propio-chatbot-de-ia-con-ollama-y-open-webui/">Cómo crear tu Propio Chatbot de IA con Ollama y Open-WebUI</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Cómo crear tu Propio Chatbot de IA con Ollama y Open-WebUI</p>
<p>En la era digital, los chatbots de IA se están convirtiendo en herramientas indispensables para mejorar la experiencia del usuario en sitios web, aplicaciones y servicios. Si alguna vez has querido crear tu propio chatbot, estás en el lugar correcto. Hoy te voy a guiar paso a paso para que puedas configurar un chatbot utilizando Ollama y Open-WebUI. Vamos a profundizar en aspectos técnicos, así que prepárate para ensuciarte las manos con algunos comandos.</p>
<h2>Instalación de Ollama sin Docker</h2>
<p>Para empezar, vamos a instalar Ollama en tu sistema sin usar Docker. Este método es ideal si prefieres no lidiar con contenedores y deseas tener un control más directo sobre la instalación.</p>
<p>Descarga e instalación de Ollama</p>
<p>El primer paso es descargar e instalar Ollama utilizando un sencillo script. Abre tu terminal y ejecuta el siguiente comando:</p>
<pre>curl https://ollama.ai/install.sh | sh</pre>
<p>Este comando descargará e instalará Ollama en tu sistema. El script se encargará de todos los detalles, así que no necesitas preocuparte por las dependencias.</p>
<h3>Iniciar el servicio de Ollama</h3>
<p>Una vez que la instalación haya finalizado, es hora de iniciar el servicio de Ollama. Esto lo haremos con el siguiente comando:</p>
<pre>systemctl start ollama</pre>
<p>Este comando inicia el servicio de Ollama, permitiendo que esté listo para ejecutar los modelos de IA.</p>
<h3>Ejecutar modelos de IA con Ollama</h3>
<p>Con Ollama instalado y el servicio en funcionamiento, el siguiente paso es ejecutar los modelos de IA. Ollama soporta varios modelos, y en este ejemplo, usaremos llama2 y mistral. Para ejecutar llama2, utiliza el siguiente comando:</p>
<pre>ollama run llama2</pre>
<p>Para ejecutar mistral, simplemente cambia el nombre del modelo en el comando:</p>
<pre>ollama run mistral</pre>
<p>Con estos comandos, tu instalación de Ollama estará ejecutando modelos de IA, listos para interactuar y responder a las consultas que le hagas.</p>
<h2>Instalación de Ollama con Docker</h2>
<p>Ahora, vamos a ver cómo instalar y configurar Ollama utilizando Docker. Este método es útil si prefieres tener un entorno más aislado y fácil de gestionar.</p>
<h3>Detener el servicio de Ollama</h3>
<p>Antes de continuar con Docker, necesitamos detener el servicio de Ollama que iniciamos anteriormente. Hazlo con el siguiente comando:</p>
<pre>systemctl stop ollama</pre>
<h3>Configuración de Ollama con Docker</h3>
<p>Con el servicio detenido, procedemos a configurar Ollama en un contenedor Docker. Ejecuta el siguiente comando para crear y ejecutar el contenedor:</p>
<pre>docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama</pre>
<p>Este comando hace lo siguiente:</p>
<ul>
<li>-d ejecuta el contenedor en segundo plano.</li>
<li>-v ollama:/root/.ollama monta un volumen para persistir los datos de Ollama.</li>
<li>-p 11434:11434 asigna el puerto 11434 del host al contenedor.</li>
<li>&#8211;name ollama nombra el contenedor como «ollama».</li>
</ul>
<h3>Ejecutar modelos de IA en Docker</h3>
<p>Con el contenedor en funcionamiento, podemos ejecutar los modelos de IA dentro del contenedor. Utiliza el siguiente comando para acceder al contenedor y ejecutar el modelo mistral:</p>
<pre>docker exec -it ollama ollama run mistral</pre>
<p>Ahora, tu instalación de Ollama dentro de Docker está lista para funcionar con modelos de IA.</p>
<h3>Levantar la Interfaz Web con Open-WebUI</h3>
<p>Para hacer que la interacción con tu chatbot de IA sea más accesible y amigable, vamos a configurar una interfaz web utilizando Open-WebUI. Esta interfaz te permitirá interactuar con tu chatbot de manera visual y sencilla.</p>
<h3>Configuración de Open-WebUI</h3>
<p>Primero, asegúrate de que Ollama esté configurado correctamente y que el contenedor esté en funcionamiento. Luego, ejecuta el siguiente comando para levantar la interfaz web:</p>
<pre>docker run -d -p 3000:8080 -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama</pre>
<p>Este comando hace lo siguiente:</p>
<ul>
<li>-d ejecuta el contenedor en segundo plano.</li>
<li>-p 3000:8080 asigna el puerto 3000 del host al puerto 8080 del contenedor.</li>
<li>-v ollama:/root/.ollama monta el volumen de Ollama.</li>
<li>-v open-webui:/app/backend/data monta un volumen para los datos de Open-WebUI.</li>
<li>&#8211;name open-webui nombra el contenedor como «open-webui».</li>
<li>&#8211;restart always asegura que el contenedor se reinicie automáticamente si se detiene.</li>
</ul>
<h3>Acceder a la Interfaz Web</h3>
<p>Con Open-WebUI en funcionamiento, puedes acceder a la interfaz web abriendo tu navegador y dirigiéndote a http://DIRECCION-DE-TU-SERVIDOR:3000</p>
<p>Aquí podrás interactuar con tu chatbot de IA de manera visual, realizar pruebas y ajustes según tus necesidades.</p>
<h3>Documentación de Ollama</h3>
<p><a href="https://github.com/ollama/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values" target="_blank" rel="noopener">Aquí</a> encontrarás información detallada sobre los parámetros válidos y sus valores, lo que te permitirá ajustar los modelos de IA para obtener los mejores resultados.</p>
<h3>Documentación de Open-WebUI</h3>
<p><a href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener">Esta guía</a> te proporcionará toda la información necesaria para personalizar la interfaz web, añadir nuevas funcionalidades y solucionar posibles problemas.</p>
<p>Pruebas y Mantenimiento<br />
Una vez que tu chatbot de IA esté en funcionamiento, es importante realizar pruebas regulares para asegurarte de que todo funcione correctamente. Interactúa con el chatbot, realiza ajustes según sea necesario y mantén el software actualizado para aprovechar las últimas mejoras y correcciones de seguridad.</p>
<p>Con esta guía, ahora tienes todo lo que necesitas para crear tu propio chatbot de IA utilizando Ollama y Open-WebUI. No dudes en experimentar y ajustar según tus necesidades. ¡Buena suerte en tu aventura de creación de chatbots!</p>
<p>La entrada <a href="https://aprendeit.com/como-crear-tu-propio-chatbot-de-ia-con-ollama-y-open-webui/">Cómo crear tu Propio Chatbot de IA con Ollama y Open-WebUI</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-crear-tu-propio-chatbot-de-ia-con-ollama-y-open-webui/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Almacenamiento en caché de páginas con Disk: Enhanced 
Carga diferida (feed)
Minified using Disk
Caché de base de datos 115/180 consultas en 0.085 segundos usando Disk

Served from: aprendeit.com @ 2026-04-01 01:35:24 by W3 Total Cache
-->