Muchas veces necesitamos saber que puertos esta escuchando nuestro servidor para usar el cliente y conectar o bien para configurar nuestro firewall y así permitir las conexiones a dicho servicio o simplemente por información. Veremos como podemos consultar en nuestro sistema GNU/linux cuales puertos están siendo utilizados y que servicios o aplicaciones los están usando.
A continuación revisaremos las principales herramientas para identificar los puertos activos y las aplicaciones que los están utilizando. Para poder ejecutar estos comando es necesario tener privilegios de administrador (usuario root) o utilizar el comando sudo, anteponiéndolo a estos comandos.
Para saber que puertos esta escuchando nuestro servidor podemos consultar el archivo /etc/services en el cual se registran diferentes servicios, el puerto que usa y un pequeño comentario. Este archivo de configuración mantiene el registro de todos los puertos estándar. Por ejemplo, si queremos saber que puerto usa por defecto el servicio ssh haría:
grep -i ssh /etc/servicesLa salida del comando anterior sería:
ssh 22/tcp #Secure Shell Login
ssh 22/udp #Secure Shell Login
sshell 614/tcp #SSLshell
sshell 614/udp
x11-ssh 6010/tcp #Unofficial name, for convenience
x11-ssh 6010/udpEl problema que muchas veces el servicio no viene registrado en el archivo services o viene pero no muestra todos los puertos que en realidad escucha. En estos caso podemos utilizar otros programas como lsof o “list open files”. Entre los datos que arroja como salida este programa esta el puerto utilizado, por lo que otras maneras de averiguar el puerto/s que usa nuestra aplicación es:
lsof -n -i -P | grep '*:'Por ejemplo, si quiero saber que puestos escucha el samba haría:
sudo lsof -n -i -P | grep '*:' | grep -e nmbd -e smbdOtra manera de lograr nuestro objetivo es utilizando el comando netstat o “network statistics”, de la siguiente manera:
netstat -ltunpO si queremos el puerto de una aplicación especifica:
netstat -ltunp | grep -e smbd -e nmbdOtra manera de ver los puertos es usar un escaner que nos de la información del servicio como puede ser nmap. Nmap es un excelente escaner de puertos que nos da mucha información de los servicios/puertos que usa el PC.
Para escanear con nmap, basta con:
nmap $HOSTNAMELa salida del anterior comando sería por ejemplo:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
901/tcp open samba-swat
3333/tcp open dec-notes
4000/tcp open remoteanything
6667/tcp open irc
6881/tcp open bittorent-trackerComo vemos en la salida, se nos presenta el puerto/protocolo estado servicio, por defecto nmap realiza un escaneo del tipo sT (TCP connect scan) a los puertos por defecto. Si queremos ver mas información de los servicios, versión así como escanear ambos protocolos (tcp y udp) y todos los puertos haríamos:
nmap -sV -A -O -sT -sU -p - $HOSTNAMEComo vemos, su salida sera mas extensa. El inconveniente es que nmap sabe el servicio que usa un puerto por el archivo services y muchas veces no viene dicho servicio saliendo algo así como unknown, por ello deberemos de hacer uso de los comandos lsof, netstat y nmap para averiguar información de los puertos, servicios y demás información.
Si queremos saber a la inversa, o sea, si se el puerto/protocolo y quiero saber que servicio lo esta usando podría usar fuser a parte de los anteriores:
fuser -n <protocolo> -v <puerto>O de forma abreviada:
fuser puerto/protocoloPor ejemplo, si quiero saber que servicio esta usando el puerto 3333/tcp haría:
fuser -n tcp -v 3333El anterior comando me diría lo siguiente:
USER PID ACCESS COMMAND
3333/tcp: c 6987 F.... eggdropEste comando no permite saber cual es el numero de PID del demonio una aplicación, en particular los servicios. Ejemplo para el servicio ssh:
pidof sshdComo resumen pongo algunos ejemplos:
fuser -n udp -v 138sudo lsof -ni -P | grep avahi-daenmap -sV -p ssh $HOSTNAMElsof -ni | grep '*:' | awk '{ print $1 }' | sort -uPara que sea mas fácil, podríamos crear las siguientes funciones y meterlas en el archivo .bashrc:
vi ~/.bashrcfunction lss {
sudo lsof -ni | grep "*:" | awk '{ print $1 }' | sort -u
}Que puertos usa el servicio dado, por ejemplo: lsp amule
function lsp {
sudo lsof -ni -P | grep "*:" | grep $1 | awk '{ print $1,$7,$8 }' | sed -e "s/*://g" | sort
}function lsw {
sudo fuser -n tcp -v $1 || sudo fuser -n udp -v $1
}Cual es el numero de proceso de mi servicio, ejemplo: lspi eggdrop
function lspi {
echo -e "$1 `sudo pidof $1`"
}function lsv {
V=`which nmap`
if [ -z $V ]; then
echo -e "No dispone del programa nmap"
else
echo "$1 -> \"`sudo nmap -sV -sT -sU -p $1 linux | grep $1 | awk '{print $3,$4,$5,$6,$7,$8,$9,$10}'`\""
fi
}Una vez añadida las funciones al .bashrc lo releemos para que se actualicé así:
source ~/.bashrcA partir de ahora ya podríamos usarlo
Fuente: http://chakal.homelinux.com/blog/?p=101
If you see mistakes or want to suggest changes, please create an issue on the source repository.
For attribution, please cite this work as
Sosa (2012, Sept. 20). Blog de José R Sosa: Cómo verificar puertos y procesos en Linux. Retrieved from https://josersosa.github.io/personalweb/posts/2021-05-08-como-verificar-puertos-y-procesos-en-linux/
BibTeX citation
@misc{sosa2012cómo,
author = {Sosa, José R},
title = {Blog de José R Sosa: Cómo verificar puertos y procesos en Linux},
url = {https://josersosa.github.io/personalweb/posts/2021-05-08-como-verificar-puertos-y-procesos-en-linux/},
year = {2012}
}