hana_shinのLinux技術ブログ

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

tsharkコマンドの使い方



1 tsharkコマンドとは?

tsharkは、WiresharkCLI(Command Line Interface)版です。tcpdumpよりtsharkの方がより細かな条件を指定してパケットの絞り込みができるので、使い勝手が良いとかんじました。

2 検証環境

2.1 ネットワーク構成

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

                          192.168.122.0/24
client(eth0) --------------------------------------------(eth0) server
           .181                                         .216

2.2 版数

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

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

3 インストール方法

サーバにwiresharkパッケージをインストールします。

[root@server ~]# yum -y install wireshark

版数を確認します。

[root@server ~]# tshark -v
TShark 1.10.14 (Git Rev Unknown from unknown)
-snip-

4 オプション一覧

オプションは以下のとおりです。

[root@server ~]# tshark -h
TShark 1.10.14 (Git Rev Unknown from unknown)
Dump and analyze network traffic.
See http://www.wireshark.org for more information.

Copyright 1998-2015 Gerald Combs <gerald@wireshark.org> and contributors.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Usage: tshark [options] ...

Capture interface:
  -i <interface>           name or idx of interface (def: first non-loopback)
  -f <capture filter>      packet filter in libpcap filter syntax
  -s <snaplen>             packet snapshot length (def: 262144)
  -p                       don't capture in promiscuous mode
  -I                       capture in monitor mode, if available
  -B <buffer size>         size of kernel buffer (def: 4MB)
  -y <link type>           link layer type (def: first appropriate)
  -D                       print list of interfaces and exit
  -L                       print list of link-layer types of iface and exit

Capture stop conditions:
  -c <packet count>        stop after n packets (def: infinite)
  -a <autostop cond.> ...  duration:NUM - stop after NUM seconds
                           filesize:NUM - stop this file after NUM KB
                              files:NUM - stop after NUM files
Capture output:
  -b <ringbuffer opt.> ... duration:NUM - switch to next file after NUM secs
                           filesize:NUM - switch to next file after NUM KB
                              files:NUM - ringbuffer: replace after NUM files
Input file:
  -r <infile>              set the filename to read from (no stdin!)

Processing:
  -2                       perform a two-pass analysis
  -R <read filter>         packet Read filter in Wireshark display filter syntax
  -Y <display filter>      packet displaY filter in Wireshark display filter syntax
  -n                       disable all name resolutions (def: all enabled)
  -N <name resolve flags>  enable specific name resolution(s): "mnNtC"
  -d <layer_type>==<selector>,<decode_as_protocol> ...
                           "Decode As", see the man page for details
                           Example: tcp.port==8888,http
  -H <hosts file>          read a list of entries from a hosts file, which will
                           then be written to a capture file. (Implies -W n)
Output:
  -w <outfile|->           write packets to a pcap-format file named "outfile"
                           (or to the standard output for "-")
  -C <config profile>      start with specified configuration profile
  -F <output file type>    set the output file type, default is pcapng
                           an empty "-F" option will list the file types
  -V                       add output of packet tree        (Packet Details)
  -O <protocols>           Only show packet details of these protocols, comma
                           separated
  -P                       print packet summary even when writing to a file
  -S <separator>           the line separator to print between packets
  -x                       add output of hex and ASCII dump (Packet Bytes)
  -T pdml|ps|psml|text|fields
                           format of text output (def: text)
  -e <field>               field to print if -Tfields selected (e.g. tcp.port, col.Info);
                           this option can be repeated to print multiple fields
  -E<fieldsoption>=<value> set options for output when -Tfields selected:
     header=y|n            switch headers on and off
     separator=/t|/s|<char> select tab, space, printable character as separator
     occurrence=f|l|a      print first, last or all occurrences of each field
     aggregator=,|/s|<char> select comma, space, printable character as
                           aggregator
     quote=d|s|n           select double, single, no quotes for values
  -t a|ad|d|dd|e|r|u|ud    output format of time stamps (def: r: rel. to first)
  -u s|hms                 output format of seconds (def: s: seconds)
  -l                       flush standard output after each packet
  -q                       be more quiet on stdout (e.g. when using statistics)
  -Q                       only log true errors to stderr (quieter than -q)
  -g                       enable group read access on the output file(s)
  -W n                     Save extra information in the file, if supported.
                           n = write network address resolution information
  -X <key>:<value>         eXtension options, see the man page for details
  -z <statistics>          various statistics, see the man page for details

