tcpdump
送信 UDP パケットと受信 UDP パケットの数を (セットアップ時間内に) カウントすることは可能ですか?
の経験があまりないのでtcpdump
、その方法についてのアドバイスは非常に役立ちます。timeout
一定時間後にプロセスを停止したい場合はコマンドがよいと読んだので、tcpdump
自分の時間が経ったら停止しようかと考えていました。
しかし、送信パケットと受信パケットの数をカウントし、UDP パケットのみをフィルタリングするにはどうすればよいでしょうか?
答え1
tcpdump
私はこれに(または)は使いません。代わりに、一定期間のパケット数をカウントするためにtshark
を使います。iptables
# Prepare two sets of counters and set up the rules
#
iptables -N udp_in
iptables -N udp_out
iptables -A udp_in
iptables -A udp_out
iptables -A OUTPUT --protocol udp -j udp_out
iptables -A INPUT --protocol udp -j udp_in
生理開始時にカウンターをリセットするには次のようにします
# Reset the counters
#
iptables -Z udp_in
iptables -Z udp_out
生理終了時のカウンターは次のように確認できます
# Look at the counters
#
packets_in=$(iptables -nvL udp_in | awk '/all/{print $1}')
packets_out=$(iptables -nvL udp_out | awk '/all/{print $1}')
echo "in=$packets_in, out=$packets_out"
Z
フラグを同時に指定することで、カウンタを読み取り、すぐにリセットすることができます。例えば
packets_in=$(iptables -nvLZ udp_in | awk '/all/{print $1}')
ビットをまとめて、必要な追加のiptablesチェーンをすでに作成していると仮定すると(上記を参照)、次のようなものを使用できます。
# Reset the counters
#
iptables -Z udp_in
iptables -Z udp_out
# Wait 10 seconds
#
period=10
sleep "$period"
# Look at the counters
#
packets_in=$(iptables -nvL udp_in | awk '/all/{print $1}')
packets_out=$(iptables -nvL udp_out | awk '/all/{print $1}')
# Report the results
#
echo "During the last $period seconds we saw $packets_in UDP packet(s) in and $packets_out UDP packet(s) out."
答え2
man tcpdump
必要な情報を提供します。tcpdumpのWebページには、マニュアルページ。
説明には、tcpdump
パケットのキャプチャが完了すると、キャプチャされたパケットの数、フィルターによって受信されたパケットの数、カーネルによってドロップされたパケットの数を報告すると書かれています。
フィルタリング (特定のタイプのパケットのみを検索する方法) ははるかに困難になる可能性がありますが、EXAMPLES セクションには、必要なフィルターが例だけudp
であるという十分なヒントが記載されているはずです。
したがって、正しいフィルターがわかったら、tcpdump
withを使用してtimeout
定義した時間だけフィルターを実行し、 killtcpdump
するとパケットの数を取得できます。
timeout 20 tcpdump udp
これにより、udp の tcpdump フィルタリングが実行され、20 秒後に tcpdump が強制終了されます。