これは非常に些細な問題のようですが、いくつか検索を行った後、答えを見つけることができません。インターフェースの説明として「any」を使用してtcpdumpを実行できます。つまり、
# tcpdump -i any -n Host 192.168.0.1
表示されたパケットがキャプチャされたインターフェイスをtcpdumpに表示させる方法はありますか?
更新:
より多くの人がこれはおそらくバニラtcpdumpでは不可能であることを確認したので、誰かが言及された問題の解決策を提案できますか?おそらく別のスニファーですか?
一般的な問題は次のとおりです。50のインターフェースを持つシステムで、特定のIPアドレスからのパケットの受信インターフェースを決定します。
誰かがまだ問題の解決策に興味を持っているといいのですが。 ;)私たちの会社でも同じ問題があり、私はこのためのスクリプトを書き始めました。
ソースコードとスクリーンショットを添えてブログ記事を書きました 。
以下でも共有しています...
そしてコード:(私のサイトで将来の更新を確認してください)
#!/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
-eオプションを使用してイーサネットヘッダーを出力し、src/dst MACアドレスをネットワークインターフェイスと関連付けることができます;)。
Macで実行している場合は、-k
オプションをtcpdump
に追加した場合、pktapインターフェースを使用すると、他の有用なメタデータの中でインターフェース名がダンプされます。
-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.
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の問題チケットにも興味があるかもしれません。
それに対する答えも知りません。私はそのためのオプションを見つけることができず、これを見たことを思い出すことはできません。むしろ、tcpdump形式にインターフェイス識別子が含まれていないことは確かです。インターフェイスごとに1つのtcpdumpインスタンスを開始し、それぞれのファイルにログを記録する必要があると思います。
for interface in `ifconfig | grep '^[a-z0-9]' | awk '{print $1}'`;do echo $interface;tcpdump -i $interface -nn -c 25;done
必要に応じて-cを調整します。
インターフェース検出行を変更することで、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}')
これがLinux上にあると想定すると、探しているパケットに一致するiptablesルールを追加して、ログに記録できます。 Iptablesログには、とりわけ、入力インターフェースと出力インターフェースが含まれます。