Miscellaneous:
  -h                       display this help and exit
  -v                       display version info and exit
  -o <name>:<value> ...    override preference setting
  -K <keytab>              keytab file to use for kerberos decryption
  -G [report]              dump one of several available reports and exit
                           default report="fields"
                           use "-G ?" for more help

5 事前準備(一般ユーザの作成)

rootユーザでtsharkを実行すると、下記メッセージが出力されるので、本記事では一般ユーザでtsharkを実行します。

[root@server ~]# tshark -i eth0 -n -Y 'tcp.port==11111'
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'

user1を追加します。なお、ユーザの追加、削除は、useradd/groupaddコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# useradd user1

idコマンドを実行して、user1の各種IDを確認します。

[root@server ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1)

user1のセカンダリーグループにwiresharkグループを追加します。

[root@server ~]# usermod -a -G wireshark user1

idコマンドを実行します。user1のセカンダリーグループにwiresharkグループが追加されたことがわかります。

[root@server ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),995(wireshark)

一般ユーザに切り替えます。

[root@server ~]# su - user1

一般ユーザで実行すると、以下のように警告が表示されなくなります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.port==11111'
Capturing on 'eth0'

なお、user1からwiresharkグループの削除は、以下のようにroot権限で実行します。

[root@server ~]# usermod -a -G wireshark user1

6 インタフェース一覧を表示する方法(-D)

-Dはパケットキャプチャに指定できるインタフェース一覧を表示するオプションです。

[user1@server ~]$ tshark -D
1. eth0
2. nflog
3. nfqueue
4. any
5. lo (Loopback)

7 Capture vs Display Filters

tsharkには、2つのフィルタがあります。本記事では、大部分の説明にDisplayフィルタを使います。

フィルタ名 概要 オプション 書式 フィルタの例 参考情報
Captureフィルタ 採取するパケット量を減らすために使用する。BPF syntaxに従う。tcpdumpでも使うことができるフィルタ -f tshark -f "Capture Filter" host 192.168.1.0 Tshark | Capture Filters
Display フィルタ Captureフィルタに比べ、詳細な条件でパケットの指定ができる -Y tshark -Y 'Display filter' tcp.flags.syn==1 Tshark | Display Filters

8 TCPパケットを絞り込む方法

以下の図はTCPコネクション確立時のパケットのやり取りを示したものです。この手順は、3 Way Handshakeと呼ばれています。7.2でSYNパケット、7.3でSYN+ACKパケットをキャプチャしてみます。

 client                                             server
   |                                                   |
   |                        SYN                        |
   |-------------------------------------------------->|
   |                        SYN+ACK                    |
   |<--------------------------------------------------|
   |                        ACK                        |
   |-------------------------------------------------->|
   |                                                   |

8.1 ポート番号で絞り込む方法

テスト用に使用するTCPの11111番ポートを解放します。なお、firewall-cmdコマンドの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=11111/tcp
success

次に、一般ユーザに切り替えてtsharkコマンドを実行します。表示するパケットをTCPの11111番ポートに絞り込んでみます。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.port==11111'
Capturing on 'eth0'

もう1つターミナルを開きます。そして、ncコマンドを実行します。なお、ncコマンドのインストール方法、使い方は、ncコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[user1@server ~]$ nc -kl 11111

lsofコマンドを実行します。ncプロセスがTCPの11111番ポートでListenしていることがわかります。なお、lsofコマンドのインストール方法、使い方はlsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[user1@server ~]$ lsof -c nc -a -i -a -nP
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      2723 user1    3u  IPv6  47150      0t0  TCP *:11111 (LISTEN)
nc      2723 user1    4u  IPv4  47151      0t0  TCP *:11111 (LISTEN)

クライアントでncコマンドを実行します。ncコマンドを実行すると、サーバとクライアントの間で3 Way Handshakeが実行され、TCPコネクションが確立されます。

[root@client ~]# nc 192.168.122.216 11111

tsharkコマンドの実行結果を確認すると、TCPの11111番ポートのパケットが表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.port==11111'
Capturing on 'eth0'
  3 2.193618268 192.168.122.181 -> 192.168.122.216 TCP 74 50130 > 11111 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1093318 TSecr=0 WS=128
  4 2.193656226 192.168.122.216 -> 192.168.122.181 TCP 74 11111 > 50130 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=1089335 TSecr=1093318 WS=128
  5 2.194571409 192.168.122.181 -> 192.168.122.216 TCP 66 50130 > 11111 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=1093319 TSecr=1089335

8.2 SYNフラグで絞り込む方法

