LinuxOSにおいてインターフェース上のリアルタイムのトラフィックデータを取得する際に「tcpdump」コマンドを実施します。
- 1 「tcpdump」コマンドの使い方(Linux)
- 1.1 「tcpdump」コマンドをインストールする
- 1.2 「tcpdump」コマンドはネットワークインターフェース上に流れるトラフィックデータをリアルタイムで表示する
- 1.3 「tcpdump」コマンドのオプションと条件
- 1.4 「-c」オプションで10個のパケットを取得して終了する
- 1.5 特定のポートに対しての通信状況を解析したい
- 1.6 リモートホストからローカルホストの対象ポートへのパケットを取得
- 1.7 取得したパケット情報をファイル「tcpdump.log」へ保存
- 1.8 ファイル「tcpdump.log」へ保存したパケット情報を確認
- 1.9 インターフェースを指定してエラーが出る際は「-D」オプションを確認
- 1.10 「tcpdump」コマンドオプション
「tcpdump」コマンドの使い方(Linux)
「tcpdump」コマンドはネットワークインターフェースに流れるリアルタイムのトラフィックデータを取得することができます。
どのようなパケットが流れているのか、ある特定のパケット・プロトコルのデータを確認したいときなどに便利なコマンドです。
障害などの切り分けにも使われるので、仕事内容では結構使用するコマンドとなります。
「tcpdump」コマンドをインストールする
「tcpdump」コマンドは以下のコマンドでインストールします。
$ dnf -y install tcpdump
or
$ yum -y install tcpdump
「tcpdump」コマンドはネットワークインターフェース上に流れるトラフィックデータをリアルタイムで表示する
「tcpdump」コマンドはオプションを何も指定せず、そのままで実行すると取得可能なパケットを全て取得してしまいます。
以下のように通常の「tcpdump」コマンドを実行するの全てのトラフィックデータが表示され見にくくなってしまいます。
$ tcpdump dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 08:39:11.737186 IP centos8.ssh > _gateway.63208: Flags [P.], seq 2547945943:2547946131, ack 4013766627, win 501, options [nop,nop,TS val 3436244883 ecr 327791393], length 188 08:39:11.737225 IP _gateway.63208 > centos8.ssh: Flags [.], ack 188, win 706, options [nop,nop,TS val 327791394 ecr 3436244883], length 0 08:39:11.737871 IP centos8.40957 > 192.168.65.5.domain: 3821+ PTR? 1.0.17.172.in-addr.arpa. (41) 08:39:11.740936 IP 192.168.65.5.domain > centos8.40957: 3821 NXDomain 0/0/0 (41) 08:39:11.741901 IP centos8.58466 > 192.168.65.5.domain: 52478+ PTR? 5.65.168.192.in-addr.arpa. (43) 08:39:11.741902 IP centos8.ssh > _gateway.63208: Flags [P.], seq 188:544, ack 1, win 501, options [nop,nop,TS val 3436244887 ecr 327791394], length 356 08:39:11.741943 IP _gateway.63208 > centos8.ssh: Flags [.], ack 544, win 705, options [nop,nop,TS val 327791398 ecr 3436244887], length 0 08:39:11.745462 IP 192.168.65.5.domain > centos8.58466: 52478 NXDomain 0/0/0 (43) 08:39:11.745847 IP centos8.ssh > _gateway.63208: Flags [P.], seq 544:1236, ack 1, win 501, options [nop,nop,TS val 3436244891 ecr 327791398], length 692 ------中略------
なので、「オプション」や「条件」を使用して、必要なトラフィック情報だけを取得するようにしましょう。
どこのインターフェースで、どのプロトコルの、どの対象アドレスの情報を取得したいと言う時など特定の条件を絞った出力をすることが可能になります。
以下では「tcpdump」のオプションと条件を表でまとめました。
「tcpdump」コマンドのオプションと条件
「tcpdump」で使用する「オプション」と「条件」をまとめました。
できる限り使用頻度が高いものをまとめています。
主なオプション
名称 | 説明 |
-c (count) | (count)個のパケットを取得して終了 |
-i (if) | インターフェース(if)を指定 |
-n | IPアドレスを、ホスト名に変換しない |
-nn | 「IPアドレス/ポート番号」を「ホスト名/プロトコル名」に変換しない |
-N | ホスト名のドメイン名を表示しない |
-q | トラフィックデータの表示を簡素化する |
-v -vv -vvv |
詳細な形式でトラフィックデータを表示する。vの数ほどより詳細なデータを表示する |
-w (wfile) | 受信したトラフィックデータをファイル(wfile)へ保存する |
-r (wfile) | パケットを「-w」オプションで作成したファイル(wfile)から読み込む |
-T (type) | パケットタイプを指定して表示。(type)には、cnfp,rpc,rtp,rtcp,snmp,vat,wbなどの指定が可能 |
-T (type) | パケットタイプを指定して表示。(type)には、cnfp,rpc,rtp,rtcp,snmp,vat,wbなどの指定が可能 |
条件
型
条件文 | 説明 | 使用例 |
host (host名) | ホスト名、もしくはIPアドレス | host example.co.jp host 192.168.0.1 |
net (address) [mask (mask)] | net(ネットワークアドレス) mask(ネットマスク) |
net 192.168.0.1 net 192.168.0.1 mask 255.255.255.0 |
port (port) | ポート番号、サービス名 | port 22, port ftp |
パケットの送信元・宛先
条件文 | 説明 |
src (type) | パケット送信元のtype(ホスト名、IPアドレスなど) |
dst (type) | パケットの宛先のtype(ホスト名、IPアドレスなど) |
プロトコル
条件文 | 説明 |
ether | イーサネット |
ip | IP(IPv4) |
ip6 | IP(IPv6) |
arp | ARP |
tcp | TCP |
udp | UDP |
icmp | ICMP |
icmp6 | ICMPv6 |
論理演算子
条件文 | 説明 |
and | 左右の条件が同時に一致する |
or | 左右の条件のいずれかに一致する |
not | 条件に一致しない |
また、以下で「tcpdump」のオプションを使った使用例を紹介します。
「-c」オプションで10個のパケットを取得して終了する
以下では、「tcpdump」コマンド実行後最初の10行までを表示するときに使用した例となります。
$ tcpdump -c 10 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 08:44:55.545128 IP centos8.ssh > _gateway.63208: Flags [P.], seq 2551817675:2551817735, ack 4013769803, win 501, options [nop,nop,TS val 3436588697 ecr 328135161], length 60 08:44:55.545200 IP _gateway.63208 > centos8.ssh: Flags [.], ack 60, win 706, options [nop,nop,TS val 328135208 ecr 3436588697], length 0 08:44:55.545228 IP centos8.ssh > _gateway.63208: Flags [P.], seq 60:248, ack 1, win 501, options [nop,nop,TS val 3436588697 ecr 328135208], length 188 08:44:55.545242 IP _gateway.63208 > centos8.ssh: Flags [.], ack 248, win 706, options [nop,nop,TS val 328135208 ecr 3436588697], length 0 08:44:55.545700 IP centos8.46079 > 192.168.65.5.domain: 26964+ PTR? 1.0.17.172.in-addr.arpa. (41) 08:44:55.549523 IP 192.168.65.5.domain > centos8.46079: 26964 NXDomain 0/0/0 (41) 08:44:55.550408 IP centos8.ssh > _gateway.63208: Flags [P.], seq 248:892, ack 1, win 501, options [nop,nop,TS val 3436588703 ecr 328135208], length 644 08:44:55.550418 IP centos8.37385 > 192.168.65.5.domain: 48994+ PTR? 5.65.168.192.in-addr.arpa. (43) 08:44:55.550453 IP _gateway.63208 > centos8.ssh: Flags [.], ack 892, win 704, options [nop,nop,TS val 328135214 ecr 3436588703], length 0 08:44:55.554730 IP 192.168.65.5.domain > centos8.37385: 48994 NXDomain 0/0/0 (43) 10 packets captured 11 packets received by filter 0 packets dropped by kernel
特定のポートに対しての通信状況を解析したい
以下の例では、22番ポートへのトラフィックデータの解析例です。
172.17.0.1 – 172.17.0.2.22の間で通信をしていることが確認できます。
また、オプション「-nn」を使用することで、IPアドレスとプロトコル番号も表示されています。
$ tcpdump -nn port 22 -c 10 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 13:09:43.272168 IP 172.17.0.1.63208 > 172.17.0.2.22: Flags [.], ack 2560639495, win 706, options [nop,nop,TS val 339312830 ecr 3447766319], length 0 13:09:43.272223 IP 172.17.0.2.22 > 172.17.0.1.63208: Flags [P.], seq 1:189, ack 0, win 501, options [nop,nop,TS val 3447766319 ecr 339312830], length 188 13:09:43.272237 IP 172.17.0.1.63208 > 172.17.0.2.22: Flags [.], ack 189, win 706, options [nop,nop,TS val 339312830 ecr 3447766319], length 0 13:09:43.272503 IP 172.17.0.2.22 > 172.17.0.1.63208: Flags [P.], seq 189:673, ack 0, win 501, options [nop,nop,TS val 3447766319 ecr 339312830], length 484 13:09:43.272537 IP 172.17.0.1.63208 > 172.17.0.2.22: Flags [.], ack 673, win 705, options [nop,nop,TS val 339312830 ecr 3447766319], length 0 13:09:43.272812 IP 172.17.0.2.22 > 172.17.0.1.63208: Flags [P.], seq 673:1013, ack 0, win 501, options [nop,nop,TS val 3447766320 ecr 339312830], length 340 13:09:43.272836 IP 172.17.0.1.63208 > 172.17.0.2.22: Flags [.], ack 1013, win 705, options [nop,nop,TS val 339312831 ecr 3447766320], length 0 13:09:43.273142 IP 172.17.0.2.22 > 172.17.0.1.63208: Flags [P.], seq 1013:1209, ack 0, win 501, options [nop,nop,TS val 3447766320 ecr 339312831], length 196 13:09:43.273162 IP 172.17.0.1.63208 > 172.17.0.2.22: Flags [.], ack 1209, win 706, options [nop,nop,TS val 339312831 ecr 3447766320], length 0 13:09:43.273699 IP 172.17.0.2.22 > 172.17.0.1.63208: Flags [P.], seq 1209:1549, ack 0, win 501, options [nop,nop,TS val 3447766321 ecr 339312831], length 340
リモートホストからローカルホストの対象ポートへのパケットを取得
以下では「and」条件を使った「tcpdump」コマンドの実行例となります。
リモートホスト「172.17.0.1」からローカルホストの22番ポートに送られるパケット情報を取得します。
$ tcpdump port 22 and src host 172.17.0.1
取得したパケット情報をファイル「tcpdump.log」へ保存
「tcpdump」で取得した出力を「tcpdump.log」ファイルへ保存します。
tcpdumpの結果を保存したい場合におすすめです。
$ tcpdump -w tcpdump.log
ファイル「tcpdump.log」へ保存したパケット情報を確認
取得したtcpdumpファイルの中身を確認します。
$ tcpdump -r tcpdump.log
インターフェースを指定してエラーが出る際は「-D」オプションを確認
インターフェースを指定してエラーが発生する場合は以下のコマンドを実行し、リストを確認します。
今回の例では1番に通信で利用している「eth0」が来ていますが、まれに異なるインターフェースが表示される場合があります。
その時は以下のリストから対象のインターフェースリストの番号を指定して実行しましょう。
$ tcpdump -D 1.eth0 [Up, Running] 2.lo [Up, Running, Loopback] 3.any (Pseudo-device that captures on all interfaces) [Up, Running] 4.docker0 [Up] 5.bluetooth-monitor (Bluetooth Linux Monitor) [none] 6.nflog (Linux netfilter log (NFLOG) interface) [none] 7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none] 8.tunl0 [none] 9.ip6tnl0 [none]
「tcpdump」コマンドオプション
「tcpdump」コマンドのオプションは以下の通りとなります。
$ tcpdump -h tcpdump version 4.9.3 libpcap version 1.9.1 (with TPACKET_V3) OpenSSL 1.1.1g FIPS 21 Apr 2020 Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
「tcpdump」コマンドの使い方は以上となります。
オプションや条件をつけることでトラフィックデータを表示の仕方が変わってくるので色々と試してみましょう。
エンジニアのオンライン学習
エンジニアにおすすめのオンライン教材比較 | |
ITエンジニアが自宅で学習ができるオンラインスクール比較 | |