Bagaimana cara menampilkan antarmuka dalam aliran keluaran tcpdump?

20

Ini tampaknya masalah yang cukup sepele, tetapi setelah beberapa pencarian saya tidak dapat menemukan jawabannya. Seseorang dapat menjalankan tcpdump menggunakan "apa saja" sebagai deskripsi antarmuka, yaitu:

 # tcpdump -i any -n host 192.168.0.1

Apakah ada cara untuk memaksa tcpdump untuk menunjukkan di mana paket antarmuka yang ditampilkan ditangkap?

Memperbarui:

Karena semakin banyak orang mengkonfirmasi ini mungkin tidak mungkin dengan vanilla tcpdump, dapatkah seseorang mengusulkan solusi untuk masalah yang disebutkan? Mungkin sniffer yang berbeda?

Masalah umum adalah sebagai berikut: Pada sistem dengan 50 antarmuka menentukan apa antarmuka inbound untuk paket yang berasal dari alamat ip tertentu.

mdrozdziel
sumber

Jawaban:

19

Saya harap seseorang masih tertarik dengan solusi untuk masalah ini. ;) Kami memiliki masalah yang sama di perusahaan kami dan saya mulai menulis naskah untuk ini.

Saya menulis posting blog tentang hal itu dengan kode sumber dan tangkapan layar .

Saya juga membagikannya di bawah ...

masukkan deskripsi gambar di sini

Dan kodenya: (Pastikan untuk memeriksa situs saya untuk pembaruan selanjutnya)

#!/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
sumber
6

Anda dapat menggunakan opsi -e untuk mencetak header ethernet, kemudian Anda dapat menghubungkan alamat MAC src / dst dengan antarmuka jaringan Anda;).

Cip
sumber
Menggunakan -ehanya mencetak satu alamat MAC pada setiap baris. Untuk paket yang masuk itu adalah sumber MAC yang tidak sangat berguna dalam mengidentifikasi antarmuka mana yang tiba.
kasperd
1

Saya juga tidak tahu jawaban untuk itu. Saya tidak menemukan opsi untuk itu, tidak dapat mengingat pernah melihatnya, dan saya cukup yakin bahwa format tcpdump tidak menyertakan pengenal antarmuka. Saya pikir Anda harus memulai satu contoh tcpdump untuk setiap antarmuka dan masuk ke file masing-masing.

Jeff Ferland
sumber
Saya setuju. Biasanya ketika saya mengendus lalu lintas, saya sudah tahu dari mana lalu lintas itu berasal atau ke mana ia pergi. Jika saya harus mencari tahu, saya punya ikan yang lebih besar untuk digoreng dulu ...
Corey S.
2
Saya sangat membutuhkan fungsi ini sangat sering. Saya memiliki beberapa antarmuka, banyak antarmuka vlan, dengan IGP dan BGP di atas ini. Mencari tahu bagaimana paket mengalir sangat penting sangat sering. Saya dapat secara manual memeriksa antarmuka keluar dengan memeriksa tabel routing saat ini. Tetapi jika saya harus menemukan cara paket berasal dari internet, kadang-kadang saya harus melakukan pengecekan buta, hanya dengan memulai tcpdump pada antarmuka yang paling mungkin. :(
mdrozdziel
1

Jika Anda menjalankan di Mac, ada -kopsi untuk tcpdumpjika Anda menggunakan antarmuka pktap, yang menampilkan nama antarmuka di antara metadata lain yang bermanfaat.

   -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
sumber
1

Untuk menambah skrip bash hebat Sebastian Haas. Saya harus menyederhanakan skripnya karena gagal pada baris ini tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Meskipun tidak sefleksibel script aslinya, ini lebih cenderung berjalan dalam sistem linux yang dipreteli.

#!/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;

Anda juga mungkin tertarik dengan tiket masalah github saat ini mengenai penghapusan fitur ini di https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
sumber
0

Dengan asumsi ini ada di Linux, Anda bisa menambahkan aturan iptables agar sesuai dengan paket yang Anda cari dan mencatatnya. Log Iptables termasuk antarmuka masuk dan keluar, antara lain.

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

Sesuaikan -c sesuai kebutuhan.

Nathan
sumber
0

dengan memodifikasi garis deteksi antarmuka, Anda dapat menghilangkan antarmuka alias-address di linux. contoh di bawah ini ..

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

berubah menjadi

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