Introducción
Linux es conocido por contar con una gran cantidad de herramientas de línea de comandos útiles y consolidadas en la mayoría de las distribuciones. A menudo, los administradores de sistemas pueden realizar muchas de sus tareas utilizando las herramientas integradas sin necesidad de instalar software adicional. En esta guía, explicaremos cómo usar la herramienta netcat. Este versátil comando puede ayudarle a monitorizar, probar y enviar datos a través de conexiones de red. Netcat debería estar disponible en casi todas las distribuciones modernas de Linux. Ubuntu incluye la variante BSD de netcat, que es la que utilizaremos en esta guía. Otras versiones pueden funcionar de forma diferente u ofrecer otras opciones.
Instrucciones generales
De forma predeterminada, netcat funciona estableciendo una conexión TCP con un host remoto.
El comando más básico es:
netcat [options] host portEsto intenta iniciar una conexión TCP con el host definido en el puerto especificado. Es similar al antiguo comando telnet de Linux. Tenga en cuenta que su conexión no está completamente cifrada.
Si desea enviar un paquete UDP en lugar de iniciar una conexión TCP, puede utilizar la opción -u:
netcat -u host portPuede especificar un rango de puertos colocando un guion entre el primero y el último:
netcat host startport-endportGeneralmente esto se usa con algunas banderas adicionales.
En la mayoría de los sistemas, podemos usar netcat o nc indistintamente. Son alias del mismo comando.
Comando para usar Netcat para escanear puertos
Uno de los usos más comunes de netcat es como escáner de puertos. Aunque netcat probablemente no sea la herramienta más sofisticada para esta tarea (nmap es una mejor opción en la mayoría de los casos), puede realizar escaneos de puertos sencillos para identificar fácilmente los puertos abiertos. Para ello, especificamos un rango de puertos para escanear, como hicimos anteriormente, junto con la opción -z para realizar el escaneo en lugar de intentar iniciar una conexión.
Por ejemplo, podemos escanear todos los puertos hasta 1000 emitiendo este comando:
netcat -z -v domain.com 1-1000Junto con la opción -z, también hemos especificado la opción -v para indicarle a netcat que proporcione información más detallada.
El resultado será el siguiente:
Output
nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .
Como puede ver, esto proporciona mucha información e indica si el escaneo de cada puerto fue exitoso. Si usa un nombre de dominio, este es el formato que debe usar.
Sin embargo, si conoce la dirección IP que necesita, su escaneo será mucho más rápido. Puede usar el parámetro -n para especificar que no necesita resolver la dirección IP mediante DNS:
netcat -z -n -v 198.51.100.0 1-1000Los mensajes de retorno se envían a la salida estándar (consulte nuestro artículo sobre redirección de E/S para obtener más información). Podemos enviar mensajes de error estándar a la salida estándar, lo que nos permite filtrar los resultados con mayor facilidad.
Redirigimos el error estándar a la salida estándar usando la sintaxis bash 2>&1. Luego, filtramos los resultados con grep:
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeededOutput
Connection to 198.51.100.0 22 port [tcp/*] succeeded!Aquí, podemos ver que el único puerto abierto en el rango de 1 a 1000 en la computadora remota es el puerto 22, el puerto SSH tradicional.
Cómo comunicarse a través de NetCat
Netcat no se limita a enviar paquetes TCP y UDP. También puede escuchar conexiones y paquetes en un puerto. Esto nos permite conectar dos instancias de netcat en una relación cliente-servidor.
La distinción entre el servidor y el cliente solo es relevante durante la configuración inicial. Una vez establecida la conexión, la comunicación es exactamente la misma en ambas direcciones.
En una máquina, puedes indicarle a netcat que escuche conexiones en un puerto específico. Para ello, proporciona el parámetro -l y selecciona un puerto:
netcat -l 4444Esto le indica a Netcat que escuche conexiones TCP en el puerto 4444. Como usuario normal (no root), no puede abrir puertos por debajo de 1000 como medida de seguridad.
En el segundo servidor, podemos conectarnos a la primera máquina en el puerto que elegimos. Lo hacemos de la misma manera que antes:
netcat domain.com 4444Parecerá que no ha pasado nada. Sin embargo, ahora puedes enviar mensajes en ambos lados de la conexión y serán visibles en ambos.
Escribe un mensaje y pulsa ENTER. Aparecerá en las pantallas local y remota. Esto también funciona a la inversa.
Cuando haya terminado de enviar el mensaje, puede presionar CTRL-D para cerrar la conexión TCP.
Cómo enviar archivos a través de Netcat
Usando el ejemplo anterior, podemos hacer cosas más útiles. Al crear una conexión TCP normal, podemos transferir casi cualquier tipo de datos a través de ella. Esto no se limita a los mensajes de chat escritos por el usuario. Podemos usar este conocimiento para convertir netcat en un programa de transferencia de archivos.
Nuevamente, necesitamos elegir un punto de conexión para escuchar las conexiones. Sin embargo, en lugar de imprimir la información en pantalla, como hicimos en el ejemplo anterior, la guardaremos directamente en un archivo:
netcat -l 4444 > received_file> Este comando redirige toda la salida de netcat al nombre de archivo especificado.
En la segunda computadora, cree un archivo de texto simple escribiendo:
echo "Hello, this is a file" > original_fileAhora podemos usar este archivo como entrada para la conexión netcat que creamos con el ordenador que escucha. El archivo se transferirá tal como lo escribimos de forma interactiva:
netcat domain.com 4444 < original_filePodemos ver en la computadora que estaba esperando la conexión que ahora tenemos un nuevo archivo llamado receive_file con el contenido del archivo que escribimos en la otra computadora:
cat received_fileOutput
Hello, this is a fileComo puede ver, al vincular objetos, podemos usar esta conexión fácilmente para transferir todo tipo de cosas. Por ejemplo, podemos transferir el contenido de un directorio completo creando un archivo tar sin nombre, transfiriéndolo al sistema remoto y descomprimiéndolo en el directorio remoto.
Al final de la descarga, podemos esperar un archivo que debemos descomprimir y abrir escribiendo:
netcat -l 4444 | tar xzvf -El guión final (-) significa que tar opera con la entrada estándar, que se transmite a través de la red cuando se establece una conexión desde netcat.
Junto con el contenido del directorio que queremos transferir, podemos empaquetarlos en un tarball y luego enviarlos al ordenador remoto vía netcat:
tar -czf - * | netcat domain.com 4444En esta ocasión, el guion del comando tar significa comprimir y comprimir el contenido del directorio actual (como se indica con el asterisco (*)) y escribir el resultado en la salida estándar. A continuación, se escribe directamente a través de la conexión TCP, que se recibe en el otro extremo y se descomprime en el directorio actual del equipo remoto. Este es solo un ejemplo de una transferencia de datos más compleja de un equipo a otro. Otra idea común es usar el comando dd para tomar una imagen de un disco duro en un lado y transferirla a un equipo remoto. Sin embargo, no profundizaremos en eso aquí.
Cómo utilizar Netcat como un servidor web simple
Hemos configurado netcat para que escuche conexiones y pueda comunicarse y transferir archivos. Podemos usar el mismo concepto para usar netcat como un servidor web muy simple. Esto puede ser útil para probar las páginas que crees.
Primero, creemos un archivo HTML simple en un servidor:
nano index.htmlAquí tienes un código HTML simple que puedes usar en tu archivo:
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Level 1 header</h1>
<h2>Subheading</h2>
<p>Normal text here</p>
</body>
</html>Guarde y cierre el archivo.
Sin privilegios de root, no puede servir este archivo en el puerto web predeterminado, el puerto 80. Podemos elegir el puerto 8888 como usuario normal.
Si solo desea servir esta página una vez para comprobar cómo se representa, puede ejecutar el siguiente comando:
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888Ahora, en tu navegador, podrás acceder al contenido visitando:
http://server_IP:8888
Esto sirve la página y luego se cierra la conexión de Netcat. Si intentas recargar la página, se perderá.
Podemos hacer que netcat renderice la página indefinidamente colocando el último comando en un bucle infinito, de esta manera:
while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; doneEsto le permite seguir aceptando conexiones después de cerrar la primera. Podemos detener el bucle presionando Ctrl+C en el servidor. Esto permite ver cómo se renderizará una página en el navegador, pero no ofrece mucho más rendimiento. Nunca debería usar esto para renderizar sitios web reales. No ofrece seguridad y elementos simples como los enlaces ni siquiera funcionarán correctamente.
Resultado
A estas alturas, ya debería tener una buena idea de para qué sirve netcat. Es una herramienta versátil que puede ser útil para diagnosticar problemas y verificar el correcto funcionamiento de las funciones básicas con conexiones TCP/UDP. Con netcat, puede establecer fácilmente conexiones entre diferentes computadoras para una interacción rápida. Netcat intenta que las interacciones de red entre computadoras sean transparentes al eliminar la complejidad de establecer conexiones.










