hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

tcpdumpの使い方(パケットファイルの切り替え方法)



1 はじめに

tcpdumpを実行すると、採取したパケットがパケットファイルに保存されます。 保存するディレクトリには容量の制限があるため、そのままtcpdumpを実行し続けることはできません。 また、途中でtcpdumpを終了すると、採取したいパケットがパケットファイルに保存できません。 そのため、パケットファイルをリングバッファのように順次切り替えながら使う必要があります。 ここでは、パケットファイルを時間で切り替える方法とサイズで切り替える方法について説明します。

なお、tcpdumpの基本的な使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

2 検証環境

2. 1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。

                          192.168.2.0/24
client(ens33) -------------------------------------(ens33) server
        .115                                       .120

2.2 版数

サーバ、クライアントともに下記版数です。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname  -r
3.10.0-1160.el7.x86_64

2.3 tcpdumpの版数

コマンドの確認方法がわからないので、パッケージ版数を以下に示します。

[root@server ~]# rpm -qa|grep tcpdump
tcpdump-4.9.2-4.el7_7.1.x86_64

3 時間でパケットファイルを切り替える方法

一定の時間が経過したら、tcpdumpが出力するパケットファイルを切り替える方法について説明します。

3.1 事前準備

パケットファイルを保存するディレクトリを作成します。

[root@server ~]# mkdir /tcpdump

ディレクトリの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /tcpdump

ディレクトリの所有者を確認します。 ディレクトリの所有者がtcpdumpになっていることがわかります。

[root@server ~]# ls -ld /tcpdump/
drwxr-xr-x. 2 tcpdump tcpdump 6 12月 24 18:30 /tcpdump/

次に、ディレクトリに保存できるパケットファイルの数を3に制限するシェルスクリプトを作成します。

[root@server ~]# vi /usr/local/bin/tcpdump_time_limit.sh
[root@server ~]# cat /usr/local/bin/tcpdump_time_limit.sh
#!/usr/bin/bash
file_num=$(ls /tcpdump/tcpdump*.cap|wc -l)

if [ $file_num -gt 3 ]; then
  file_name=$(ls -tr /tcpdump/tcpdump*.cap|head -n 1)
  rm -f $file_name
fi

シェルスクリプトの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /usr/local/bin/tcpdump_time_limit.sh

シェルスクリプトパーミッションを744に変更します。

[root@server ~]# chmod 744 /usr/local/bin/tcpdump_time_limit.sh

シェルスクリプトの所有者、パーミッションを確認します。

[root@server ~]# ls -l /usr/local/bin/tcpdump_time_limit.sh
-rwxr--r--. 1 tcpdump tcpdump 165 12月 24 18:31 /usr/local/bin/tcpdump_time_limit.sh

3.2 実験結果

tcpdumpディレクトリに移動します。

[root@server ~]# cd /tcpdump/
[root@server tcpdump]#

tcpdumpを実行します。 このとき、-Gオプションを指定して、5秒毎にパケットファイルを切り替えます。

[root@server tcpdump]# tcpdump -i ens33 -G 5 -w tcpdump_%Y%m%d_%H%M%S.cap -z /usr/local/bin/tcpdump_time_limit.sh

もう1つターミナルを開きます。lsコマンドを実行します。 パケットファイルの末尾2桁が秒を表しています。

[root@server tcpdump]# ls -l
合計 8
-rw-r--r--. 1 tcpdump tcpdump 1860 12月 24 18:44 tcpdump_20211224_184426.cap
-rw-r--r--. 1 tcpdump tcpdump  766 12月 24 18:44 tcpdump_20211224_184431.cap
-rw-r--r--. 1 tcpdump tcpdump    0 12月 24 18:44 tcpdump_20211224_184437.cap

再度lsコマンドを実行します。 5秒毎にパケットファイルが切り替わっていることがわかります。