SYNパケットのみを表示するようにしてみます。SYNパケットは、TCPヘッダのSYNフラグが1、ACKフラグが0のパケットになります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.flags.syn==1 and tcp.flags.ack==0'
Capturing on 'eth0'

サーバでncコマンドを実行します。

[user1@server ~]$ nc -kl 11111

クライアントでncコマンドを実行します。

[root@client ~]# nc 192.168.122.216 11111

SYNパケットのみが表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.flags.syn==1 and tcp.flags.ack==0'
Capturing on 'eth0'
 12 21.603307093 192.168.122.181 -> 192.168.122.216 TCP 74 50132 > 11111 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1140726 TSecr=0 WS=128

8.3 SYN+ACKフラグで絞り込む方法

SYN+ACKパケットのみ表示するようにしてみます。SYN+ACKパケットは、TCPヘッダのSYNフラグが1、ACKフラグが1のパケットになります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.flags.syn==1 and tcp.flags.ack==1'
Capturing on 'eth0'

サーバでncコマンドを実行します。

[user1@server ~]$ nc -kl 11111

クライアントでncコマンドを実行します。

[root@client ~]# nc 192.168.122.216 11111

SYN+ACKパケットのみ表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -n -Y 'tcp.flags.syn==1 and tcp.flags.ack==1'
Capturing on 'eth0'
 15 13.824986323 192.168.122.216 -> 192.168.122.181 TCP 74 11111 > 50134 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=1173489 TSecr=1177472 WS=128

9 ARPパケットを絞り込む方法

クライアントでarpingコマンドを実行すると、ARP requestがサーバに送信されます。そして、その応答として、ARP replyがサーバからクライアントに送信されます。8.1でARP request 、8.2でARP replyをキャプチしてみます。arpingコマンドの使い方は、arpingコマンドの使い方 - Qiitaを参照してください。今後hatenaに移行予定です。

 client                                             server
   |                                                   |
   |                      ARP request                  |
   |-------------------------------------------------->|
   |                      ARP reply                    |
   |<--------------------------------------------------|
   |                                                   |

9.1 ARP requestを絞り込む方法(arp.opcode==1)

ARP requestのみを表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'arp.opcode==1'
Capturing on 'eth0'

クライアントでarpingコマンドを実行して、ARP requestをサーバに送信します。

[root@client ~]# arping -c 1 -I eth0 192.168.122.216
ARPING 192.168.122.216 from 192.168.122.181 eth0
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.635ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

ARP requestが表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -Y 'arp.opcode==1'
Capturing on 'eth0'
 16 13.804617952 RealtekU_d0:e3:a7 -> Broadcast    ARP 42 Who has 192.168.122.216?  Tell 192.168.122.181

9.2 ARP replyパケットを絞り込む方法(arp.opcode==2)

ARP replyのみを表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'arp.opcode==2'
Capturing on 'eth0'

クライアントでarpingコマンドを実行して、ARP requestをサーバに送信します。

[root@client ~]# arping -c 1 -I eth0 192.168.122.216
ARPING 192.168.122.216 from 192.168.122.181 eth0
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  2.087ms
Sent 1 probes (1 broadcast(s))次はキャプチャ1にパケットを書き
Received 1 response(s)

ARP replyが表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -Y 'arp.opcode==2'
Capturing on 'eth0'
  8 10.417888942 RealtekU_6f:b0:ca -> RealtekU_d0:e3:a7 ARP 42 192.168.122.216 is at 52:54:00:6f:b0:ca

10 ICMPパケットを絞り込む方法

10.1 ICMP Echo requestを絞り込む方法(icmp.type==8)

ICMP Echo requestのみを表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==8'
Capturing on 'eth0'

クライアントでpingを実行します。宛先にサーバを指定します。なお、pingコマンドの使い方は、pingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# ping -c 1 192.168.122.216

ICMP Echo requestを確認することができます。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==8'
Capturing on 'eth0'
  6 8.660830070 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05b4, seq=1/256, ttl=64

10.2 ICMP Echo replyを絞り込む方法(icmp.type==0)

ICMP Echo replyのみを表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==0'
Capturing on 'eth0

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# ping -c 1 192.168.122.216

ICMP Echo replyが表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==0'
Capturing on 'eth0'
  7 9.499034114 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05b5, seq=1/256, ttl=64 (request in 6)

10.3 ICMP Echo request/replyを表示する方法

ICMP Echo request /replyのみを表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==0 or icmp.type==8'
Capturing on 'eth0'

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# ping -c 1 192.168.122.216

