- 1 tsharkコマンドとは?
- 2 検証環境
- 3 インストール方法
- 4 オプション一覧
- 5 事前準備(一般ユーザの作成)
- 6 インタフェース一覧を表示する方法(-D)
- 7 Capture vs Display Filters
- 8 TCPパケットを絞り込む方法
- 9 ARPパケットを絞り込む方法
- 10 ICMPパケットを絞り込む方法
- 11 DNSパケットを絞り込む方法
- 12 キャプチャファイルを自動で切り替える方法(-b)
- 13 出力を自動で停止する方法(-a)
- 14 特定のフィールドを表示する方法(-T fields -e)
- 15 プロミスキャスモード(-p)
- 16 時刻を表示する方法(-t)
- 17 統計情報の表示方法(-z)
- 18 NetLinkを流れるパケットを表示する方法
- Z 参考情報
1 tsharkコマンドとは?
tsharkは、WiresharkのCLI(Command Line Interface)版です。tcpdumpよりtsharkの方がより細かな条件を指定してパケットの絞り込みができます。私自身は、tsharkの方が使い勝手が良いとかんじました。使用目的によって使い分けるとよいと思います。
なお、tcpdumpについては、以下の記事を参照ください。
tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログ
tcpdumpの使い方(パケットファイルの切り替え方法) - hana_shinのLinux技術ブログ
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と呼ばれています。
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がサーバからクライアントに送信されます。9.1でARP request 、9.2でARP replyをキャプチしてみます。arpingコマンドの使い方は、arpingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
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技術ブログ