El comando
netstat -antu
mostrará todos los puertos tcp y udp en uso. La salida se verá 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 "ESCUCHAR", significa un puerto que se está utilizando para las conexiones entrantes. Si la dirección IP en el Local Address
el campo es 0.0.0.0
significa que las conexiones entrantes se aceptarán en cualquier dirección IP asignada a una interfaz, lo que significa conexiones que se originan fuera de su máquina.
Si dijera localhost
o 127.0.0.1
solo aceptaría conexiones desde su máquina.
Además, si agrega el -p
y ejecútelo 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
Cualquier cosa que no se muestre como en uso es gratis, sin embargo, los usuarios (cuentas sin privilegios) solo pueden abrir puertos por encima de 1023.
Compilé una pequeña lista yo mismo.
Algunos de mis favoritos son:
netstat -tulpn
lsof -i -n -P
Una forma buena y confiable de verificar los puertos abiertos es usar ss
(reemplazo del obsoleto netstat
), se puede usar en un script sin requerir privilegios elevados (es decir, sudo
).
Uso:opción -l
para puertos de escucha, opción -n
para omitir la resolución de DNS y el filtro en el puerto de origen NN
:src :NN
(reemplace NN
por el puerto que desea monitorear). Para obtener más opciones, consulte man ss
ss -ln src :NN
Ejemplos:
[[email protected] ~]# ss -ln src :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
[[email protected] ~]# 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)