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

79

Quiero una manera simple de mostrar todos los datos de TCP (no los encabezados de TCP o cualquier otra cosa) sobre cualquier interfaz en mi caja de Linux.

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

magic_commmand_I_want port=1234

entonces si había un servidor escuchando en el puerto 1234 en mi máquina, y alguien 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 se imprimiría:

hello

He intentado "tcpdump", "ethereal", "tethereal", "tshark" y otros, pero no es obvio cómo los llevas a:

  • 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 cual, no en hexadecimal y no con marcadores de desplazamiento de paquetes
  • oler todo el tráfico de red (ya sea en eth0 o eth1 o lo , etc.)

Sí, probablemente podría unir 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.

Dustin Boswell
fuente
2
tcpdump es el comando mágico que deseas. Wireshark es una bonita interfaz gráfica de usuario en la parte superior de la biblioteca utiliza tcpdump
Vinko Vrsalovic
3
Sé que esta es una vieja pregunta, pero tengo curiosidad por saber por qué usar nc para el "lado del servidor" tampoco era una opción. "nc -l 1234" crea un servidor que escucha en el puerto 1234 e imprime lo que se le envía y cierra la conexión. Si desea mantener viva la conexión y no desconectarse, puede agregar la opción "-k".
StFS
2
@StFS porque quiere oler un puerto en ejecución y nc se quejaría.
infoclogged

Respuestas:

106

Actualizar:

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

sudo tcpflow -i any -C -J port 1234

(también -Jse ha cambiado a -gen la última versión)


Gracias a yves por señalarme a " 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 (por lo que captura datos provenientes del interior 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
Dustin Boswell
fuente
2
Guau. tcpflow es genial, gracias! Me ahorró una TONELADA de dolor que estaba teniendo con Wirehark. Wireshark, tcpdump, etc. tienen demasiada información y en realidad no hacen lo que la pregunta original les pide. tcpflow es perfecto para esto.
Russ
10
Desde tcpflow versión 1.3, la -eopción se utiliza para especificar el nombre del escáner. Por lo tanto, se imprime el error "Nombre de escáner no válido '8983'". El comando correcto essudo tcpflow -i any -C -J port 1234
Michal Kováč,
66
Tenga en cuenta que -Jse ha cambiado a -gen las últimas versiones.
tvon
2
¡Alguien debe explicar a los autores de la herramienta qué significa el término "compatibilidad con versiones anteriores"!
Sridhar Sarnobat
Imprime "cosas" dos veces, para mí. Porqué es eso ? lpaste.net/3984129577801744384
user1198559
29

socat es la herramienta que está solicitando. 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 a 1234

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

Actualizar:

Si socat no está disponible en su máquina, aún 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
yves Baumes
fuente
Supongamos que no tengo control sobre el cliente y el servidor (o no quiero detenerlo), por lo que no puedo cambiar qué puerto está involucrado o interceptar el tráfico. ¿Y que?
20

Prueba Wireshark . Es un excelente analizador de protocolos dirigido tanto para Linux como para Windows.

Kevin Boyd
fuente
3
Mi experiencia es que la interfaz realmente apesta en Linux.
Joe Phillips
maldición, llegaste allí antes que yo, +1 en wireshark
¿Puedes dar un ejemplo de línea de comandos?
Eche un vistazo a este enlace wiki.wireshark.org/Tools. Ofrece una lista de herramientas de línea de comandos para wireshark. Esté atento a Dumpcap.
Kevin Boyd el
13

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 conexiones TCP (flujos) y almacena los datos de una manera conveniente para el análisis o depuración de protocolos. Un programa como tcpdump (4) muestra un resumen de los paquetes vistos en el cable, pero generalmente no almacena los datos que realmente se transmiten. Por el contrario, tcpflow reconstruye los flujos de datos reales y almacena cada flujo en un archivo separado para su posterior análisis. tcpflow comprende los números de secuencia TCP y reconstruirá correctamente los flujos de datos independientemente de las retransmisiones o entregas fuera de servicio.

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 de aplicación a su servidor. Cuando la conexión está en funcionamiento, tcpflow aún puede capturar datos de ella. 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 expresión para ajustar los paquetes que desea que tcpflow capture.

yves Baumes
fuente
2

ngrepes muy bueno 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 detenidamente en Wireshark más adelante.

hobbs
fuente
0

Echa un vistazo a Chaosreader . Aunque hace un poco más de lo que pides y de manera ligeramente diferente, probablemente puedas modificar el código para hacer lo que quieras.

Andrew Y
fuente
-1

Tal vez pueda escribir un contenedor para tcpdump, por ejemplo, que eliminará toda la información redundante

dimba
fuente