[root@server tcpdump]# ls -l
合計 8
-rw-r--r--. 1 tcpdump tcpdump 1860 12月 24 18:44 tcpdump_20211224_184426.cap
-rw-r--r--. 1 tcpdump tcpdump  766 12月 24 18:44 tcpdump_20211224_184431.cap
-rw-r--r--. 1 tcpdump tcpdump    0 12月 24 18:44 tcpdump_20211224_184437.cap

4 サイズでパケットファイルを切り替える方法

パケットファイルのサイズが指定したサイズになったら、パケットファイルを別のパケットファイルに切り替える方法について説明します。

4.1 事前準備

パケットファイルを保存するディレクトリを作成します。

[root@server ~]# mkdir /tcpdump

ディレクトリの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /tcpdump

ディレクトリの所有者を確認します。 ディレクトリの所有者がtcpdumpになっていることがわかります。

[root@server ~]# ls -ld /tcpdump/
drwxr-xr-x. 2 tcpdump tcpdump 6 12月 24 19:33 /tcpdump/

次に、ディレクトリに保存できるパケットファイルの数を3に制限するシェルスクリプトを作成します。 3章で作成したシェルスクリプトとパケットファイルの指定方法が微妙に違うので注意してください。

[root@server ~]# vi /usr/local/bin/tcpdump_size_limit.sh
[root@server ~]# cat /usr/local/bin/tcpdump_size_limit.sh
#!/usr/bin/bash
file_num=$(ls /tcpdump/tcpdump.cap* | wc -l)

if [ $file_num -gt 3 ]; then
  file_name=$(ls -tr /tcpdump/tcpdump.cap* | head -n 1)
  rm -f $file_name
fi

シェルスクリプトの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /usr/local/bin/tcpdump_size_limit.sh

シェルスクリプトパーミッションを744に変更します。

[root@server ~]# chmod 744 /usr/local/bin/tcpdump_size_limit.sh

シェルスクリプトの所有者、パーミッションを確認します。

[root@server ~]# ls -l /usr/local/bin/tcpdump_size_limit.sh
-rwxr--r--. 1 tcpdump tcpdump 165 12月 24 19:34 /usr/local/bin/tcpdump_size_limit.sh

4.2 実験結果

tcpdumpディレクトリに移動します。

[root@server ~]# cd /tcpdump/
[root@server tcpdump]#

tcpdumpを実行します。 このとき、-Cオプションを指定して、パケットファイルのサイズ(M単位)を指定します。 ここでは、パケットファイルのサイズを1Mに指定しています。

[root@server tcpdump]# tcpdump -i ens33 -C 1 -w tcpdump.cap -z /usr/local/bin/tcpdump_size_limit.sh

サーバに対してflood pingを実行します。 pingの使い方は、 pingコマンドの使い方 - hana_shinのLinux技術ブログを参照ください。

[root@client ~]# ping -f 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.

lsコマンドを実行します。 パケットファイルのサイズが1Mであることがわかります。 なお、サイズを指定した場合、パケットファイルの拡張子が"cap数字"となってしまいます。 拡張子をcapにできる方法をご存じの方がいましたら、教えてください。

[root@server tcpdump]# ls -l
合計 2408
-rw-r--r--. 1 tcpdump tcpdump 1000070 12月 24 20:08 tcpdump.cap16
-rw-r--r--. 1 tcpdump tcpdump 1000066 12月 24 20:08 tcpdump.cap17
-rw-r--r--. 1 tcpdump tcpdump  458752 12月 24 20:08 tcpdump.cap18
[root@server tcpdump]# ls -l
合計 2012
-rw-r--r--. 1 tcpdump tcpdump 1000110 12月 24 20:09 tcpdump.cap22
-rw-r--r--. 1 tcpdump tcpdump 1000086 12月 24 20:09 tcpdump.cap23
-rw-r--r--. 1 tcpdump tcpdump   53248 12月 24 20:09 tcpdump.cap24

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