Netcat o nc es una utilidad de red para depurar e investigar la red.
Esta utilidad se puede utilizar para crear conexiones TCP/UDP e investigarlas. El mayor uso de esta utilidad está en las secuencias de comandos en las que tenemos que lidiar con los sockets TCP/UDP.
En este artículo aprenderemos sobre el comando netcat con algunos ejemplos prácticos.
1. Netcat en una arquitectura servidor-cliente
La utilidad netcat se puede ejecutar en el modo de servidor en un puerto específico escuchando las conexiones entrantes.
$ nc -l 2389
Además, se puede usar en modo cliente intentando conectarse en el puerto (2389) recién abierto
$ nc localhost 2389
Ahora, si escribimos un texto en el lado del cliente, llega al lado del servidor. Aquí está la prueba:
$ nc localhost 2389 HI, server
En la terminal donde se ejecuta el servidor:
$ nc -l 2389 HI, server
Entonces vemos que la utilidad netcat se puede usar en la comunicación del socket del servidor del cliente.
2. Utilice Netcat para transferir archivos
La utilidad netcat también se puede utilizar para transferir archivos. En el lado del cliente, supongamos que tenemos un archivo llamado 'testfile' que contiene:
$ cat testfile hello test
y en el lado del servidor tenemos un archivo vacío 'prueba'
Ahora, ejecutamos el servidor como:
$ nc -l 2389 > test
y ejecute el cliente como:
cat testfile | nc localhost 2389
Ahora, cuando vemos el archivo 'test' al final del servidor, vemos:
$ cat test hello test
Entonces vemos que los datos del archivo se transfirieron del cliente al servidor.
3. Netcat admite tiempos de espera
Hay casos en los que no queremos que una conexión permanezca abierta para siempre. En ese caso, a través del interruptor '-w' podemos especificar el tiempo de espera en una conexión. Entonces, después de los segundos especificados junto con el indicador -w, la conexión entre el cliente y el servidor finaliza.
Servidor:
nc -l 2389
Cliente:
$ nc -w 10 localhost 2389
La conexión anterior terminaría después de 10 segundos.
NOTA:No use el indicador -w con el indicador -l en el lado del servidor, ya que en ese caso el indicador -w no causa ningún efecto y, por lo tanto, la conexión permanece abierta para siempre.
4. Netcat admite conectividad IPV6
El indicador -4 o -6 especifica qué tipo de direcciones debe usar la utilidad netcat. -4 obliga a nc a usar la dirección IPV4 mientras que -6 obliga a nc a usar la dirección IPV6.
Servidor:
$ nc -4 -l 2389
Cliente:
$ nc -4 localhost 2389
Ahora, si ejecutamos el comando netstat, vemos:
$ netstat | grep 2389 tcp 0 0 localhost:2389 localhost:50851 ESTABLISHED tcp 0 0 localhost:50851 localhost:2389 ESTABLISHED
El primer campo en el resultado anterior contendría un sufijo '6' en caso de que se utilicen las direcciones IPV6. Ya que en este caso no lo es, por lo que se establece una conexión entre servidor y cliente utilizando direcciones IPV4.
Ahora, si obligamos a nc a usar direcciones IPV6
Servidor:
$ nc -6 -l 2389
Cliente:
$ nc -6 localhost 2389
Ahora, si ejecutamos el comando netstat, vemos:
$ netstat | grep 2389 tcp6 0 0 localhost:2389 localhost:33234 ESTABLISHED tcp6 0 0 localhost:33234 localhost:2389 ESTABLISHED
Así que ahora un sufijo '6' con 'tcp' muestra que nc ahora está usando direcciones IPV6.
5. Deshabilitar lectura desde STDIN en Netcat
Esta funcionalidad se puede lograr usando la bandera -d. En el siguiente ejemplo, usamos esta bandera en el lado del cliente.
Servidor:
$ nc -l 2389
Cliente:
$ nc -d localhost 2389 Hi
El texto "Hola" no se enviará al extremo del servidor, ya que al usar la opción -d, la lectura desde la entrada estándar se ha deshabilitado.
6. Forzar al servidor de Netcat a permanecer activo
Si el cliente de netcat está conectado al servidor y luego de un tiempo el cliente se desconecta, normalmente el servidor de netcat también termina.
Servidor:
$ nc -l 2389
Cliente:
$ nc localhost 2389 ^C
Servidor:
$ nc -l 2389 $
Entonces, en el ejemplo anterior, vemos que tan pronto como el cliente se desconectó, el servidor también terminó.
Este comportamiento se puede controlar usando el indicador -k en el lado del servidor para obligar al servidor a permanecer activo incluso después de que el cliente se haya desconectado.
Servidor:
$ nc -k -l 2389
Cliente:
$ nc localhost 2389 ^C
Servidor:
$ nc -k -l 2389
Entonces vemos que al usar la opción -k, el servidor permanece activo incluso si el cliente se desconecta.
7. Configure el cliente de Netcat para permanecer activo después de EOF
El cliente de Netcat se puede configurar para permanecer activo después de recibir EOF. En un escenario normal, si el cliente nc recibe un carácter EOF, finaliza inmediatamente, pero este comportamiento también se puede controlar si se usa el indicador -q. Este indicador espera un número que represente la cantidad de segundos de espera antes de que el cliente finalice (después de recibir EOF)
El cliente debe iniciarse como:
nc -q 5 localhost 2389
Ahora, si el cliente alguna vez recibe un EOF, esperará 5 segundos antes de finalizar.
8. Usar Netcat con protocolo UDP
De forma predeterminada, todos los sockets que crea la utilidad nc son protocolos TCP, pero esta utilidad también funciona con el protocolo UDP. Para habilitar el protocolo UDP se usa el indicador -u.
Servidor:
$ nc -4 -u -l 2389
Cliente:
$ nc -4 -u localhost 2389
Ahora, tanto el servidor como el cliente están configurados para usar el protocolo UDP. Esto se puede confirmar con el siguiente comando netstat. Entonces vemos que esta conexión ahora está usando el protocolo UDP.
$ netstat | grep 2389 udp 0 0 localhost:42634 localhost:2389 ESTABLISHED