nc — conexiones TCP y UDP arbitrarias y escucha
SINOPSIS
nc [-46bCDdFhklNnrStUuvZz] [-I longitud] [-i intervalo] [-M ttl] [-m minttl] [-O longitud]
[-P proxy_username] [-p puerto_origen] [-q segundos] [-s dirección_origen] [-T palabra_clave] [-V tabla_de_enrutamiento]
[-W límite_de_recepción] [-w tiempo_de_espera] [-X protocolo_de_proxy] [-x dirección_de_proxy[:puerto]] [destino] [puerto]
DESCRIPCIÓN
La utilidad nc (o netcat) se utiliza para prácticamente cualquier cosa relacionada con TCP, UDP o sockets de dominio Unix. Puede abrir conexiones TCP, enviar paquetes UDP, escuchar en puertos TCP y UDP arbitrarios, realizar escaneo de puertos y manejar IPv4 e IPv6. A diferencia de telnet(1), nc funciona bien con scripts y separa los mensajes de error en la salida de error estándar en lugar de enviarlos a la salida estándar, como telnet(1) lo hace en algunos casos.
Los usos comunes incluyen:
proxies TCP simples
clientes y servidores HTTP basados en scripts
pruebas de daemon de red
un proxy SOCKS o HTTP para [ssh]({filename}../../ssh)(1)
y mucho, mucho más
Las opciones son las siguientes:
-4 Utilizar solo direcciones IPv4.
-6 Utilizar solo direcciones IPv6.
-b Permitir la transmisión.
-C Enviar CRLF como final de línea. Cada carácter de nueva línea (LF) de los datos de entrada se traduce a CR+LF antes de escribirse en el socket. Los caracteres de nueva línea que ya están precedidos por un retorno de carro (CR) no se traducen. Los datos recibidos no se ven afectados.
-D Habilitar la depuración en el socket.
-d No intentar leer desde la entrada estándar.
-F Pasar el primer socket conectado mediante sendmsg(2) a la salida estándar y salir. Esto es útil en
conjunto con -X para que nc realice la configuración de la conexión con un proxy y luego deje el
resto de la conexión a otro programa (por ejemplo, ssh(1) utilizando la opción ssh_config(5) ProxyUseFdpass). No se puede utilizar con -U.
-h Imprimir el texto de ayuda de nc y salir.
-I longitud
Especificar el tamaño del búfer de recepción TCP.
-i intervalo
Dormir durante un intervalo de segundos entre líneas de texto enviadas y recibidas. También causa un retraso entre las conexiones a múltiples puertos.
-k Cuando se completa una conexión, escuchar otra. Requiere -l. Cuando se utiliza junto con
la opción -u, el socket del servidor no está conectado y puede recibir datagramas UDP de múltiples hosts.
-l Escuchar una conexión entrante en lugar de iniciar una conexión a un host remoto.
El destino y el puerto para escuchar se pueden especificar como argumentos no opcionales, o con las opciones -s y -p respectivamente. No se puede utilizar con -x o -z. Además, cualquier tiempo de espera especificado con la opción -w se ignora.
-M ttl Establece el TTL / límite de saltos de los paquetes salientes.
-m minttl
Pide al kernel que descarte los paquetes entrantes cuyo TTL / límite de saltos esté por debajo de minttl.
-N [shutdown]({filename}../../shutdown)(2) el socket de red después del EOF en la entrada. Algunos servidores requieren esto para finalizar su trabajo.
-n No realiza la resolución de nombres de dominio. Si un nombre no se puede resolver sin DNS, se informará un error.
-O length
Especifica el tamaño del búfer de envío TCP.
-P proxy_username
Especifica un nombre de usuario para presentarlo a un servidor proxy que requiere autenticación. Si no se especifica ningún nombre de usuario, la autenticación no se intentará. La autenticación de proxy solo es compatible con los proxies HTTP CONNECT en este momento.
-p source_port
Especifica el puerto de origen que nc debe usar, sujeto a restricciones de privilegios y disponibilidad.
-q seconds
Después del EOF en stdin, espere el número de segundos especificado y luego salga. Si los segundos son negativos, espere indefinidamente (predeterminado). Especificar un número de segundos no negativo implica -N.
-r Elige los puertos de origen y/o destino de forma aleatoria en lugar de secuencialmente dentro de un rango o en el orden en que el sistema los asigna.
-S Habilita la opción RFC 2385 TCP MD5 signature.
-s sourceaddr
Establece la dirección de origen desde la que se enviarán los paquetes, lo cual es útil en máquinas con múltiples interfaces. Para los sockets de datagrama de dominio Unix, especifica el archivo de socket temporal local que se creará y utilizará para que se puedan recibir los datagramas. No se puede utilizar junto con -x.
-T keyword
Cambia el valor de la clase de tráfico IPv4 TOS / IPv6. keyword puede ser uno de critical, inetcontrol, lowcost, lowdelay, netcontrol, throughput, reliability, o uno de los puntos de código DiffServ: ef, af11 ... af43, cs0 ... cs7; o un número en formato hexadecimal o decimal.
-t Envía respuestas RFC 854 DON'T y WON'T a las solicitudes RFC 854 DO y WILL. Esto hace posible usar nc para crear scripts de sesiones telnet.
-U Utiliza sockets de dominio Unix. No se puede utilizar junto con -F o -x. En Linux, si el nombre comienza con un símbolo "@", se interpreta como un socket de espacio de nombres abstracto: el "@" inicial se reemplaza por un byte NUL antes de enlazar o conectar. Para obtener más detalles, consulte unix(7).
-u Utiliza UDP en lugar de TCP. No se puede utilizar junto con -x. Para los sockets de dominio Unix, utiliza un socket de datagrama en lugar de un socket de flujo. Si se utiliza un socket de dominio Unix, se crea un socket receptor temporal en /tmp a menos que se especifique la opción -s.
-V rtable
Establece la tabla de enrutamiento que se utilizará.
-v Produce una salida más detallada.
-W recvlimit
Termina después de recibir recvlimit paquetes de la red.
-w timeout
Las conexiones que no se pueden establecer o que están inactivas se agotan después de timeout segundos. La opción -w no tiene efecto en la opción -l, es decir, nc escuchará indefinidamente una conexión, con o sin la opción -w. El valor predeterminado es que no haya tiempo de espera.
-X proxy_protocol
Utilice proxy_protocol al comunicarse con el servidor proxy. Los protocolos admitidos son 4 (SOCKS 4, 4A (SOCKS v.4A), 5 (SOCKS v.5) y connect (proxy HTTPS). Si no se especifica el protocolo, se utiliza la versión SOCKS 5. Tenga en cuenta que el protocolo SOCKS v.4 es muy limitado y solo se puede utilizar cuando el host de destino se puede resolver a una dirección IPv4. Los otros protocolos pasan el destino como una cadena para que lo interprete el proxy remoto y no tienen esta limitación.
-x proxy_address[:port]
Conéctese al destino utilizando un proxy en proxy_address y port. Si no se especifica el puerto, se utiliza el puerto conocido para el protocolo proxy (1080 para SOCKS, 3128 para HTTPS). Se puede especificar una dirección IPv6 de forma inequívoca encerrando proxy_address entre corchetes. No se puede utilizar un proxy con ninguna de las opciones -lsuU.
-Z Modo DCCP.
-z Solo escanee los demonios que están escuchando, sin enviar ningún dato a ellos. No se puede utilizar junto con -l.
destination puede ser una dirección IP numérica o un nombre de host simbólico (a menos que se dé la opción -n). En general, se debe especificar un destino, a menos que se dé la opción -l (en cuyo caso se utiliza el host local). Para los sockets de dominio Unix, se requiere un destino y es la ruta del socket a la que se va a conectar (o a la que se va a escuchar si se da la opción -l).
port se puede especificar como un número de puerto numérico o como un nombre de servicio. Se pueden especificar rangos de puertos como números de puerto numéricos del formato nn-mm. En general, se debe especificar un puerto de destino, a menos que se dé la opción -U. Para algunas opciones, el valor 0 solicita que el sistema elija un número de puerto.
MODELO CLIENTE/SERVIDOR
Es bastante sencillo crear un modelo cliente/servidor muy básico utilizando nc. En una consola, inicie nc escuchando en un puerto específico para una conexión. Por ejemplo:
$ nc -l 1234
nc ahora está escuchando en el puerto 1234 para una conexión. En una segunda consola (o en una segunda máquina), conéctese a la máquina y al puerto en el que se está escuchando:
$ nc -N 127.0.0.1 1234
Ahora debería haber una conexión entre los puertos. Cualquier cosa que se escriba en la segunda consola se concatenará a la primera, y viceversa. Después de que se haya establecido la conexión, a nc realmente no le importa qué lado se utiliza como 'servidor' y qué lado se utiliza como 'cliente'. La conexión se puede terminar utilizando un EOF ('^D'), ya que se ha dado la opción -N.
No hay una opción -c o -e en este netcat, pero aún puede ejecutar un comando después de que se haya establecido la conexión redirigiendo los descriptores de archivo. Tenga cuidado aquí porque abrir un puerto y dejar que cualquiera se conecte y ejecute comandos arbitrarios en su sitio es PELIGROSO. Si realmente necesita hacerlo, aquí hay un ejemplo:
En el lado del 'servidor':
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
En el lado del 'cliente':
$ nc host.example.com 1234
$ (prompt de shell desde host.example.com)
Al hacer esto, se crea un FIFO en /tmp/f y se hace que nc escuche en el puerto 1234 de la dirección 127.0.0.1 en el lado del 'servidor'. Cuando un 'cliente' establece una conexión exitosa a ese puerto, /bin/sh se ejecuta en el lado del 'servidor' y se proporciona el prompt de shell al lado del 'cliente'.
Cuando se termina la conexión, nc también se cierra. Use -k si desea que siga escuchando, pero si el comando se cierra, esta opción no lo reiniciará ni mantendrá nc en ejecución. Tampoco olvide eliminar el descriptor de archivo cuando ya no lo necesite:
$ rm -f /tmp/f
TRANSFERENCIA DE DATOS
El ejemplo de la sección anterior se puede ampliar para construir un modelo básico de transferencia de datos. Cualquier información que se ingrese en un extremo de la conexión se mostrará en el otro extremo, y la entrada y salida se pueden capturar fácilmente para emular la transferencia de archivos.
Comience utilizando nc para escuchar en un puerto específico, con la salida capturada en un archivo:
$ nc -l 1234 > filename.out
Utilice una segunda máquina para conectarse al proceso de escucha de nc, proporcionándole el archivo que se va a transferir:
$ nc -N host.example.com 1234 < filename.in
Después de que se haya transferido el archivo, la conexión se cerrará automáticamente.
COMUNICACIÓN CON SERVIDORES
A veces es útil comunicarse con los servidores "manualmente" en lugar de a través de una interfaz de usuario. Puede ayudar a solucionar problemas, cuando puede ser necesario verificar qué datos está enviando un servidor en respuesta a los comandos emitidos por el cliente. Por ejemplo, para recuperar la página de inicio de un sitio web:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Tenga en cuenta que esto también muestra los encabezados enviados por el servidor web. Se pueden filtrar, utilizando una herramienta como sed(1), si es necesario.
Se pueden crear ejemplos más complejos cuando el usuario conoce el formato de las solicitudes requeridas por el servidor. Como otro ejemplo, se puede enviar un correo electrónico a un servidor SMTP utilizando:
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<_>
RCPT TO:<_>
DATA
Cuerpo del correo electrónico.
.
QUIT
EOF
ESCANEO DE PUERTOS
Puede ser útil saber qué puertos están abiertos y tienen servicios en ejecución en una máquina de destino. La opción -z se puede usar para indicarle a nc que informe sobre los puertos abiertos, en lugar de iniciar una conexión. Por lo general, es útil activar la salida detallada a stderr mediante el uso de esta opción en conjunto con la opción -v.
Por ejemplo:
$ nc -zv host.example.com 20-30
Conexión a host.example.com 22 puerto [tcp/ssh] exitosa!
Conexión a host.example.com 25 puerto [tcp/smtp] exitosa!
El rango de puertos se especificó para limitar la búsqueda a los puertos 20 a 30, y se escanea en orden ascendente (a menos que se establezca la opción -r).
También puede especificar una lista de puertos para escanear, por ejemplo:
$ nc -zv host.example.com http 20 22-23
nc: no se puede conectar a host.example.com 80 (tcp): conexión rechazada
nc: no se puede conectar a host.example.com 20 (tcp): conexión rechazada
Conexión a host.example.com puerto [tcp/ssh] exitosa!
nc: no se puede conectar a host.example.com 23 (tcp): conexión rechazada
Los puertos se escanean en el orden que se especifique (a menos que se establezca la opción -r).
Alternativamente, podría ser útil saber qué software de servidor se está ejecutando y qué versiones. Esta información a menudo se encuentra en los mensajes de saludo. Para recuperarlos, es necesario primero establecer una conexión y luego interrumpir la conexión una vez que se haya recuperado el mensaje. Esto se puede lograr especificando un tiempo de espera pequeño con la opción -w, o quizás emitiendo un comando "QUIT" al servidor:
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocolo incompatible.
220host.example.com IMS SMTP Receiver Version 0.84 Ready
EJEMPLOS
Abrir una conexión TCP al puerto 42 de host.example.com, utilizando el puerto 31337 como puerto de origen, con un tiempo de espera de 5 segundos:
$ nc -p 31337 -w 5 host.example.com 42
Abrir una conexión UDP al puerto 53 de host.example.com:
$ nc -u host.example.com 53
Abrir una conexión TCP al puerto 42 de host.example.com utilizando 10.1.2.3 como la dirección IP para el extremo local de la conexión:
$ nc -s 10.1.2.3 host.example.com 42
Crear y escuchar en un socket de flujo de dominio Unix:
$ nc -lU /var/tmp/dsocket
Conectarse al puerto 42 de host.example.com a través de un proxy HTTP en 10.2.3.4, puerto 8080. Este ejemplo también se puede utilizar con ssh(1); consulte la directiva ProxyCommand en ssh_config(5) para obtener más información.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
El mismo ejemplo de nuevo, esta vez habilitando la autenticación de proxy con el nombre de usuario "ruser" si el proxy lo requiere:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
VER TAMBIÉN
AUTORES
Implementación original por *Hobbit* <_>. Reescrito con soporte para IPv6 por Eric Jackson <_>. Modificado para el puerto de Debian por Aron Xu ⟨_⟩.
ADVERTENCIAS
El escaneo de puertos UDP utilizando la combinación de opciones -uz siempre informará del éxito independientemente del estado de la máquina de destino. Sin embargo, en conjunto con un analizador de tráfico en la máquina de destino o en un dispositivo intermedio, la combinación de opciones -uz podría ser útil para el diagnóstico de comunicaciones. Tenga en cuenta que la cantidad de tráfico UDP generado puede estar limitada ya sea por los recursos de hardware y/o la configuración.