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/services
La 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/udp
El 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 smbd
Otra manera de lograr nuestro objetivo es utilizando el comando netstat o “network statistics”, de la siguiente manera:
netstat -ltunp
O si queremos el puerto de una aplicación especifica:
netstat -ltunp | grep -e smbd -e nmbd
Otra 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 $HOSTNAME
La 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-tracker
Como 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 - $HOSTNAME
Como 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/protocolo
Por ejemplo, si quiero saber que servicio esta usando el puerto 3333/tcp haría:
fuser -n tcp -v 3333
El anterior comando me diría lo siguiente:
USER PID ACCESS COMMAND
3333/tcp: c 6987 F.... eggdrop
Este 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 sshd
Como resumen pongo algunos ejemplos:
fuser -n udp -v 138
sudo lsof -ni -P | grep avahi-dae
nmap -sV -p ssh $HOSTNAME
lsof -ni | grep '*:' | awk '{ print $1 }' | sort -u
Para que sea mas fácil, podríamos crear las siguientes funciones y meterlas en el archivo .bashrc:
vi ~/.bashrc
function 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 ~/.bashrc
A 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} }