ICMP Echo request/replyを確認することができます。

[user1@server ~]$ tshark -i eth0 -Y 'icmp.type==0 or icmp.type==8'
Capturing on 'eth0'
  8 13.014091703 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05b6, seq=1/256, ttl=64
  9 13.014176543 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05b6, seq=1/256, ttl=64 (request in 8)

11 DNSパケットを絞り込む方法

DNSパケットのみを表示してみます。DNSパケットはUDPの53番ポートを使用します。

[user1@server ~]$ tshark -i eth0 -n -Y 'udp.port==53'
Capturing on 'eth0'

サーバでdigコマンドを実行します。なお、digコマンドのインストール方法、使い方はdigコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[user1@server ~]$ dig ntp.nict.jp +short
133.243.238.243
133.243.238.244
133.243.238.163
61.205.120.130
133.243.238.164

DNS query/responseパケットを確認することができます。

[user1@server ~]$ tshark -i eth0 -n -Y 'udp.port==53'
Capturing on 'eth0'
 20 15.622015640 192.168.122.216 -> 192.168.122.1 DNS 82 Standard query 0x9cf9  A ntp.nict.jp
 21 15.633936844 192.168.122.1 -> 192.168.122.216 DNS 162 Standard query response 0x9cf9  A 133.243.238.243 A 133.243.238.244 A 133.243.238.163 A 61.205.120.130 A 133.243.238.164

12 キャプチャファイルを自動で切り替える方法(-b)

-bは、パケットを保存しているキャプチャファイルを切り替えるオプションです。たとえば、キャプチャファイルのサイズが大きくなったので、別のキャプチャファイルに自動的に切り替える、といったことができます。

12.1 時間で切り替える方法(duration:NUM)

3秒経過すると、次のキャプチャファイルにパケットを書き込むようにします。

[user1@server ~]$ tshark -b duration:3 -f 'icmp' -w test.pcap
Capturing on 'eth0'

tsharkコマンド実行中、キャプチャファイルを確認すると、3秒毎に新しいキャプチャファイルが作成されていることがわかります。

[user1@server ~]$ ls -l
合計 12
-rw-------. 1 user1 user1 200  4月 27 11:20 test_00001_20220427112017.pcap
-rw-------. 1 user1 user1 200  4月 27 11:20 test_00002_20220427112020.pcap
-rw-------. 1 user1 user1 200  4月 27 11:20 test_00003_20220427112023.pcap
-snip-

12.2 ファイルサイズで切り替える方法(filesize:NUM)

キャプチャファイルのサイズが1(KB)になると、次のキャプチャファイルにパケットを書き込むようにします。

[user1@server ~]$ tshark -b filesize:1 -f 'icmp' -w test.pcap
Capturing on 'eth0'

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# ping 192.168.122.216

キャプチャファイルのサイズを確認します。およそ1024(byte)単位でキャプチャファイルが作成されていることがわかります。キャプチャファイルのサイズは多少の誤差が生じるようです。

[user1@server ~]$ ls -l
合計 28
-rw-------. 1 user1 user1 1124  4月 27 11:24 test_00001_20220427112346.pcap
-rw-------. 1 user1 user1 1124  4月 27 11:24 test_00002_20220427112401.pcap
-rw-------. 1 user1 user1 1124  4月 27 11:24 test_00003_20220427112404.pcap
-snip-

12.3 リングバッファのように使う方法(files:NUM)

NUMに2を指定した場合、キャプチャファイル1=>キャプチャファイル2と書き込みをしたあと、次はキャプチャファイル1にパケットを書き込みます。なお、本オプションはdurationまたはfilesizeオプションと一緒に使う必要があります。

ここでは、キャプチャファイルの数を2、キャプチャファイルのサイズを1KBに指定してみます。

[user1@server ~]$ tshark -b files:2 -b filesize:1 -f 'icmp' -w test
Capturing on 'eth0'

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# ping 192.168.122.216

キャプチャファイルの数とサイズを確認します。15秒と48秒に作成されたキャプチャファイルが2つあることがわかります。48秒に作成されたキャプチャファイルのサイズは、332Byteであることがわかります。

[user1@server ~]$ ls -l
合計 8
-rw-------. 1 user1 user1 1124  4月 27 11:46 test_00001_20220427114615
-rw-------. 1 user1 user1  332  4月 27 11:46 test_00002_20220427114648

キャプチャファイルの数とサイズを確認します。キャプチャファイルの数は2個のままです。15秒に作成されたキャプチャファイルが削除され、新たに51秒にキャプチャファイルが作成されていることがわかります。

