Netcat (nc) és una eina de la línia de comandes que llegeix i escriu dades a través de connexions de xarxa TCP o UDP. Pot fer de client (connectar-se a un port) o de servidor (escoltar en un port), i el que rep ho treu per la sortida estàndard. Amb aquesta idea tan senzilla serveix per a un munt de coses: comprovar si un port està obert, parlar directament amb un servei, passar un fitxer d’una màquina a una altra… Per això se la coneix com la «navalla suïssa» de les xarxes.
Quin netcat tens?
Hi ha diverses versions de netcat i no totes accepten les mateixes opcions. És la causa de la majoria d’exemples que «no funcionen»:
| Versió | On la trobaràs | Notes |
|---|---|---|
| OpenBSD netcat | Debian, Ubuntu, Raspberry Pi OS (paquet netcat-openbsd) | La més habitual; no té -e ni -c |
| Ncat (del projecte Nmap) | RHEL, Rocky, Alma, Fedora (paquet nmap-ncat) | Té -e, -c, SSL (--ssl) i control d’accés |
| Netcat tradicional | Paquet netcat-traditional a Debian | La versió original, dels anys noranta; té -e |
Ho pots comprovar amb nc -h (la primera línia diu la versió):
$ nc -h 2>&1 | head -1
OpenBSD netcat (Debian patchlevel 1.229-1)
Els exemples d’aquest post estan provats amb la versió d’OpenBSD (Debian 13) i, quan cal, t’indico la diferència amb Ncat (Rocky Linux 9).
Sintaxi
nc [opcions] host port # client: es connecta a host:port
nc -l [opcions] port # servidor: escolta en un port
Opcions més útils
| Opció | Què fa |
|---|---|
-l | Mode escolta (servidor) |
-k | En mode escolta, accepta noves connexions quan s’acaba la primera |
-u | Fa servir UDP en lloc de TCP |
-z | No envia dades: només comprova si el port respon (escaneig) |
-v | Mode detallat: diu si la connexió ha funcionat |
-n | No resol noms (ni de host ni de port) |
-w segons | Temps màxim d’espera per connectar i per a les lectures |
-N | Tanca la connexió quan s’acaba l’entrada estàndard (OpenBSD) |
-q segons | Surt aquests segons després del final de l’entrada (OpenBSD) |
-4 / -6 | Força IPv4 o IPv6 |
-p port | Port d’origen; a la versió tradicional, també el port d’escolta amb -l |
Exemples
Comprovar si un port està obert
És l’ús més habitual: saber si un servei respon sense haver d’instal·lar res més.
$ nc -zv 127.0.0.1 22
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
$ nc -zvw 2 127.0.0.1 8999
nc: connect to 127.0.0.1 port 8999 (tcp) failed: Connection refused
També pots provar un rang de ports:
$ nc -zv 127.0.0.1 20-23
nc: connect to 127.0.0.1 port 20 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 21 (tcp) failed: Connection refused
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
nc: connect to 127.0.0.1 port 23 (tcp) failed: Connection refused
Afegeix -w 2 quan provis un servidor remot: si un tallafoc descarta els paquets, sense temps d’espera nc es queda aturat una bona estona. Per a escanejos seriosos, fes servir nmap.
En UDP (-u) el resultat és poc fiable: com que UDP no té connexió, nc dona el port per obert si no rep cap error, encara que no hi hagi res escoltant.
Parlar directament amb un servei
nc envia el que escrius i mostra el que respon el servidor. Per exemple, una petició HTTP a mà:
$ printf 'HEAD / HTTP/1.1\r\nHost: www.iespai.com\r\nConnection: close\r\n\r\n' | nc -w 5 www.iespai.com 80
HTTP/1.1 301 Moved Permanently
Server: aruba-proxy
...
Va bé per veure el missatge de benvinguda d’un servidor SMTP (nc servidor 25), d’un SSH (nc servidor 22), etc. Per a serveis amb TLS (HTTPS, IMAPS…) nc no serveix: fes servir openssl s_client -connect servidor:443 o ncat --ssl.
Passar un fitxer d’una màquina a una altra
A la màquina que rep, escolta en un port i desa el que arribi:
nc -l 1234 > config_rebuda.txt
A la màquina que envia:
nc -N 192.168.0.50 1234 < config.txt
Amb la versió d’OpenBSD, -N és important: sense aquesta opció, el client no tanca la connexió en acabar el fitxer i totes dues comandes es queden esperant. Amb Ncat no cal.
Per passar un directori sencer, combina-ho amb tar:
# Qui rep
nc -l 1234 | tar -xzf -
# Qui envia
tar -czf - projecte/ | nc -N 192.168.0.50 1234
Compte: les dades viatgen sense xifrar i sense cap autenticació: qualsevol que es connecti primer al port les rebrà. Fes-ho només en una xarxa de confiança; si no, fes servir scp, sftp o rsync sobre SSH.
Un xat (o un servidor de proves) en dues línies
# Màquina A
nc -l 1234
# Màquina B
nc 192.168.0.50 1234
El que escriguis a un costat apareix a l’altre. Amb -k, el servidor continua escoltant després que el client es desconnecti, cosa útil per recollir dades de diversos enviaments:
nc -lk 1234 >> registre.txt
Redirigir un port
nc no fa reenviament de ports per si sol, però el pots combinar amb una canonada amb nom (FIFO). Això escolta al port 8080 i passa el trànsit al port 80 d’un altre servidor:
mkfifo tub
nc -l 8080 < tub | nc servidor 80 > tub
Només aguanta una connexió. Per a alguna cosa estable, fes servir socat, un túnel SSH o la configuració del tallafoc.
Compte amb -e i -c (execució de comandes)
A Internet trobaràs exemples com nc -l -p 9876 -e /bin/bash o -c /bin/bash: fan que qualsevol que es connecti al port obtingui un shell a la teva màquina, sense contrasenya. És la base de les anomenades shells inverses que fan servir els atacants.
- La versió d’OpenBSD (la de Debian i Ubuntu) no té aquestes opcions, justament per seguretat.
- Ncat sí que les té (
-eexecuta un programa,-cuna comanda amb/bin/sh), i també té--allowper limitar qui s’hi pot connectar.
No ho facis mai amb sudo ni en una màquina accessible des de fora. Per administrar una màquina a distància, la resposta és SSH.