2011-12-23 12:49:28 +0000 2011-12-23 12:49:28 +0000
31
31

¿Cómo puedo comprobar qué puertos están ocupados y qué puertos están libres en mi máquina Linux?

¿Existe algún comando de línea de comandos o alguna otra forma de encontrar y listar los números de puerto ocupados y libres en mi máquina Linux?

Odpowiedzi (4)

42
42
42
2011-12-23 13:11:39 +0000

El comando

netstat -antu

mostrará todos los puertos tcp y udp en uso. La salida será algo así

Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN

El número después de los dos puntos en el campo Dirección Local muestra el puerto en uso. Si el estado es “LISTEN” significa que es un puerto que está usando para conexiones entrantes. Si la dirección IP en el campo Local Address es 0.0.0.0 significa que las conexiones entrantes serán aceptadas en cualquier dirección IP asignada a una interfaz - por lo que esto significa de conexiones originadas fuera de su máquina.

Si dijera localhost o 127.0.0.1 sólo estaría aceptando conexiones desde su máquina.

Además, si añade el parámetro -p, y lo ejecuta como root, mostrará el proceso que abrió el puerto:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN 860/rpc.statd

Todo lo que no se muestre como en uso está libre, sin embargo los usuarios (cuentas sin privilegios) sólo pueden abrir puertos por encima de 1023.

13
13
13
2012-10-12 06:02:01 +0000

Yo mismo compilé una pequeña lista .

Algunos de mis favoritos son:

netstat -tulpn
lsof -i -n -P
7
7
7
2015-11-23 15:35:42 +0000

Una forma buena y fiable de comprobar los puertos abiertos es usar ss (reemplazo del obsoleto netstat), es utilizable en un script sin requerir privilegios elevados (es decir, sudo).

Uso: la opción -l para los puertos de escucha, la opción -n para evitar la resolución DNS, y el filtro en el puerto de origen NN: src :NN (sustituya NN por el puerto que desee supervisar). Para más opciones, consulte man ss

ss -ln src :NN

Ejemplos:

[user@server ~]# ss -ln src :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
[user@server ~]# ss -ln src :81
State Recv-Q Send-Q Local Address:Port Peer Address:Port

Y en un script, usando grep, podemos probar si la salida contiene el puerto que solicitamos. Ejemplo con el puerto 80 en uso (ver arriba):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if ["$result" -eq 1]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Ejemplo con el puerto 81 no en uso (ver arriba)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if ["$result" -eq 1]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)
3
3
3
2014-06-30 08:25:41 +0000

Otra forma:

telnet localhost <PORT_NUMBER>

Si el puerto está libre obtendrá un error. Si el puerto está en uso telnet se conectará.

(encontrado en http://www.unix.com/unix-for-dummies-questions-and-answers/8456-how-know-whether-particular-port-number-free-not.html )