linux networking

linux - ¿Cómo puedo capturar paquetes de red por PID?



networking (3)

¿Alguien sabe una manera fácil de pedirle a Linux que "muestre cada paquete de Internet a / desde google chrome" o "muestre cada paquete de Internet a / desde el proceso de telnet con PID 10275"?

El ejemplo de telnet no es muy útil, ya que solo puedo usar wireshark o tcpdump para ver todas las conversaciones de TCP relacionadas con el puerto 23. Eso y nadie más usa telnet. Pero rastrear todos los paquetes a / desde aplicaciones complejas que usan muchos puertos parece algo útil.

Encontré algunas respuestas relacionadas que exploran diferentes formas de corroborar puertos y PID (o nombres de programas) y demás, pero nada sobre 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 manera de capturar paquetes.


En mi caso, quería capturar el tráfico de syslog pero solo desde rsyslog. Solo tenía un puerto de escucha bajo lsof -p $(pidof rsyslog) y siempre lo usaba como puerto de origen, así que pude obtener los paquetes utilizando:

tcpdump -i eth0 -A "host 10.0.0.100 and dst port 514 and src port $(lsof -i 4 -a -p `pidof rsyslogd` | grep -Po ''(?<=/*:)[0-9]*'') and udp"

El grep utiliza una aserción de mirada positiva detrás de convertir el número de puerto *: solo en el número de puerto.


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

Versión soportada: tcpdump versión 4.3.0 - Apple versión 56


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 puede ser diferente en diferentes versiones / distribuciones. Por lo tanto, es mejor que compruebe que los archivos correctos se cortan antes de usar el script.

Además, esta secuencia de comandos no supervisa los puertos que se abren más tarde. Para eso, consideraría un script más complicado que verifica los puertos regularmente (usando algo como watch )

Y recuerda matar después todos los procesos tcpdump.