2011-10-20 18 views
18

¿Alguien sabe una manera fácil de pedirle a Linux que "muestre cada paquete de Internet desde/hacia google chrome" o "muestre cada paquete de internet hacia/desde el proceso telnet con PID 10275"?¿Cómo puedo capturar paquetes de red por PID?

El ejemplo de telnet no es demasiado útil, ya que puedo usar wireshark o tcpdump para ver todas las conversaciones TCP que involucran el puerto 23. Eso y nadie usa telnet nunca más. Pero olfatear todos los paquetes hacia/desde aplicaciones complejas que usan muchos puertos parece una cosa útil.

he encontrado algunas respuestas relacionadas explorando diferentes maneras para corroborar puertos y PID (o programas nombres) y tal, pero nada sobre los paquetes

Parece que alguien podría haber estado dispuesto a pagar por esta respuesta hace un tiempo:

NetHogs es útil para ver rápidamente qué programas están creando tráfico a través de una interfaz, pero no tiene una forma de capturar los paquetes.

+0

Hrm, debería preguntar en serverfault en su lugar? –

+0

Esto probablemente pertenece a SuperUser, en realidad. Una pregunta interesante Podría usar WireShark para filtrar las solicitudes HTTP, pero tendría que enganchar los controladores del kernel para filtrar los paquetes basados ​​en los PID – Bojangles

+1

. Es un problema complejo: los sockets no son propiedad de los PID; puedes pasarlos de un proceso a otro. Si el proceso A abre un socket, puede pasarlo para procesar B y luego salir; si está filtrando en el PID del proceso A, ¿qué ocurre ahora? – bdonlan

Respuesta

1

Usaría lsof -i para obtener los números de puerto asociados con la aplicación que deseo. El código sería así:

 
process=firefox 
for _port in `lsof -i | grep $process | cut -d' ' -f18 | cut -d: -f2 | cut -d'-' -f1` 
do 
    port=$_port 
    [[ "$_port" == +([a-zA-Z]) ]] && port=`cat /etc/services | grep '^$_port' | cut -d' ' -f12 | cut -d'/' -f1 | uniq | head -n 1` 

    echo "tcpdump -w ${port}.pcap port $port &" 
    tcpdump -w ${port}.pcap port $port & 
done 

Tenga en cuenta que la salida de los comandos podría ser diferente en diferentes versiones/distribuciones. Por lo tanto, será mejor que verifique que los archivos .ds correctos se corten antes de usar el script.

Además, este script no supervisa los puertos que se abren más tarde. Para eso, consideraría una secuencia de comandos más complicada que comprueba los puertos con regularidad (usando algo como watch)

Y recuerde matar a todos los procesos de tcpdump después.

2

Tcpdump puede indicarle que el PID/proceso de un paquete proviene de/a.
Tira '-k NP' en tus opciones.

versión compatible: tcpdump versión 4.3.0 - Apple la versión 56

+8

Se preguntó por Linux. No existe tal opción en el tcpdump de Linux que muestra la información PID. – shivams

+0

Funciona en MAC. –

Cuestiones relacionadas