¿Existe una herramienta de línea de comandos fácil para la detección de paquetes de un solo comando en Linux?

11

Me encantaría si hubiera una única herramienta de línea de comandos para la detección de paquetes de un solo comando en Linux. algo así sniff dumpfile commandpara que pueda simplemente ejecutar el comando que desea oler en la terminal y obtener un volcado de los paquetes en otro lugar.

Me gustaría volcar / guardar / ver solo el tráfico de red del comando único que ingreso, no todo el tráfico TCP en mi única interfaz de red. Entonces, si estaba conectado a mi computadora y tenía IRC ejecutándose en segundo plano, y lo hice sniff somefile wget http://www.google.com, me gustaría ver todo el tráfico de red que hizo el comando wget para descargar http://www.google.com . No quiero que 'somefile' tenga el tráfico de red IRC confuso.

Hay muchos comandos de Linux / Unix que aceptan un comando diferente y hacen algo diferente. Desde sudo(ejecutar como superusuario), nicecambie el nivel agradable trickle(limite el ancho de banda de un comando)

Rory
fuente
1
¿Qué es exactamente lo que quieres hacer? ¿Desea verificar si se ejecuta un determinado comando? ¿Quieres oler el tráfico de red? Debido a que el uso de la 'detección de paquetes un comando' frase no tiene sentido para mí en absoluto ...
wzzrd
wzzrd, ver pregunta ampliada
Rory

Respuestas:

10

No hay ninguno que yo sepa, pero en teoría no debería ser difícil obtener algo similar. Strace se puede utilizar para interceptar llamadas de sistema de red.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

Esto le dará información sobre los datos enviados entre el núcleo y el proceso. La salida de strace no es exactamente lo que quieres. Sin embargo, strace utiliza la llamada al sistema ptrace para interceptar llamadas del sistema. Podría ser posible escribir un programa para generar los datos un poco más útil.

Alternativamente, también puede interceptar el buen socket útil, enlazar y escuchar llamadas al sistema. Podría ser posible escribir un pequeño programa que usara ptrace en estas llamadas y libpcap para cambiar dinámicamente el filtro de captura cada vez que se abre un nuevo socket.

David Pashley
fuente
Sería genial si generara algo que Wireshark pudiera leer.
Brad Gilbert
Tenga en cuenta que la versión descrita anteriormente es precisa para Solaris (y posiblemente para otros dispositivos comerciales). En Linux, strace es un rastreador de llamadas del sistema, similar en operación y salida a truss en Solaris o tusc en HP-UX.
James F
1
Describí strace en Linux.
David Pashley
8

Tracedump

Tracedump es un sniffer de paquetes IP de una sola aplicación, que captura todos los paquetes TCP y UDP de un solo proceso de Linux.

Descarga y descripción aquí: http://mutrics.iitis.pl/tracedump

pjf
fuente
1
Esta debería ser la respuesta correcta ahora.
h0tw1r3
4

Prueba Wireshark: el comando será tshark

  • tshark le permite seleccionar filtros en el tráfico capturado desde una interfaz
  • use otras utilidades como debian lsof para identificar el tipo de comunicación realizada por su aplicación de interés.

O, ¿realmente solo quieres LSOF?


No creo que haya una herramienta que continúe filtrando dinámicamente para toda la comunicación asociada a un proceso. Sin embargo, podría intentar rastrear las comunicaciones del proceso con herramientas como, lsofy una vez que tenga un buen filtro que pueda aislar la comunicación de ese proceso del resto del tráfico que se ejecuta en su sistema, podría obtener la captura correcta.

Por ejemplo, por lo wgetgeneral, la dirección IP de destino es distinta de otro tráfico relacionado con el proceso. Incluso si toma algo como skypeel rango de puertos de destino, generalmente se fija para una instancia.


Esto es un poco como el principio de incertidumbre. Por lo general, puede saber qué está pasando por un conjunto de rutas de comunicación (con un filtro sniffer en un grupo de flujos identificado) o dónde se están creando diferentes enlaces de comunicación (con lsof).

Realmente me gustaría saber si ambos se pueden hacer para una aplicación. Creo que debería ser factible. Pero, no he visto ninguna herramienta hacer eso todavía.

nik
fuente
lsof es increíble, pero prefiero ver lo que está haciendo / enviando / recibiendo.
Rory
4

