September 05, 2012

Usando lsof para localizar aplicaciones y puertos abiertos

lsof

"lsof is a command meaning "list open files", which is used in many Unix-like systems to report a list of all open files and the processes that opened them. This open source utility was developed and supported by Vic Abell, the retired Associate Director of the Purdue University Computing Center. It works in and supports several Unix flavors"
-- from wikipedia [search: lsof]

Overview

Suele suceder que en ocasiones durante las actividades diarias de mantenimiento, nos encontramos con procesos o aplicaciones que levantan puertos y desconocemos dónde esta esa aplicación o qué archivos usa durante su ejecución. Este solo es una alternativa para saber como usar lsof y obtener la información deseada, claro esta que siempre será posible usar otras herramientas como ps, pstree, pidof y top.

Como saben, busco que estas soluciones sean lo más heterogénea/portable posible para poder usarlas en los siguientes sistemas (HP-UX, GNU/Linux y OS-X), espero darme el tiempo para hacerlo en Solaris y ofrecer un panorama más amplio.

Buscando puertos

Como recordaran, en UNiX todo se refiere con un archivo (handler) por lo tanto es posible mediante esta herramienta ubicar que aplicaciones abrieron un puerto determinado, por el socket (handler) que abren en el sistema operativo. En esta caso usaremos la opción [ -i ], veamos que dice la documentación:

«This option selects the listing of files any of whose Internet address matches the address  specified  in i. If no address is specified, this option selects the listing of all Internet and x.25 (HP-UX) network files.»

Esta opción requiere como parámetro una dirección de red en el siguiente formato:
[46][protocol][@hostname|hostaddr][:service|port]
4,6 Especifica la versión IP a usar
protocol Protocolo de red, es decir TCP o UDP
hostname|hostaddr Hostname, nombre del equipo o dirección IP
service|port El puerto que se busca, si optamos por el servicio tendrá que estar listado en /etc/services

Por lo tanto si estamos buscando, por ejemplo que aplicación abrió el puerto 2222 para escucha de nuevos sesiones de red (LISTEN) podemos usar netstat:


U optar por lsof:


Es posible realizar combinaciones entre los parámetros para obtener mejores resultados, algo que es importante mencionar es que lsof podrá realizar la búsqueda de estos archivos siempre y cuando se encuentre en el alcance del usuario (al r00t lo que es del r00t).

Buscando aplicaciones

Para buscar las aplicaciones, es mucho más sencillo pero necesitamos saber el PID asociado al proceso que le ejecutó. Se que podrán pensar, bueno si yo sé que proceso lo inicio para que necesito saberlo, bueno pues este tipo de consultas es muy útil para cuando tienes muchos procesos similares, por ejemplo multiples ejecuciones JAVA, multiples HTTPd y que no es tan sencillo ubicar que proceso levanto que puertos.

Para el caso anterior, el proceso que inicie fue un OpenSSHd, uno independiente de aquel que trae el sistema operativo, por lo tanto la búsqueda quedaría de la siguiente manera:


La opción que usamos fue [ -p ] y como parámetro usamos el ID del proceso, el cual pudimos obtener buscando el socket que dejó abierto en anteriores pantallas, lo interesante es que logramos obtener la ruta completa del comando que se ejecutó [ /opt/local/sbin/sshd ] y este pues, es el objetivo final.

Veamos la documentación:

«This option excludes or selects the listing of files for the processes whose optional process IDentification (PID) numbers are in the comma-separated set s - e.g., ``123'' or ``123,^456''.  (There should be no spaces in the set.)»

¡Sencillo!
A practicar...

Referencias

¡kualli ohtli / buen camino!