[user1@server ~]$ ls -l
合計 8
-rw-------. 1 user1 user1 1124  4月 27 11:46 test_00002_20220427114648
-rw-------. 1 user1 user1  200  4月 27 11:46 test_00003_20220427114651

キャプチャファイルの数とサイズを確認します。キャプチャファイルの数は2個のままです。48秒に作成されたキャプチャファイルが削除され、新たに55秒にキャプチャファイルが作成されていることがわかります。

[user1@server ~]$ ls -l
合計 8
-rw-------. 1 user1 user1 1124  4月 27 11:46 test_00003_20220427114651
-rw-------. 1 user1 user1  332  4月 27 11:46 test_00004_20220427114655

13 出力を自動で停止する方法(-a)

キャプチャファイルの保存はDisplayフィルタではできないようなので、ここではCaptureフィルタを使います。

13.1 時間を指定する方法

指定した時間が経過したら、tsharkコマンドを終了します。ここでは、出力時間を3秒に指定してみます。

[user1@server ~]$ tshark -a duration:3 -f 'icmp'
Capturing on 'eth0'
  1 0.000000000 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05fd, seq=124/31744, ttl=64
  2 0.000047753 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05fd, seq=124/31744, ttl=64 (request in 1)
  3 1.002224142 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05fd, seq=125/32000, ttl=64
  4 1.002255861 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05fd, seq=125/32000, ttl=64 (request in 3)
  5 2.003997827 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05fd, seq=126/32256, ttl=64
  6 2.004034436 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05fd, seq=126/32256, ttl=64 (request in 5)
6 packets captured

13.2 ファイルサイズを指定する方法(filesize:NUM)

キャプチャファイルが指定したサイズ(1K)に達すると、tsharkコマンドが終了するようにしてみます。

[user1@server ~]$ tshark -a filesize:1 -f 'icmp' -w test.pcap
Capturing on 'eth0'

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# ping 192.168.122.216

キャプチャファイルのサイズが1Kに達すると、tsharkコマンドが自動的に終了します。

[user1@server ~]$ tshark -a filesize:1 -f 'icmp' -w test.pcap
Capturing on 'eth0'
7

キャプチャファイルのサイズを確認します。ファイルサイズがおよそ1Kであることがわかります。

[user1@server ~]$ ls -l test.pcap
-rw-------. 1 user1 user1 1232  4月 27 15:32 test.pcap

14 特定のフィールドを表示する方法(-T fields -e)

フレーム番号、IPアドレスTCPポート番号を出力するようにしてみます。

[user1@server ~]$ tshark -i eth0 -Y 'tcp.port==11111' -T fields -e frame.number -e ip.addr -e tcp.port
Capturing on 'eth0'

サーバでncコマンドを実行します。

[user1@server ~]$ nc -kl 11111

クライアントでpingを実行します。宛先にサーバを指定します。

[root@client ~]# nc 192.168.122.216 11111

左から順に、フレーム番号、IPアドレスTCPポート番号が出力されていることがわかります。

[user1@server ~]$ tshark -i eth0 -Y 'tcp.port==11111' -T fields -e frame.number -e ip.addr -e tcp.port
Capturing on 'eth0'
29      192.168.122.181,192.168.122.216 50136,11111
30      192.168.122.216,192.168.122.181 11111,50136
31      192.168.122.181,192.168.122.216 50136,11111

15 プロミスキャスモード(-p)

NICをプロミスキャスモードにすると、宛先MACアドレスが自身以外のパケットもキャプチャしてしまいます。-Pを指定してNICがプロミスキャスモードにならないようにすると、宛先MACアドレスが自分宛のパケットだけをキャプチャするようになります。
プロミスキャスモードについては、以下の記事を参照してください。
tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログの「6 プロミスキャス・モードへの移行を抑止する方法(-p)」を参照してください。

16 時刻を表示する方法(-t)

16.1 現在時刻を表示する方法(a)

[user1@server ~]$ tshark -i eth0 -n -Y 'icmp' -t a
Capturing on 'eth0'
 20 09:57:09.241950679 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05b9, seq=1/256, ttl=64
 21 09:57:09.241985541 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05b9, seq=1/256, ttl=64 (request in 20)

16.2 UTC時刻を表示する方法(u)

[user1@server ~]$ tshark -i eth0 -n -Y 'icmp' -t u
Capturing on 'eth0'
  2 00:57:27.537284936 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05ba, seq=1/256, ttl=64
  3 00:57:27.537320767 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05ba, seq=1/256, ttl=64 (request in 2)