Aprende a usar expresiones de filtro.

Si bien esto no hará las cosas de rastreo elegantes que está pidiendo.

Le permitirá eliminar casi todas las "cosas confusas como IRC" de la captura.

Además, es muy útil conocer la sintaxis del filtro para una referencia rápida en el futuro.

Dan Carley
fuente
2

Específicamente para un navegador web / página web, algo como el complemento Firebug para Firefox puede brindarle parte de la información que está buscando: http://getfirebug.com/net.html

Para aplicaciones más generales, es posible que necesite usar netstat para identificar los puertos utilizados por la aplicación y luego Wireshark / tshark / dtrace con un filtro para capturar solo ese tráfico. Aunque no es la respuesta de una línea que estabas buscando ...

Peter
fuente
1

Una idea, prueba VMWare

-configurar un vm
-configurar ese vm para usar una interfaz particular
-sniff en esa interfaz desde el host (es como un hombre en el medio ataque)

Si aísla qué aplicaciones de red se están ejecutando en esa máquina virtual, es posible que tenga su respuesta

Una solución más ideal, supongo, es hacer lo que VMWare hace en términos de cómo especifica cómo elige una interfaz para hablar. Creo que su magia proviene de los módulos del kernel que usa, en este caso, probablemente el módulo del kernel vmnet.

Que yo sepa, las aplicaciones no saben de qué interfaz hablan y creo que esto es así por diseño; no deberían tener que preocuparse por tales cosas.

Además,
tal vez ya exista un programa, no lo sé. Pero si uno fue escrito, podría llamarlo nettrace (por ejemplo) y Usage podría ser como

interfaz del programa nettrace

luego huela la interfaz que usa y agregue rutas (tal vez lo hace automáticamente) a su interfaz real

Rvdo
fuente
Sí, eso sería posible. Sin embargo, sería genial si hubiera una herramienta simple y rápida para hacerlo.
Rory
Tal vez es hora de esta sencilla herramienta? Me pregunto si sería tan difícil, probablemente el mod vmnet podría ser un buen punto de partida (aunque no sé si habría problemas de licencia). Quizás (un truco) solo use vmnet mod. Sé que a menudo me interesan preguntas como esta.
rev
1

Suponiendo que usted es la única persona en la caja que intenta conectarse a Google en ese momento, creo que algo como esto debería funcionar:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Si no es la única conexión que intenta conectarse a Google en el cuadro, entonces si puede identificar la IP / puerto desde el que se está conectando, también puede especificar el puerto src / src ip.

Identificar el puerto src puede ser un problema a menos que pueda especificarlo en cualquier cliente que use. No estoy seguro si puedes con wget.

Sospecho firmemente que puede especificar los puertos src y dst con netcatlo que si realmente le interesaba google, podría hacer su GET (manualmente) a través de netcat.

Por supuesto, la página del manual le dará detalles

Jason Tan
fuente
1

La página de manual de tcpdump y muchos sitios web ofrecen ejemplos detallados de filtros, e incluso hay algunos repositorios en línea de expresiones de filtro de tcpdump. Debería poder hacer casi cualquier cosa con la que pueda soñar, suponiendo que sepa algo sobre el tráfico de la red (fuente, destino, puertos, protocolos, etc.) más allá de qué programa lo está generando.

Si está trabajando en un servidor o cuadro sin cabeza, siempre puede hacer que tcpdump escriba un archivo de volcado y luego lo abra en Wireshark en su estación de trabajo y obtenga un filtrado avanzado y una interfaz gráfica.

Jason Antman
fuente
Erm, ¿qué cambio al comando tcpdump lo limitaría a una sola aplicación que genera el tráfico?
Milan Babuškov
1

Tal vez este script haga lo que quiera con las modificaciones apropiadas al comando tshark:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Lea el archivo de volcado más tarde:

tshark -r dump
Ahora no
fuente
Estás capturando el puerto 8080 pero generando tráfico en el puerto 80; esto no hará exactamente lo que pretendes.
James F
James: Mi proxy se conecta a 8080, así es como ejecuté el script. Debería haberlo cambiado 80 para el propósito de esta publicación.
Ahora no
0

Dtrace debería permitir esto, aunque todavía no sé si ha llegado a Linux.

Toto
fuente