¿Cómo mostrar la interfaz en el flujo de salida de tcpdump?

20

Esto parece ser un problema bastante trivial, pero después de algunas búsquedas no puedo encontrar la respuesta. Uno puede ejecutar tcpdump usando "any" como descripción de la interfaz, es decir:

 # tcpdump -i any -n host 192.168.0.1

¿Hay alguna forma de forzar a tcpdump a mostrar en qué interfaz se capturó el paquete visualizado?

Actualizar:

Como más personas confirmaron que esto probablemente no sea posible con vanilla tcpdump, ¿alguien puede proponer una solución al problema mencionado? ¿Quizás un sniffer diferente?

El problema general es el siguiente: en un sistema con 50 interfaces, determine cuál es la interfaz entrante para los paquetes que provienen de una dirección IP específica.

mdrozdziel
fuente

Respuestas:

19

Espero que alguien todavía esté interesado en la solución del problema. ;) Tuvimos el mismo problema en nuestra empresa y comencé a escribir un guión para esto.

Escribí una publicación de blog al respecto con el código fuente y una captura de pantalla .

También lo he compartido a continuación ...

ingrese la descripción de la imagen aquí

Y el código: (asegúrese de consultar mi sitio para futuras actualizaciones)

#!/bin/bash
#===================================================================================
#
# FILE: dump.sh
# USAGE: dump.sh [-i interface] [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in front of the dump data.
# OPTIONS: same as tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# BUGS:  ---
# FIXED: - In 1.0 The parameter -w would not work without -i parameter as multiple tcpdumps are started.
#        - In 1.1 VLAN's would not be shown if a single interface was dumped.
# NOTES: ---
#        - 1.2 git initial
# AUTHOR: Sebastian Haas
# COMPANY: pharma mall
# VERSION: 1.2
# CREATED: 16.09.2014
# REVISION: 22.09.2014
#
#===================================================================================

# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT
# Create one tcpdump output per interface and add an identifier to the beginning of each line:
if [[ $@ =~ -i[[:space:]]?[^[:space:]]+ ]]; then
    tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &
else
    for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}')
    do
       tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"']    /' &
    done
fi
# wait .. until CTRL+C
wait
Sebastian Haas
fuente
6

Puede usar la opción -e para imprimir los encabezados de ethernet, luego puede correlacionar las direcciones MAC src / dst con sus interfaces de red;).

Cip
fuente
El uso -esolo imprime una dirección MAC en cada línea. Para los paquetes entrantes es el MAC de origen que no es muy útil para identificar en qué interfaz llegó.
kasperd
1

No sé de ninguna respuesta a eso tampoco. No encuentro ninguna opción, no recuerdo haber visto nunca una, y estoy bastante seguro de que el formato tcpdump no incluye un identificador de interfaz. Creo que tendrá que iniciar una instancia de tcpdump para cada interfaz e iniciar sesión en los archivos respectivos.

Jeff Ferland
fuente
Estoy de acuerdo. Por lo general, cuando estoy olfateando el tráfico, ya sé de dónde viene el tráfico o hacia dónde va. Si tengo que resolver eso, primero tengo que freír peces más grandes ...
Corey S.
2
Realmente necesito esta funcionalidad muy a menudo. Tengo varias interfaces, muchas interfaces vlan, con IGP y BGP además de esto. Averiguar cómo fluyen los paquetes es esencial con mucha frecuencia. Puedo verificar manualmente la interfaz de salida examinando la tabla de enrutamiento actual. Pero si tengo que encontrar la forma en que los paquetes provienen de Internet, a veces tengo que hacer una verificación ciega, simplemente iniciando tcpdump en las interfaces más probables. :(
mdrozdziel
1

Si está ejecutando en Mac, hay una -kopción tcpdumpsi está utilizando la interfaz pktap, que descarga el nombre de la interfaz entre otros metadatos útiles.

   -k     Control the display of packet metadata via an optional metadata_arg argument. This is useful when displaying packet saved in the
          pcap-ng file format or with interfaces that support the PKTAP data link type.

          By default, when the metadata_arg optional argument is not specified, any available packet metadata information is printed  out.

          The  metadata_arg  argument controls the display of specific packet metadata information using a flag word, where each character
          corresponds to a type of packet metadata as follows:

                 I     interface name (or interface ID)
                 N     process name
                 P     process ID
                 S     service class
                 D     direction
                 C     comment
                 U     process UUID (not shown by default)
                 A     display all types of metadata

          This is an Apple modification.
Wei Shen
fuente
1

Para agregar al gran guión de bash de Sebastian Haas. Tuve que simplificar su guión ya que falló en esta línea tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Si bien no es tan flexible como el script original, es más probable que se ejecute en un sistema Linux simplificado.

#!/bin/sh
interfaces="eth0 ip6tnl1" # Interfaces list separated by whitespace
#===================================================================================
#
# FILE: dump-stripped.sh
# USAGE: dump.sh [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in 
#               front of the dump data. Simplified to work in more limited env.
# OPTIONS: similar to tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# AUTHOR: Sebastian Haas (Stripped down By Brian Khuu)
#
#===================================================================================

# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT

# Create one tcpdump output per interface and add an identifier to the beginning of each line:
for interface in $interfaces;
do tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' 2>/dev/null & done;

# wait .. until CTRL+C
wait;

También puede estar interesado en el boleto actual de emisión de github con respecto a esta omisión de características en https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
fuente
0

Suponiendo que esto está en Linux, puede agregar una regla de iptables para que coincida con el paquete que está buscando y registrarlo. El registro de Iptables incluye interfaces de entrada y salida, entre otras cosas.

vadimk
fuente
0
for interface in `ifconfig | grep '^[a-z0-9]' | awk '{print $1}'`;do echo $interface;tcpdump -i $interface -nn -c 25;done

Ajuste -c según sea necesario.

Nathan
fuente
0

Al modificar la línea de detección de interfaz, puede eliminar las interfaces de dirección de alias en Linux. muestra a continuación ..

for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}')

cambios a

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
LTK-Tog
fuente