16.3 エポックタイムを表示する方法(e)

[user1@server ~]$ tshark -i eth0 -n -Y 'icmp' -t e
Capturing on 'eth0'
  1 1651021060.745605918 192.168.122.181 -> 192.168.122.216 ICMP 98 Echo (ping) request  id=0x05bb, seq=1/256, ttl=64
  2 1651021060.745657363 192.168.122.216 -> 192.168.122.181 ICMP 98 Echo (ping) reply    id=0x05bb, seq=1/256, ttl=64 (request in 1)

17 統計情報の表示方法(-z)

17.1 その1

5秒間隔でICMPの統計情報を表示するようにします。

[user1@server ~]$ tshark -i eth0 -q -z io,stat,5,icmp
Capturing on 'eth0'

クライアントでpingを10回実行します。宛先にサーバを指定します。

[root@client ~]# ping -c 10 192.168.122.216

適当な時間経過したら、Ctrl+Cを押下してtsharkコマンドを終了します。ICMP Echo request/replyあわせて、合計20個表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -q -z io,stat,5,icmp
Capturing on 'eth0'


^C53 packets captured

==============================================
| IO Statistics                              |
|                                            |
| Interval size: 5 secs                      |
| Col 1: Frames and bytes                    |
|     2: icmp                                |
|--------------------------------------------|
|          |1               |2               |
| Interval | Frames | Bytes | Frames | Bytes |
|--------------------------------------------|
|  0 <>  5 |     13 |  1136 |     10 |   980 |
|  5 <> 10 |     14 |  1168 |     10 |   980 |
| 10 <> 15 |      5 |   240 |      0 |     0 |
==============================================

17.1 その2

TCPの11111番ポートのパケットだけを統計情報に表示するようにしてみます。

[user1@server ~]$ tshark -i eth0 -f "tcp port 11111" -q -z io,stat,5,tcp
Capturing on 'eth0'

サーバでncコマンドを実行します。

[user1@server ~]$ nc -kl 11111

クライアントでncコマンドを実行します。

[root@client ~]# nc 192.168.122.216 11111

TCPコネクション確立時にやり取りする3個のパケットが統計情報に表示されていることがわかります。

[user1@server ~]$ tshark -i eth0 -f "tcp port 11111" -q -z io,stat,5,tcp
Capturing on 'eth0'
^C3 packets captured

====================================================
| IO Statistics                                    |
|                                                  |
| Interval size: 0.001 secs (dur)                  |
| Col 1: Frames and bytes                          |
|     2: tcp                                       |
|--------------------------------------------------|
|                |1               |2               |
| Interval       | Frames | Bytes | Frames | Bytes |
|--------------------------------------------------|
| 0.000 <> 0.001 |      3 |   214 |      3 |   214 |
====================================================
[user1@server ~]$

18 NetLinkを流れるパケットを表示する方法

NetLinkは、カーネルとユーザー空間のプロセス間で情報をやりとりするために用いられるインタフェースです。NetLinkについては、Netlinkプログラミングの書き方 - hana_shinのLinux技術ブログを参照してください。

nlmonモジュールをロードします。一般ユーザではロードできないので、rootユーザでロードします。

[root@server ~]# modprobe nlmon

ロードしたモジュールを確認します。nlmonモジュールがロードされたことがわかります。

[root@server ~]# lsmod |grep nlmon
nlmon                  12924  0

nlmon0という名前のデバイスを追加します。タイプにはnlmontを指定します。

[root@server ~]# ip link add nlmon0 type nlmon

バイスをアップします。

[root@server ~]# ip link set nlmon0 up

一般ユーザに切り替えます。

[root@server ~]# su - user1

tsharkコマンドを実行します。このときnlmon0デバイスを指定します。

[user1@server ~]$ tshark -i nlmon0
Capturing on 'nlmon0'

もう1つターミナルを開きます。そして、ipコマンドを実行します。

[user1@server ~]$ ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:6f:b0:ca brd ff:ff:ff:ff:ff:ff

ipコマンドを実行すると、NetLinkを流れるパケットが確認できます。

[user1@server ~]$ tshark -i nlmon0
Capturing on 'nlmon0'
  1 0.000000000              ->              UNKNOWN 68 WTAP_ENCAP = 0
  2 0.000157466              ->              UNKNOWN 1272 WTAP_ENCAP = 0

Z 参考情報

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