it-swarm.dev

¿Cuál es la forma más fácil de detectar TCP datos de tráfico en Linux?

Quiero una forma sencilla de mostrar todos los TCP datos (no los TCP encabezados o cualquier otra cosa) a través de cualquier interfaz en mi caja de Linux.

Por ejemplo, quiero un comando mágico que si lo hago:

magic_commmand_I_want port=1234

luego, si había un servidor escuchando en el puerto 1234 en mi máquina, y alguien lo hizo:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a Host/port

Entonces el comando mágico simplemente imprimirá:

hello

He intentado "tcpdump", "Ethereal", "tethereal", "tshark", y otros, pero no es obvio cómo los haces para:

  • no mostrar direcciones IP u otros metadatos
  • solo muestra los "datos" que se envían, no los paquetes individuales y sus encabezados
  • imprima los datos tal como están, no en hexadecimal y no con marcadores de compensación de paquetes
  • sniff todo el tráfico de red (ya sea en eth0 o eth1 o lo , etc ...)

Sí, probablemente podrías juntar un conjunto de comandos unix para hacer esto, pero eso no es muy fácil de recordar para la próxima vez :)

Si tiene un ejemplo simple de una línea de comandos exacta que hace esto, eso es lo que me gustaría.

77
Dustin Boswell

Actualización:

Como señaló Michal en los comentarios: Desde la versión 1.3 de tcpflow, la opción -e se usa para especificar el nombre del escáner. Por lo tanto, se imprime el error "Nombre del escáner no válido '8983'". El comando correcto es

Sudo tcpflow -i any -C -J port 1234

(también -J se ha cambiado a -g en la última versión)


Gracias a yves por indicarme " tcpflow ". Aquí está la línea de comando:

tcpflow -i any -C -e port 1234  # as root, or with Sudo

Esto hace todo lo que quiero.

  • muestra los datos byte por byte a medida que entran
  • no muestra ningún otro metadato
  • escucha en todas las interfaces (para que capture los datos provenientes de la máquina y del exterior)

El "-C" le dice que descargue en la consola en lugar de un archivo. El "-e" habilita los colores para que cliente-> servidor y servidor-> cliente sean visualmente distintos.

Instalé tcpflow simplemente haciendo

Sudo apt-get install tcpflow
104
Dustin Boswell

socat es la herramienta que estás pidiendo. Puede actuar como un proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

entonces su aplicación debe conectar el puerto 4444 en lugar de conectarse directamente al 1234

La opción -v es para que socat imprima todo lo que recibe en el error estándar (stderr).

Actualizar:

Si socat no está disponible en su máquina, todavía puede emularlo de esa manera con netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

advertencias: esta opción es unidireccional. la segunda instancia de netcat imprimirá cualquier respuesta de su servidor a la salida estándar. Todavía puede hacer entonces:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
29
yves Baumes

Pruebe Wireshark . Es un excelente analizador de protocolos para Linux y Windows.

20
Kevin Boyd

tcpflow es lo que quieres. Extracto de la página del manual:

DESCRIPCIÓN
tcpflow es un programa que captura datos transmitidos como parte de TCP conexiones (flujos), y almacena los datos de una manera que es conveniente para el análisis de protocolo o depuración. Un programa como tcpdump (4) muestra un resumen de los paquetes vistos en el cable, pero por lo general no almacena los datos que realmente se están transmitiendo. En contraste, tcpflow reconstruye los flujos de datos reales y almacena cada flujo en un archivo separado para su posterior análisis. tcpflow entiende TCP números de secuencia y reconstruirá correctamente los flujos de datos independientemente de las retransmisiones o la entrega fuera de orden.

tcpflow almacena todos los datos capturados en archivos que tienen nombres del formulario

192.168.101.102.02345-010.011.012.013.45103

donde los contenidos del archivo anterior serían datos transmitidos desde el Host 192.168.101.102 puerto 2345 al Host 10.11.12.13 puerto 45103.

Configure una conexión desde su aplicación a su servidor. Cuando la conexión está activa y en ejecución, tcpflow aún puede capturar datos de la misma Por ejemplo:

$ Sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Todos los datos se almacenarán en un archivo llamado 127.000.000.001.48842-127.000.000.001.05555.

Aún puede redirigir esto en la salida estándar con la opción -C. Lea la página del manual para jugar con la expresión para sintonizar los paquetes que desea que tcpflow capture.

13
yves Baumes

ngrep es muy agradable para esto. Se necesita una cadena BPF y una cadena opcional para buscar dentro de los paquetes, y luego se vuelca el contenido del paquete a la pantalla en un formato bastante útil. Opcionalmente, también se vuelca en un archivo pcap_dump que puede examinar más de cerca en Wireshark más adelante.

2
hobbs

Echa un vistazo a Chaosreader . Aunque hace un poco más de lo que pide y de forma ligeramente diferente, probablemente podría modificar el código para hacer lo que quiera.

0
Andrew Y