En las redes, un puerto es una característica interesante. Es una forma de que el tráfico de red identifique la aplicación o servicio de destino. Cada proceso/servicio tiene su puerto único. Un puerto siempre estará asociado a la dirección IP del host junto con el protocolo.
Esta es una de mis metáforas favoritas para describir lo que es un puerto. Imaginemos un barco cargado con un cargamento, que va a viajar a una tierra lejana. Qué información se necesita para llegar bien al destino? Para simplificar, digamos que necesita el país (la dirección IP) y el puerto en el que atracará el barco.
En esta guía, echa un vistazo a cómo listar los puertos abiertos en Linux.
Puertos en Linux
Los puertos actúan como un punto final de comunicación. Es un número de 16 bits (0 a 65535 en decimal). Aunque el rango es grande, para facilitar su uso, los puertos se clasifican en tres categorías. Cada categoría está etiquetada como el rango de valor del puerto:
- 0 a 1023: Estos son los puertos «Well-known», también conocidos como los puertos «System», que están reservados para los procesos del sistema que ofrecen una amplia variedad de servicios de red. Para enlazar con un puerto «Well-known», un proceso debe tener privilegios de superusuario.
- 1024 a 49151: Estos son los puertos «Registrados», también conocidos como los puertos de «Usuario», que son designados por IANA para servicios específicos. Bajo petición, un proceso puede tener acceso a ellos. En el caso de la mayoría de los sistemas, no se requiere ningún privilegio de superusuario para utilizar estos puertos.
- 49152 a 65535: Son los puertos «Dinámicos», también conocidos como puertos «Privados». Estos puertos no pueden ser registrados con IANA. Estos puertos están abiertos a ser utilizados para servicios privados o personalizados y también pueden ser asignados automáticamente como puertos efímeros (puertos de corta duración utilizados por IP).
- a: Le dice a netstat que muestre todos los sockets
- t: Le dice a netstat que liste los puertos TCP
- u: Le dice a netstat que liste los puertos UDP
- l: Le dice a netstat que imprima sólo los sockets de escucha
- n: Le dice a netstat que muestre el número de puerto
- l: Le dice a ss que muestre los sockets de escucha
- n: Le dice a ss que no intente resolver los nombres de los servicios
- t: Le dice a ss que muestre los sockets TCP
- u: Le dice a ss que muestre los sockets UDP
- -sT: Esta sección le dice a nmap que escanee los puertos TCP.
- -p- : Esto le dice a nmap que escanee los 65535 puertos. Si no se utiliza, entonces nmap escaneará sólo 1000 puertos por defecto.
- z: Le dice a netcat que escanee sólo los puertos abiertos sin enviar ningún dato
- v: Le dice a netcat que se ejecute en modo verbose
En Linux, hay múltiples formas de comprobar los puertos abiertos. Por defecto, cualquier puerto permanecerá cerrado a menos que una aplicación lo esté utilizando. Si un puerto está abierto, entonces debe estar asignado a un servicio/proceso.
Lista de puertos abiertos
Es más fácil identificar qué puertos están en uso que qué puertos están abiertos. Es por ello que en la siguiente sección se presentarán métodos para listar todos los puertos que están actualmente en uso. En Linux, hay múltiples herramientas disponibles para esta tarea. La mayoría de ellas vienen incorporadas en cualquier distro de Linux.
Aprender qué puertos están actualmente abiertos puede ser útil en varios escenarios. Es posible configurar un puerto dedicado para una determinada aplicación. Un puerto abierto también puede ser un fuerte indicio de intrusión en la red.
Los siguientes métodos se demuestran en Ubuntu 20.04.1 LTS.
Lista de protocolos y puertos abiertos desde /etc/services
El archivo /etc/services contiene información sobre los servicios que se están ejecutando actualmente. Es un archivo grande, así que prepárate para agobiarte.
Lista de puertos abiertos usando netstat
La herramienta netstat es una utilidad para mostrar las conexiones de red para TCP, tablas de enrutamiento, y varias interfaces de red. También ofrece estadísticas de protocolos de red. Utilizando netstat, podemos listar todos los puertos abiertos del sistema.
Ejecuta el siguiente comando netstat:
Vamos a hacer un rápido desglose de todas las banderas que hemos utilizado en este comando.
Aquí hay otra variación del comando netstat:
Hay dos nuevas banderas utilizadas en el comando. ¿Qué significan?
Para mostrar el PID del proceso que está usando un puerto, usa la bandera «-p»:
Lista de puertos abiertos usando ss
La herramienta ss es una utilidad para investigar socket. Su uso es similar al de netstat.
Para listar los puertos abiertos, ejecuta el siguiente comando ss:
Las banderas son similares a las de netstat. Las funciones que describen también son bastante similares.
Lista de puertos abiertos usando lsof
El comando lsof es para listar archivos abiertos. Sin embargo, también se puede utilizar para mostrar los puertos abiertos.
Ejecuta el siguiente comando lsof:
Para obtener los puertos abiertos de un protocolo específico (TCP, UDP, etc.) entonces defínalo después de la bandera «-i», utilice:
Lista de puertos abiertos usando nmap
La herramienta nmap es una potente herramienta para la exploración de la red y el escaneo de seguridad/puertos. Puede informar de todos los puertos abiertos en el sistema.
Para listar los puertos TCP abiertos, ejecute el siguiente comando nmap. Aquí, la dirección IP es del equipo anfitrión:
Aquí, hay dos partes del argumento del comando.
Si necesita listar los puertos UDP abiertos, entonces ejecute el siguiente comando nmap:
Para obtener tanto los puertos TCP como UDP abiertos, utilice el siguiente comando:
Listado de puertos abiertos usando netcat
La herramienta netcat es una utilidad de línea de comandos para leer y escribir datos a través de conexiones de red sobre los protocolos TCP y UDP. Esta herramienta también se puede utilizar para listar los puertos abiertos. Puede realizar pruebas en un puerto específico o en un rango de puertos.
El siguiente comando netcat escaneará el puerto del 1 al 1000. El comando netcat realizará el escaneo en el protocolo TCP por defecto:
También se puede ampliar a toda la lista de puertos posibles:
Vamos a hacer un rápido desglose de las banderas.
Para obtener sólo los puertos abiertos de esta lista, filtre la salida con grep para el término «succeeded».
Si quieres realizar el escaneo en el protocolo UDP, entonces añade la bandera «-u».
Pensamientos finales
Como se ha demostrado, hay toneladas de formas de escanear puertos abiertos en Linux. Sugiero probar todos los métodos antes de decidir cuál dominar. Si usted está usando una determinada herramienta como netcat o nmap regularmente, entonces el dominio de los métodos asociados será el más beneficioso.
¡Feliz computación!