Esta guía explica algunas formas diferentes de encontrar qué servicio está escuchando en un puerto particular en Linux. La mayoría de ustedes conoce el puerto predeterminado de servicios o procesos populares. Por ejemplo, el puerto predeterminado de Apache es 80, el puerto predeterminado de FTP es 21 y el puerto predeterminado de SSH es 22. Puede encontrar los nombres y números de puerto en Linux como se describe en esta guía. . Los números de puerto predeterminados también se pueden cambiar a cualquier puerto personalizado para asegurar un servidor Linux. Por ejemplo, las siguientes guías describen cómo cambiar el puerto predeterminado de Apache, FTP y SSH a un puerto diferente.
- Cómo cambiar el puerto predeterminado de Apache a un puerto personalizado
- Cómo cambiar el puerto FTP predeterminado a un puerto personalizado
- Cómo cambiar el puerto predeterminado de SSH a un puerto personalizado
Si se cambia el número de puerto predeterminado, ¿cómo encontraría qué servicio está escuchando en qué puerto? ¡Eso es lo que vamos a averiguar ahora!
Encuentre qué servicio está escuchando en un puerto particular en Linux
He enumerado cuatro métodos a continuación para verificar qué servicio se está ejecutando en un número de puerto en particular. Seguiré actualizando esta lista si encuentro nuevos métodos en el futuro. Por lo tanto, márquelo como favorito y revíselo de vez en cuando.
Método 1:uso de netstat
Esta es la forma más utilizada para encontrar qué servicio está escuchando en qué puerto. Netstat es una utilidad de línea de comandos que se utiliza para imprimir conexiones de red, tablas de enrutamiento, estadísticas de interfaz, conexiones enmascaradas y membresías de multidifusión.
Netstat está disponible en los repositorios predeterminados de la mayoría de las distribuciones de Linux.
Para instalarlo en Arch Linux y sus variantes, haga:
$ sudo pacman -S net-tools
En CentOS, RHEL:
$ sudo yum install net-tools
En Fedora:
$ sudo dnf install net-tools
En Debian, Ubuntu:
$ sudo apt install net-tools
Una vez instalado, ejecute el siguiente comando para encontrar qué servicios están escuchando en qué puertos:
$ sudo netstat -tulpn
Salida de muestra:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 665/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1026/sshd tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2068/python3 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1072/mysqld tcp6 0 0 :::22 :::* LISTEN 1026/sshd tcp6 0 0 :::80 :::* LISTEN 1062/apache2 udp 0 0 127.0.0.53:53 0.0.0.0:* 665/systemd-resolve udp 0 0 192.168.225.22:68 0.0.0.0:* 647/systemd-network udp 0 0 192.168.225.53:68 0.0.0.0:* 647/systemd-network udp6 0 0 fe80::a00:27ff:feff:546 :::* 647/systemd-network udp6 0 0 fe80::a00:27ff:fe7e:546 :::* 647/systemd-network
Como puede ver, un servicio de python (simpleHTTPserver en este caso) está escuchando en el puerto número 8000, el servicio mysqld está escuchando en el puerto 3306, el servicio ssh está funcionando en el puerto número 22, apache2 está funcionando en el puerto 80 y así sucesivamente.
Aquí,
-t
bandera muestra conexiones tcp.-u
la bandera muestra conexiones UDP.-l
la bandera muestra los enchufes de escucha.-p
El indicador muestra el ID del proceso (PID) y el nombre del proceso de lo que sea que esté usando ese puerto.-n
La bandera muestra las direcciones numéricas.
El comando anterior enumera todos los servicios y los números de puerto que están escuchando. ¿Qué sucede si desea encontrar qué servicio está escuchando en un puerto en particular? Aquí es donde comando grep ¡Viene muy bien! Podemos combinar netstat
y grep
Comando para filtrar la salida de un servicio específico, por ejemplo mysqld , como a continuación.
$ sudo netstat -tulpn | grep mysqld [sudo] password for sk: tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
¿Ver? El servicio mysqld está escuchando en el número de puerto 3306.
Si ya conoce el número de puerto, pero no sabe qué servicio lo está utilizando actualmente, simplemente reemplace el nombre del servicio con el número de puerto como se muestra a continuación.
$ sudo netstat -tulpn | grep -w 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
Aquí, -w
flag muestra solo aquellas líneas que contienen coincidencias que forman palabras completas. En otras palabras, -w
opción muestra la coincidencia exacta de la cadena dada.
También puede usar -i
para ignorar las distinciones entre mayúsculas y minúsculas, de modo que los caracteres que difieren solo en mayúsculas y minúsculas coincidan entre sí
$ sudo netstat -tulpn | grep -i 3306
Es así de simple.
Para obtener más detalles, consulte las páginas man.
$ man netstat
Netstat es en su mayoría obsoleto. La alternativa a netstat es "ss".
Método 2:usar el comando "ss"
ss es una utilidad de línea de comandos para investigar sockets. Es una alternativa a netstat y el uso de "ss" es casi el mismo que "netstat". Viene preinstalado en Ubuntu y sus variantes.
Para encontrar qué servicios están escuchando en qué puertos, ejecute:
$ sudo ss -tulpn
Salida de muestra:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=12)) udp UNCONN 0 0 192.168.225.22%enp0s3:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=17)) udp UNCONN 0 0 192.168.225.53%enp0s8:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=25)) udp UNCONN 0 0 [fe80::a00:27ff:fe7e:8a9c]%enp0s8:546 [::]:* users:(("systemd-network",pid=653,fd=24)) udp UNCONN 0 0 [fe80::a00:27ff:feff:d2e0]%enp0s3:546 [::]:* users:(("systemd-network",pid=653,fd=22)) tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32)) tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=13)) tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1015,fd=3)) tcp LISTEN 0 128 *:80 *:* users:(("apache2",pid=1094,fd=4),("apache2",pid=1090,fd=4),("apache2",pid=1089,fd=4),("apache2",pid=1088,fd=4),("apache2",pid=1087,fd=4),("apache2",pid=1062,fd=4)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1015,fd=4))
Para filtrar la salida de un servicio en particular (por ejemplo, mysqld), use:
$ sudo ss -tulpn | grep -w mysqld tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32))
Para obtener más detalles, consulte las páginas man.
$ man ss
Método 3:usar lsof
Como su nombre lo dice, lsof es una utilidad de línea de comandos para enumerar todos los archivos abiertos que pertenecen a todos los procesos activos.
Para instalarlo en Linux, use los siguientes comandos según el tipo de distribución que use.
En Arch Linux:
$ sudo pacman -S lsof
En Debian, Ubuntu:
$ sudo apt install lsof
En CentOS, RHEL:
$ sudo yum install lsof
En Fedora:
$ sudo dnf install lsof
Para encontrar qué procesos se están ejecutando en qué puertos, simplemente especifique el número de puerto como se muestra en el siguiente comando:
$ sudo lsof -i :80
Salida de muestra:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 1062 root 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1087 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1088 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1089 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1090 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN) apache2 1094 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
Para obtener más detalles, consulte las páginas man.
$ man lsof
Método 4:usar el comando del fusor
fusor es otra utilidad de línea de comandos para identificar procesos usando archivos o sockets. Muestra los PID de los procesos que utilizan los archivos o sistemas de archivos especificados.
También está disponible en los repositorios predeterminados de la mayoría de las distribuciones de Linux.
Para instalarlo en Arch Linux, ejecute:
$ sudo pacman -S psmisc
En Debian, Ubuntu:
$ sudo apt install psmisc
En CentOS, RHEL:
$ sudo yum install psmisc
En Fedora:
$ sudo dnf install psmisc
Primero necesitamos encontrar el PID de un servicio o proceso escuchando en un puerto en particular. Por ejemplo, voy a encontrar el PID de un proceso que escucha en el puerto 3306 usando el comando:
$ sudo fuser 3306/tcp
Verá una salida como la siguiente.
3306/tcp: 1076
Aquí, 1076 es el PID.
Y luego descubra el proceso real usando el PID usando el comando:
$ ps -p 1076 -o comm= mysqld
Alternativamente, puede usar -v
bandera para ver los detalles completos en un solo comando.
$ sudo fuser -v 3306/tcp USER PID ACCESS COMMAND 3306/tcp: mysql 1076 F.... mysqld
Para obtener más detalles, consulte las páginas man.
$ man fuser
Ahora conoce cuatro herramientas diferentes para encontrar qué procesos están escuchando en qué puertos. Los cuatro son fáciles de usar y están disponibles en la mayoría de las distribuciones de Linux. Si conoce otras herramientas, háganoslo saber en la sección de comentarios a continuación. Comprobaré y actualizaré esta lista en consecuencia.