tcpdump出力フローでインターフェイスを表示する方法は?


20

これは非常に些細な問題のように思えますが、いくつかの検索の後、私は答えを見つけることができません。インターフェイス記述として「any」を使用してtcpdumpを実行できます。

 # tcpdump -i any -n host 192.168.0.1

パケットがキャプチャされた表示インターフェイスをtcpdumpに強制する方法はありますか?

更新:

これはおそらくバニラtcpdumpでは不可能であることを多くの人々が確認したため、誰かが言及された問題の解決策を提案できますか?おそらく違うスニファ?

一般的な問題は次のとおりです。50個のインターフェイスを持つシステムで、特定のIPアドレスからのパケットの受信インターフェイスを決定します。

回答:


19

誰かがまだ問題の解決に興味を持っていることを願っています。;)私たちの会社でも同じ問題がありました。私はこのためのスクリプトを書き始めました。

ソースコードとスクリーンショットでそれに関するブログ投稿を書きました

私も下で共有しました...

ここに画像の説明を入力してください

そしてコード:(今後の更新については必ず私のサイトを確認してください)

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

6

-eオプションを使用してイーサネットヘッダーを出力し、src / dst MACアドレスをネットワークインターフェイスと関連付けることができます;)。


を使用-eすると、各行に1つのMACアドレスのみが印刷されます。着信パケットの場合、ソースMACであるため、どのインターフェイスに到着したかを識別するのにあまり役立ちません。
カスペルド

1

それに対する答えも知りません。私はそれのためのオプションを見つけず、それを見たことを思い出すことができず、tcpdump形式にインターフェース識別子が含まれていないことをかなり確信しています。インターフェイスごとに1つのtcpdumpインスタンスを起動し、それぞれのファイルにログを記録する必要があると思います。


私は同意します。通常、トラフィックをスニッフィングしているとき、トラフィックがどこから来ているのか、どこへ行くのかをすでに知っています。私はフィギュアそのうちに持っている場合は、私が...最初の稚魚に大きな魚を持っている
コーリーS.

2
私はこの機能が本当に頻繁に必要です。IGPとBGPを使用した複数のインターフェイス、多くのVLANインターフェイスがあります。パケットがどのように流れているかを知ることは非常に頻繁に必要です。現在のルーティングテーブルを調べることにより、送信インターフェイスを手動で確認できます。しかし、インターネットからパケットが来る方法を見つけなければならない場合、たぶんほとんどの可能性のあるインターフェースでtcpdumpを起動するだけで、ブラインドチェックを行わなければなりません。:(
mdrozdziel

1

Macで実行している場合は、他の便利なメタデータの中でインターフェイス名をダンプするpktapインターフェイスを使用する-kオプションがありますtcpdump

   -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.

1

Sebastian Haasのすばらしいbashスクリプトに追加します。この行で失敗したので、私は彼のスクリプトを単純化する必要がありましたtcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &

元のスクリプトほど柔軟ではありませんが、必要最低限​​のLinuxシステムで実行される可能性が高くなります。

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

また、https://github.com/the-tcpdump-group/tcpdump/issues/296でこの機能の省略に関する現在のgithub発行チケットに興味があるかもしれません。


0

これがLinux上にあると仮定すると、探しているパケットに一致するiptablesルールを追加してログに記録できます。Iptablesログには、特に入力インターフェースと出力インターフェースが含まれます。


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

必要に応じて-cを調整します。


0

インターフェイス検出行を変更することにより、Linuxのエイリアスアドレスインターフェイスを削除できます。以下のサンプル。

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

への変更

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.