54
59

tcpdumpの使い方

Last updated at Posted at 2017-02-11

最新版は、以下に記載しています。
tcpdumpの使い方(基本編)
tcpdumpの使い方(パケットファイルの切り替え方法)
tcpdumpのフックポイント、Netfilterのチェイン、Qdiscのカーネル内の場所
tsharkコマンドの使い方
mergecapコマンドの使い方

iptablesについても理解しておくとtcpdumpコマンドの実験に役立ちます。
iptablesコマンドの使い方
iptables-extensionsの使い方
iptablesコマンドの使い方(ターゲットの使い方)

firewall-cmdの使い方

Wiresharkの使い方(RTTの表示方法)
Wiresharkの使い方(IPアドレスやMACアドレスを名前で表示する方法)

ネットワークのトラブルシューティングのときに使うコマンド

#1 tcpdumpとは?
ネットワークを流れるパケットをキャプチャするためのコマンドです。

#2 環境
VMware Workstation 12 Player上の仮想マシン(2台)を使いました。
master,node1ともにOSはCentOS7.2を使用しました。
なお、master,node1はホスト名です。

OS版数
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
ネットワーク構成
   master  --------------------- node1

#3 TCPパケットの採取方法
##3.1 SYNフラグがたった(=1)パケットを採取する方法

採取するパケット
masterからnode1の80番ポート宛てにTCPパケットを送信して、★1と★2のパケットを採取する。

   master                            node1
     |                                 |
     |------------- SYN -------------->|★1
     |<------------ SYN +ACK ----------|★2
     |------------- ACK -------------->|
     |                                 |
node1側
ncコマンドをインストールする。
[root@node1 ~]# yum install nmap-ncat

80番ポートで待機するncプロセスを起動する。
[root@node1 ~]# nc -l 80 &
[1] 4093

ncプロセスが待ち受けているポート番号を確認する。
[root@node1 ~]# lsof -i:80
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      4093 root    3u  IPv6  44382      0t0  TCP *:http (LISTEN)
nc      4093 root    4u  IPv4  44383      0t0  TCP *:http (LISTEN)

tcpdumpを実行する。SYNフラグが立っているTCPパケットを採取する(上記★1,★2)
[root@node1 ~]# tcpdump -i eth0 '(tcp[tcpflags] & tcp-syn)' != 0
master側
ncコマンドをインストールする。
[root@node1 ~]# yum install nmap-ncat

node1(192.168.0.20)の80番ポート宛てにTCPパケットを送信する。
[root@master sar]# nc node1 80 -vv
Ncat: Version 6.40 ( http://nmap.org/ncat )
libnsock nsi_new2(): nsi_new (IOD #1)
libnsock nsock_connect_tcp(): TCP connection requested to 192.168.0.20:80 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [192.168.0.20:80]
Ncat: Connected to 192.168.0.20:80.
libnsock nsi_new2(): nsi_new (IOD #2)
libnsock nsock_read(): Read request from IOD #1 [192.168.0.20:80] (timeout: -1ms) EID 18
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 26
test    => "test"と入力した。
実行結果の確認
SYNフラグのたったパケット(★1,★2)採取をおこなう。
[root@node1 ~]# tcpdump -i eth0 '(tcp[tcpflags] & tcp-syn)' != 0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:53:15.864640 IP master.48604 > node1.http: Flags ★1[S], seq 1922717478, win 29200, options [mss 1460,sackOK,TS val 10235908 ecr 0,nop,wscale 7], length 0
11:53:15.864796 IP node1.http > master.48604: Flags ★2[S.], seq 1379729022, ★ack 1922717479, win 28960, options [mss 1460,sackOK,TS val 3079043 ecr 10235908,nop,wscale 7], length 0
test   =>masterで入力した"test"がnode1側で確認できた。

##3.2 SYNパケット(SYNフラグのみ立ったパケット)を採取する方法

★1のパケットを採取する

   master                            node1
     |                                 |
     |------------- SYN -------------->|★1
     |------------- SYN -------------->|★1(再送)
     |------------- SYN -------------->|★1(再送)
     |------------- SYN -------------->|★1(再送)
     |                                 |
     

--------------------
1. node1側で実行する
--------------------
80番ポート宛てのTCPパケットは廃棄する。
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j DROP

設定を確認する。
[root@node1 ~]# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 58 packets, 18279 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

80番ポートで待機するncプロセスを起動する。
[root@node1 ~]# nc -l 80 &
[1] 2518

ncプロセスが待ち受けているポート番号を確認する。
[root@node1 ~]# lsof -i:80
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      2518 root    3u  IPv6  30891      0t0  TCP *:http (LISTEN)
nc      2518 root    4u  IPv4  30892      0t0  TCP *:http (LISTEN)

tcpdumpを起動する。SYNパケットのみ採取する設定。
[root@node1 ~]# tcpdump -i eth0 '(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack) ==0'

--------------------
2. master側で実行する
--------------------
node1の80番ポート宛てにTCPパケットを送信する。
[root@master sar]# nc node1 80 -vv
Ncat: Version 6.40 ( http://nmap.org/ncat )
libnsock nsi_new2(): nsi_new (IOD #1)
libnsock nsock_connect_tcp(): TCP connection requested to 192.168.0.20:80 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT TIMEOUT for EID 8 [192.168.0.20:80]
Ncat: Connection timed out.  => SYN再送回数の最大値に到達前に、先にncコマンドがタイムアウトして終了した模様。

--------------------
3. node1側の確認結果
--------------------
tcpdumpの実行結果を確認する。SYNパケット(★印)のみ採取できたことがわかる。
[root@node1 ~]# tcpdump -i eth0 '(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack) ==0'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:20:35.970211 IP master.48298 > node1.http: Flags ★[S], seq 149498950, win 29200, options [mss 1460,sackOK,TS val 8276013 ecr 0,nop,wscale 7], length 0
11:20:36.971734 IP master.48298 > node1.http: Flags ★[S], seq 149498950, win 29200, options [mss 1460,sackOK,TS val 8277017 ecr 0,nop,wscale 7], length 0
11:20:39.252406 IP master.48298 > node1.http: Flags ★[S], seq 149498950, win 29200, options [mss 1460,sackOK,TS val 8279024 ecr 0,nop,wscale 7], length 0
11:20:42.986909 IP master.48298 > node1.http: Flags ★[S], seq 149498950, win 29200, options [mss 1460,sackOK,TS val 8283032 ecr 0,nop,wscale 7], length 0
- ncコマンドタイムアウトにより、ここでキャプチャ終了 -


-----------------------------
4. あと始末(iptables定義削除)
-----------------------------
[root@node1 ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       tcp  --  anywhere             anywhere             tcp dpt:http
[root@node1 ~]# iptables -D INPUT 1
[root@node1 ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
[root@node1 ~]#

##3.3 FINパケットを採取する方法

★1と★2のパケットを採取する

   master                            node1
     |                                 |
     |------------- SYN -------------->|
     |<------------ SYN + ACK ---------|
     |------------- ACK -------------->|
     |                                 |
     |                                 |
     |------------- FIN -------------->|★1
     |<------------ FIN + ACK ---------|★2
     |------------- ACK -------------->|
     |                                 |
     |                                 |

[root@node1 ~]# tcpdump -i eth0 '(tcp[tcpflags] & tcp-fin)' != 0
-中略-
20:46:33.720744 IP master.35582 > node1.http: Flags [F.], seq 635647794, ack 894972442, win 319, options [nop,nop,TS val 4009862 ecr 3088873], length 0
20:46:33.721687 IP node1.http > master.35582: Flags [F.], seq 1, ack 1, win 227, options [nop,nop,TS val 3088875 ecr 4009862], length 0
-以下、略-

##3.4 その他
manによると、下記のものがフラグとして利用可能なようです。
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-act, tcp-urg

以下は、man tcpdumpより抜粋した説明です。
Some offsets and field values may be expressed as names rather than as numeric values. 
For example tcp[13] may be replaced with tcp[tcpflags]. 
The following TCP flag field values are also available: 
    tcp-fin,  tcp-syn,  tcp-rst,  tcp-push, tcp-act, tcp-urg.

This can be demonstrated as:
       tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0'

Note  that  you should use single quotes or a backslash in the expression 
to hide the AND ('&') special character from the shell.

#4 MACアドレスを表示する方法(-e)

[root@node1 ~]# tcpdump -e -i eth0 port 80
21:04:41.208201 00:0c:29:18:5c:90 (oui Unknown) > 00:0c:29:a5:64:c8 (oui Unknown), ethertype IPv4 (0x0800), length 74: master.35770 > node1.http: Flags [S], seq 844789185, win 29200, options [mss 1460,sackOK,TS val 5097353 ecr 0,nop,wscale 7], length 0
-以下、略-


#5 マルチキャストパケットを表示する方法(multicast)

[root@drbd1 ~]# tcpdump -i eth0 -n multicast
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:45:03.460753 IP 192.168.0.3.mdns > 224.0.0.251.mdns: 0 [1au] PTR (QU)? _sleep-proxy._udp.local. (70)
21:45:03.577732 IP6 fe80::1029:98b2:4512:713b.mdns > ff02::fb.mdns: 0 [1au] PTR (QU)? _sleep-proxy._udp.local. (70)
21:45:04.484650 IP 192.168.0.3.mdns > 224.0.0.251.mdns: 0 [1au] PTR (QM)? _sleep-proxy._udp.local. (70)
21:45:04.486289 IP6 fe80::1029:98b2:4512:713b.mdns > ff02::fb.mdns: 0 [1au] PTR (QM)? _sleep-proxy._udp.local. (70)
21:45:07.101206 ARP, Request who-has 192.168.0.60 tell 192.168.0.6, length 46
21:45:07.556694 IP 192.168.0.3.mdns > 224.0.0.251.mdns: 0 [1au] PTR (QM)? _sleep-proxy._udp.local. (70)
-以下、略-

#6 シーケンス番号を相対表示ではなく絶対表示で表示する方法(-S)

[root@server ~]# tcpdump -i eth0 -S port 11111 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:26:33.080764 IP 192.168.0.110.48428 > 192.168.0.100.11111: Flags [S], seq 2964223143, win 29200, options [mss 1460,sackOK,TS val 1278557 ecr 0,nop,wscale 7], length 0
11:26:33.080981 IP 192.168.0.100.11111 > 192.168.0.110.48428: Flags [S.], seq 3868874227, ack 2964223144, win 28960, options [mss 1460,sackOK,TS val 1318048 ecr 1278557,nop,wscale 7], length 0
11:26:33.081787 IP 192.168.0.110.48428 > 192.168.0.100.11111: Flags [.], ack 3868874228, win 229, options [nop,nop,TS val 1278559 ecr 1318048], length 0

#7 簡潔な表示をする方法(-q)

[root@node1 ~]# tcpdump -i eth0 port 80 -q
-中略-
22:08:54.904012 IP master.36554 > node1.http: tcp 0
22:08:54.904207 IP node1.http > master.36554: tcp 0
22:08:54.904678 IP master.36554 > node1.http: tcp 0
22:08:54.905582 IP master.36554 > node1.http: tcp 69
-以下、略-

#8 インタフェースの指定方法
##8.1 使用できるインタフェース一覧を表示する方法(-D)

[root@node1 ~]# tcpdump -D
1.eth0
2.cbr0
3.nflog (Linux netfilter log (NFLOG) interface)
4.nfqueue (Linux netfilter queue (NFQUEUE) interface)
5.usbmon1 (USB bus number 1)
6.usbmon2 (USB bus number 2)
7.any (Pseudo-device that captures on all interfaces)
8.lo
[root@node1 ~]#

  (*) cbr0はDockerのカスタムブリッジを表しています。

##8.2 全てのインタフェースを指定する方法(-i any)
インタフェースとしてanyを指定すると、すべてのインタフェースを指定したことになる。
anyとは、8.1で示した"any (Pseudo-device that captures on all interfaces)"のことです。

ポート番号11111でListenする。
[root@node1 ~]# nc -kl 11111

ターミナルを1つ開く(便宜上、ターミナル2と呼ぶ)。tcpdumpを実行する。インタフェースとして"any"を指定する。
[root@node1 ~]# tcpdump -i any port 11111 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

ターミナルをさらに1つ開く。11111番ポートにTCPコネクションを確立する。node1はホスト名です。
[root@node1 ~]# nc node1 11111

ターミナル2の標準出力にtcpdumpの実行結果が出力されたことがわかる。
[root@node1 ~]# tcpdump -i any port 11111 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
18:33:57.390145 IP 192.168.0.20.50330 > 192.168.0.20.11111: Flags [S], seq 1061960766, win 43690, options [mss 65495,sackOK,TS val 546666 ecr 0,nop,wscale 6], length 0
13:11:53.442157 IP 192.168.0.20.11111 > 192.168.0.20.50330: Flags [S.], seq 3185839519, ack 1061960767, win 43690, options [mss 65495,sackOK,TS val 546666 ecr 546666,nop,wscale 6], length 0
18:33:57.390245 IP 192.168.0.20.50330 > 192.168.0.20.11111: Flags [.], ack 1, win 683, options [nop,nop,TS val 546666 ecr 546666], length 0
-以下、略-

#9 ポート番号の指定方法
##9.1 複数のポート番号を指定する方法(or)
ポート番号をorで複数指定します。
以下の例は、宛先TCPポート番号が80番と宛先UDPポート番号が123番のパケットだけをキャプチャしています。

-------
1. 環境
-------
他の記事執筆時とはホスト名がかわってしまったので、改めて環境を示します。
また、コマンド実行順序もあわせて記載しました。

                   node1                admin
              (192.168.0.20)       (192.168.0.10)
                     |                    |
                     |                    | # systemctl start httpd
                     |                    | # systemctl start chronyd
                     |                    |
                     |                    | # tcpdump -i eth0 tcp dst port 80 or udp dst port 123 -nn
                     |                    |
                     |                    |
 # curl http://admin |                    |
                     |                    |
                     |                    |

-----------
2. 実行結果
-----------
テスト用にhttpdとchronydを起動する。
[root@admin ~]# systemctl start httpd
[root@admin ~]# systemctl start chronyd

tcpdumpを実行する。
[root@admin ~]# tcpdump -i eth0 tcp dst port 80 or udp dst port 123 -nn
★ここから、宛先TCPポート番号が80番のパケットをキャプチャしていることがわかる。
19:40:09.350977 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [S], seq 3461504268, win 29200, options [mss 1460,sackOK,TS val 4294753712 ecr 0,nop,wscale 7], length 0
19:40:09.351719 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [.], ack 3444255170, win 229, options [nop,nop,TS val 4294753713 ecr 262765], length 0
19:40:09.351735 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [P.], seq 0:69, ack 1, win 229, options [nop,nop,TS val 4294753713 ecr 262765], length 69
19:40:09.353311 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [.], ack 245, win 237, options [nop,nop,TS val 4294753714 ecr 262766], length 0
19:40:09.353633 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [F.], seq 69, ack 245, win 237, options [nop,nop,TS val 4294753715 ecr 262766], length 0
19:40:09.366762 IP 192.168.0.20.55996 > 192.168.0.10.80: Flags [.], ack 246, win 237, options [nop,nop,TS val 4294753717 ecr 262767], length 0

★ここから、宛先UDPポート番号が123番のパケットをキャプチャしていることがわかる。
19:40:41.333550 IP 192.168.0.20.53503 > 157.7.153.56.123: NTPv4, Client, length 48 
19:40:43.601143 IP 192.168.0.20.52104 > 160.16.75.242.123: NTPv4, Client, length 48

##9.2 ポート番号の範囲を指定する方法(portrange)
portrangeを使ってポート番号の範囲を指定することができます。
portrange 10000-10010とすると、10000~10010番ポートのパケットをキャプチャすることができます。
manにはportrangeの説明がありません。ネットを検索していたら、たまたま下記情報をみつけました。
tcpdumpについて知らない可能性のあるトップ10
Tcpdump usage examples

-------------------------------------------------
1. 実行例(宛先TCPポート番号10000でアクセスした場合)
-------------------------------------------------
ポート番号の範囲指定(宛先TCPポート番号が10000-10010)をしてtcpdumpを実行する。
[root@admin ~]# tcpdump -i eth0 tcp dst portrange 10000-10010 -nn

adminサーバでncコマンドを起動する。Listenポート番号は10000を指定する。
[root@admin ~]# nc -l 10000

node1サーバでncコマンドを実行する。
[root@node1 ~]# nc admin 10000

宛先TCPポート番号10000(★印)のパケットがキャプチャできたことがわかる。
[root@admin ~]# tcpdump -i eth0 tcp dst portrange 10000-10010 -nn
20:02:02.412649 IP 192.168.0.20.36590 > 192.168.0.10.★10000: Flags [S], seq 3934696008, win 29200, options [mss 1460,sackOK,TS val 1099483 ecr 0,nop,wscale 7], length 0
20:02:02.413076 IP 192.168.0.20.36590 > 192.168.0.10.★10000: Flags [.], ack 2120320125, win 229, options [nop,nop,TS val 1099483 ecr 1575826], length 0

-------------------------------------------------
2. 実行例(宛先TCPポート番号10005でアクセスした場合)
-------------------------------------------------
ポート番号の範囲指定(宛先TCPポート番号が10000-10010)をしてtcpdumpを実行する。
[root@admin ~]# tcpdump -i eth0 tcp dst portrange 10000-10010 -nn

ncコマンドを起動する。Listenポート番号は10005を指定する。
[root@admin ~]# nc -l 10005

node1サーバでncコマンドを実行する。
[root@node1 ~]# nc admin 10005

宛先TCPポート番号10005(★印)のパケットがキャプチャできたことがわかる。
[root@admin ~]# tcpdump -i eth0 tcp dst portrange 10000-10010 -nn
20:05:41.231969 IP 192.168.0.20.34196 > 192.168.0.10.★10005: Flags [S], seq 882864997, win 29200, options [mss 1460,sackOK,TS val 1318301 ecr 0,nop,wscale 7], length 0
20:05:41.234158 IP 192.168.0.20.34196 > 192.168.0.10.★10005: Flags [.], ack 1724908027, win 229, options [nop,nop,TS val 1318304 ecr 1794647], length 0




#10 時間で切り替える方法(-G,-z)
##10.1 -Gだけを指定した場合(切り替えは可能だけど、無限に増えていく)

[root@node1 ~]# id
uid=0(root) gid=0(root) groups=0(root)

tcpdumpを実行するディレクトリを作成する。
rootユーザでログインしているので、作成するディレクトリの所有者、グループはrootとなる。
[root@node1 ~]# mkdir tcpdump
[root@node1 ~]# ls -ld tcpdump
drwxr-xr-x 2 root root 6  2月 11 23:29 tcpdump


ディレクトリの所有者とグループをtcpdumpに変更する。変更しないと、採取できない。
理由は、ディレクトリの所有者とグループがrootになっているため。
他のやり方として、tcpdumpプロセスのUIDをrootに切り替える方法がある(10参照)。
[root@node1 ~]# chown tcpdump:tcpdump tcpdump
[root@node1 ~]# ls -ld tcpdump
drwxr-xr-x 2 tcpdump tcpdump 6  2月 11 22:41 tcpdump

[root@node1 ~]# cd tcpdump/

10秒毎にキャプチャデータを保存するファイルを切り替える(-G)。
[root@node1 tcpdump]# tcpdump -i eth0 -G 10 -w tcpdump_%Y%m%d_%H%M%S.cap

キャプチャデータを保存したファイルを確認する。10秒単位で作成されていることがわかる。
[root@node1 tcpdump]# ls -l --full-time
合計 104
-rw-r--r-- 1 tcpdump tcpdump 18004 2017-02-11 22:45:11.073577507 +0900 tcpdump_20170211_224501.cap
-rw-r--r-- 1 tcpdump tcpdump 21492 2017-02-11 22:45:21.111767063 +0900 tcpdump_20170211_224511.cap
-rw-r--r-- 1 tcpdump tcpdump 24196 2017-02-11 22:45:31.145956545 +0900 tcpdump_20170211_224521.cap
-rw-r--r-- 1 tcpdump tcpdump 20946 2017-02-11 22:45:41.166145762 +0900 tcpdump_20170211_224531.cap
-以下、略-

##10.2 -G + -z (シェルを実行して、古いファイルを削除する方法)

10.1の方法だと、無限にファイルが増えていく。
ディスク使用量を一定量に抑えたい場合は、古いファイルを定期的に削除する。

キャプチャデータを保存した後に実行するシェルスクリプトを作成する。
ファイルが4個以上にならないようにする。つまり保持するファイルは3個。
[root@node1 tcpdump]# cat limit.sh
#!/usr/bin/bash
file_num=$(ls tcpdump_*|wc -l)

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

シェルの所有権、グループはtcpdumpにしておく。
[root@node1 tcpdump]# ls -l limit.sh
-rwxr--r-- 1 tcpdump tcpdump 35  2月 12 09:41 limit.sh

tcpdumpを起動する。10秒毎に古いファイルを削除する。
[root@node1 tcpdump]# tcpdump -i eth0 -G 10 -w tcpdump_%Y%m%d_%H%M%S.cap -z ./limit.sh
-以下、略-

#11 ファイルサイズで切り替える方法(-C,-z)
##11.1 -Cだけを指定した場合(切り替えは可能だけど、ファイルが無限に増えていく)

tcpdumpを実行するディレクトリを作成する。
[root@node1 ~]# mkdir tcpdump

ディレクトリの所有者とグループをtcpdumpに変更する。変更しないと、採取できない。
理由は、ディレクトリの所有者とグループがrootになっているため。
他のやり方として、tcpdumpプロセスのUIDをrootに切り替える方法がある(10参照)。
[root@node1 ~]# chown tcpdump:tcpdump tcpdump
[root@node1 ~]# ls -ld tcpdump
drwxr-xr-x 2 tcpdump tcpdump 6  2月 11 22:41 tcpdump

[root@node1 ~]# cd tcpdump/

1M単位でキャプチャデータを保存するファイルを切り替える(-C)。
[root@node1 tcpdump]# tcpdump -i eth0 -C 1 -w tcpdump.cap
-以下、略-

キャプチャデータを保存したファイルを確認する。1Mサイズでファイルが切り替わっていることがわかる。
[root@node2 tcpdump]# ls -l
合計 20560
-rw-r--r-- 1 tcpdump tcpdump 1000895  2月 26 17:33 tcpdump.cap
-rw-r--r-- 1 tcpdump tcpdump 1000753  2月 26 17:33 tcpdump.cap1
-rw-r--r-- 1 tcpdump tcpdump 1000794  2月 26 17:35 tcpdump.cap10
-rw-r--r-- 1 tcpdump tcpdump 1000011  2月 26 17:35 tcpdump.cap11
-rw-r--r-- 1 tcpdump tcpdump 1000072  2月 26 17:35 tcpdump.cap12
-rw-r--r-- 1 tcpdump tcpdump 1001184  2月 26 17:35 tcpdump.cap13
-rw-r--r-- 1 tcpdump tcpdump 1001498  2月 26 17:35 tcpdump.cap14
-rw-r--r-- 1 tcpdump tcpdump 1000372  2月 26 17:35 tcpdump.cap15
-rw-r--r-- 1 tcpdump tcpdump 1001118  2月 26 17:35 tcpdump.cap16
-rw-r--r-- 1 tcpdump tcpdump 1001198  2月 26 17:35 tcpdump.cap17
-rw-r--r-- 1 tcpdump tcpdump 1001276  2月 26 17:35 tcpdump.cap18
-rw-r--r-- 1 tcpdump tcpdump 1000664  2月 26 17:35 tcpdump.cap19
-rw-r--r-- 1 tcpdump tcpdump 1000752  2月 26 17:33 tcpdump.cap2
-rw-r--r-- 1 tcpdump tcpdump  536576  2月 26 17:35 tcpdump.cap20
-rw-r--r-- 1 tcpdump tcpdump 1000146  2月 26 17:34 tcpdump.cap3
-rw-r--r-- 1 tcpdump tcpdump 1000094  2月 26 17:35 tcpdump.cap4
-rw-r--r-- 1 tcpdump tcpdump 1001523  2月 26 17:35 tcpdump.cap5
-rw-r--r-- 1 tcpdump tcpdump 1000928  2月 26 17:35 tcpdump.cap6
-rw-r--r-- 1 tcpdump tcpdump 1001232  2月 26 17:35 tcpdump.cap7
-rw-r--r-- 1 tcpdump tcpdump 1000980  2月 26 17:35 tcpdump.cap8
-rw-r--r-- 1 tcpdump tcpdump 1001383  2月 26 17:35 tcpdump.cap9


Dockerが使える環境なら、docker pull centos等を実行しながら、
tcpdump -i eth0 -C 1 -w tcpdump.capを実行すると、ファイルの作られ方がわかる。

##11.2 -C + -z (シェルを実行して、古いファイルを削除する方法)

11.1の方法だと、無限にファイルが増えていく。
ディスク使用量を一定量に抑えたい場合は、古いファイルを定期的に削除する。

キャプチャデータを保存した後に実行するシェルスクリプトを作成する。
ファイルが4個以上にならないようにする。つまり保持するファイルは3個。
[root@node1 tcpdump]# cat limit.sh
#!/usr/bin/bash
file_num=$(ls tcpdump.cap*|wc -l)

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

シェルの所有権、グループはtcpdumpにしておく。
[root@node1 tcpdump]# chown  tcpdump:tcpdump limit.sh
[root@node1 tcpdump]# ls -l limit.sh
-rwxr--r-- 1 tcpdump tcpdump 35  2月 12 09:41 limit.sh

tcpdumpを起動する。
保存ファイルのサイズが1Mになったら。保存ファイルを切り替える。
保存ファイルが4個になったら、最も古いファイルを削除する。
[root@node1 tcpdump]# tcpdump -i eth0 -C 1 -w tcpdump.cap -z ./limit.sh
-以下、略-

#12 tcpdumpプロセスのUIDを切り替える(-Z)

----------------------------
1. tcpdump権限で起動する。
---------------------------
tcpdump実行前の権限を確認する。rootであることがわかる。
[root@node1 tcpdump]# id
uid=0(root) gid=0(root) groups=0(root)

tcpdumpを起動する。
[root@node1 tcpdump]# tcpdump -i eth0 port 80
-中略-

別ターミナルをオープンして、tcpdumpプロセスのUIDを確認する。
[root@node1 tcpdump]# ps -C tcpdump -o comm,uid,euid
COMMAND           UID  EUID
tcpdump            72    72

UID=0(root)ではなく、UID=72(tcpdumpのUID)であることがわかる。
[root@node1 tcpdump]# cat /etc/passwd|grep 72
tcpdump:x:72:72::/:/sbin/nologin

-----------------------
2. root権限で起動する。
-----------------------
tcpdumpをroot権限で起動する。
[root@node1 tcpdump]# tcpdump -Z root -i eth0 port 80
-中略-

別ターミナルをオープンして、tcpdumpプロセスのUIDを確認する。
[root@node1 tcpdump]# ps -C tcpdump -o comm,uid,euid
COMMAND           UID  EUID
tcpdump             0     0

#13 採取するパケットサイズを制限する。(-s)

-s128 採取するパケットサイズを128バイトに制限する。
-s0 パケットサイズを制限しない。NFSの場合、-s0を指定する必要がある。

#14 時刻関連

##14.1 直前にキャプチャした時刻からの経過時刻表示(-ttt)

[root@node1 ~]# tcpdump -ttt -i eth0 port 80
-中略-
00:00:00.000000 IP master.45591 > node1.http: Flags [S], seq 3130128384, win 29200, options [mss 1460,sackOK,TS val 1308684 ecr 0,nop,wscale 7], length 0
00:00:00.000573 IP node1.http > master.45591: Flags [S.], seq 2731073810, ack 3130128385, win 28960, options [mss 1460,sackOK,TS val 8901 ecr 1308684,nop,wscale 7], length 0
00:00:00.000590 IP master.45591 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 1308687 ecr 8901], length 0
-以下、略-

##14.2 時刻を分かりやすい形で表示する(-tttt)

[root@node1 tcpdump]# tcpdump -tttt -i eth0 port 80
-中略-
2017-02-11 23:48:24.601156 IP master.37570 > node1.http: Flags [S], seq 1753606276, win 29200, options [mss 1460,sackOK,TS val 14920793 ecr 0,nop,wscale 7], length 0
2017-02-11 23:48:24.601327 IP node1.http > master.37570: Flags [S.], seq 2174856607, ack 1753606277, win 28960, options [mss 1460,sackOK,TS val 13999755 ecr 14920793,nop,wscale 7], length 0
2017-02-11 23:48:24.630309 IP master.37570 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 14920796 ecr 13999755], length 0
-以下、略-

##14.3 最初にキャプチャした時刻からの経過時刻表示(-ttttt)

[root@node1 tcpdump]# tcpdump -ttttt -i eth0 port 80
-中略-
00:00:00.000000 IP master.37609 > node1.http: Flags [S], seq 1814350362, win 29200, options [mss 1460,sackOK,TS val 15104880 ecr 0,nop,wscale 7], length 0
00:00:00.000130 IP node1.http > master.37609: Flags [S.], seq 3384514235, ack 1814350363, win 28960, options [mss 1460,sackOK,TS val 14183842 ecr 15104880,nop,wscale 7], length 0
00:00:00.000503 IP master.37609 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 15104880 ecr 14183842], length 0
00:00:00.000827 IP master.37609 > node1.http: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 15104881 ecr 14183842], length 69
00:00:00.000910 IP node1.http > master.37609: Flags [.], ack 70, win 227, options [nop,nop,TS val 14183843 ecr 15104881], length 0
00:00:00.001818 IP node1.http > master.37609: Flags [.], seq 1:4345, ack 70, win 227, options [nop,nop,TS val 14183844 ecr 15104881], length 4344
00:00:00.002032 IP node1.http > master.37609: Flags [P.], seq 4345:5150, ack 70, win 227, options [nop,nop,TS val 14183844 ecr 15104881], length 805
00:00:00.002447 IP master.37609 > node1.http: Flags [.], ack 4345, win 296, options [nop,nop,TS val 15104882 ecr 14183844], length 0
00:00:00.002521 IP master.37609 > node1.http: Flags [.], ack 5150, win 319, options [nop,nop,TS val 15104882 ecr 14183844], length 0
00:00:00.003245 IP master.37609 > node1.http: Flags [F.], seq 70, ack 5150, win 319, options [nop,nop,TS val 15104883 ecr 14183844], length 0
00:00:00.003504 IP node1.http > master.37609: Flags [F.], seq 5150, ack 71, win 227, options [nop,nop,TS val 14183845 ecr 15104883], length 0
00:00:00.004282 IP master.37609 > node1.http: Flags [.], ack 5151, win 319, options [nop,nop,TS val 15104884 ecr 14183845], length 0
00:00:12.419958 IP master.37610 > node1.http: Flags [S], seq 3751257265, win 29200, options [mss 1460,sackOK,TS val 15117299 ecr 0,nop,wscale 7], length 0
00:00:12.420080 IP node1.http > master.37610: Flags [S.], seq 2826492114, ack 3751257266, win 28960, options [mss 1460,sackOK,TS val 14196262 ecr 15117299,nop,wscale 7], length 0
00:00:12.420785 IP master.37610 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 15117300 ecr 14196262], length 0
00:00:12.420819 IP master.37610 > node1.http: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 15117300 ecr 14196262], length 69
00:00:12.420867 IP node1.http > master.37610: Flags [.], ack 70, win 227, options [nop,nop,TS val 14196263 ecr 15117300], length 0
00:00:12.421848 IP node1.http > master.37610: Flags [.], seq 1:4345, ack 70, win 227, options [nop,nop,TS val 14196263 ecr 15117300], length 4344
00:00:12.422183 IP node1.http > master.37610: Flags [P.], seq 4345:5150, ack 70, win 227, options [nop,nop,TS val 14196264 ecr 15117300], length 805
00:00:12.422851 IP master.37610 > node1.http: Flags [.], ack 2897, win 274, options [nop,nop,TS val 15117302 ecr 14196263], length 0
00:00:12.422900 IP master.37610 > node1.http: Flags [.], ack 4345, win 296, options [nop,nop,TS val 15117302 ecr 14196263], length 0
00:00:12.422911 IP master.37610 > node1.http: Flags [.], ack 5150, win 319, options [nop,nop,TS val 15117302 ecr 14196264], length 0
00:00:12.423754 IP master.37610 > node1.http: Flags [F.], seq 70, ack 5150, win 319, options [nop,nop,TS val 15117303 ecr 14196264], length 0
00:00:12.842416 IP node1.http > master.37610: Flags [F.], seq 5150, ack 71, win 227, options [nop,nop,TS val 14196483 ecr 15117303], length 0
00:00:12.843931 IP master.37610 > node1.http: Flags [F.], seq 70, ack 5150, win 319, options [nop,nop,TS val 15117532 ecr 14196264], length 0
00:00:12.843997 IP node1.http > master.37610: Flags [.], ack 71, win 227, options [nop,nop,TS val 14196686 ecr 15117532,nop,nop,sack 1 {70:71}], length 0
00:00:12.846918 IP master.37610 > node1.http: Flags [.], ack 5151, win 319, options [nop,nop,TS val 15117725 ecr 14196483], length 0
-以下、略-

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

masterからRouter宛てのpingを実行したときに、node1でパケットをキャップチャする(tcpdump実行)。

-pを付けた場合と、付けない場合の違いを確認する、

       master                        node1
     192.168.0.10                 192.168.0.20
         |                             |
         |  ping                       |  tcpdump実行
         |   |                         |
         |   |                         |
         |   |                         |
    +--------|----------------------------------+
    |        |     VMware Workstation           |
    +--------|----------------------------------+
             |           |
             |           |
             V           |
                     192.168.0.1
                       Router


----------------------------------------
1. -pなしの場合(プロミスキャスモードの時)
----------------------------------------
[root@master ~]# ping -c 1 192.168.0.1

別ターミナルをひらき、tcpdumを実行する。Route宛てのICMPパケットが確認できる。
つまり、自分宛て(node1)以外のパケットもキャプチャしていることがわかる。
[root@node1 ~]# tcpdump -i eth0 icmp
20:15:07.404762 IP master > 192.168.0.1: ICMP echo request, id 2395, seq 1, length 64
20:15:07.408709 IP 192.168.0.1 > master: ICMP echo reply, id 2395, seq 1, length 64

-----------------
2. -pありの場合
-----------------
[root@master ~]# ping -c 1 192.168.0.1

別ターミナルをひらき、tcpdumを実行する。
プロミスキャスモードではないので、他人宛てのパケットはキャプチャしていないことがわかる。
root@node1 ~]# tcpdump -p -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
ここで停止したまま。

#16 受信するパケットのみ/送信するパケットのみをキャプチャする(-P)
##16.1 送信するパケットだけキャプチャする(-P out)

pingを実行する。
[root@master ~]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=1.30 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=2.08 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=1.38 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=1.28 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=255 time=2.65 ms
-以下、略-

別ターミナルを開いてtcpdumpを実行する。ICMP echo requestだけキャプチャできることがわかる(★印)。
[root@master ~]# tcpdump -i eth0 -P out icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:49:30.824851 IP master > gateway: ★ICMP echo request, id 8383, seq 1, length 64
19:49:31.826870 IP master > gateway: ★ICMP echo request, id 8383, seq 2, length 64
19:49:32.829000 IP master > gateway: ★ICMP echo request, id 8383, seq 3, length 64
19:49:33.831066 IP master > gateway: ★ICMP echo request, id 8383, seq 4, length 64
19:49:34.833142 IP master > gateway: ★ICMP echo request, id 8383, seq 5, length 64

##16.2 受信するパケットだけキャプチャする(-P in)

pingを実行する。
[root@master ~]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=1.60 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=1.45 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.957 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=255 time=1.24 ms

別ターミナルを開いてtcpdumpを実行する。ICMP echo replyだけキャプチャできることがわかる(★印)。
[root@master ~]# tcpdump -i eth0 -P in icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:52:01.518368 IP gateway > master: ★ICMP echo reply, id 8389, seq 1, length 64
19:52:02.523845 IP gateway > master: ★ICMP echo reply, id 8389, seq 2, length 64
19:52:03.533297 IP gateway > master: ★ICMP echo reply, id 8389, seq 3, length 64
19:52:04.536053 IP gateway > master: ★ICMP echo reply, id 8389, seq 4, length 64
19:52:05.545274 IP gateway > master: ★ICMP echo reply, id 8389, seq 5, length 64

#17 パケットの中身をASCII表示する方法(-x,-xx)

##17.1 IPヘッダを含めたパケットの中身の表示方法(-x)

サーバ側は、11111番ポートでListenする。
[root@server ~]# nc -l 11111

もう1つターミナルをオープンして、tcpdumpを実行する。
[root@server ~]# tcpdump -i eth0 port 11111 -X

クライアントからサーバにTCPコネクションを確立して、データを送信する。
以下の例では、111...555の50バイト、および改行コード(0x0a)の合計51バイトを送信している。
[root@client ~]# nc server 11111
11111111112222222222333333333344444444445555555555

実行結果を確認する。IPヘッダを含めた、送信データの中身が確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -X

tcpdump1.png

##17.2 イーサネットヘッダを含めたパケットの中身の表示方法(-XX)

サーバ側は、11111番ポートでListenする。
[root@server ~]# nc -l 11111

もう1つターミナルをオープンして、tcpdumpを実行する。
[root@server ~]# tcpdump -i eth0 port 11111 -XX

クライアントからサーバにTCPコネクションを確立して、データを送信する。
以下の例では、111...555の50バイト、および改行コード(0x0a)の合計51バイトを送信している。
[root@client ~]# nc server 11111
11111111112222222222333333333344444444445555555555

実行結果を確認する。イーサネットヘッダを含めた、送信データの中身が確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -XX

tcpdump2.png

#18 採取したpcapファイルを読む方法(-r)

##18.1 SYNパケットだけを採取する方法

[root@admin tcpdump]# tcpdump -r test.cap '(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack)' ==0
reading from file test.cap, link-type EN10MB (Ethernet)
21:23:03.301427 IP admin.37958 > ftp.jaist.ac.jp.http: Flags [S], seq 2552724747, win 29200, options [mss 1460,sackOK,TS val 2642270 ecr 0,nop,wscale 7], length 0

##18.2 SYN,SYN+ACKパケットだけを採取する方法

[root@admin tcpdump]# tcpdump -r test.cap '(tcp[tcpflags] & tcp-syn)' != 0
reading from file test.cap, link-type EN10MB (Ethernet)
21:23:03.301427 IP admin.37958 > ftp.jaist.ac.jp.http: Flags [S], seq 2552724747, win 29200, options [mss 1460,sackOK,TS val 2642270 ecr 0,nop,wscale 7], length 0
21:23:03.327373 IP ftp.jaist.ac.jp.http > admin.37958: Flags [S.], seq 2234169755, ack 2552724748, win 32851, options [sackOK,TS val 606933891 ecr 2642270,mss 1460,nop,wscale 4], length 0

#19 Netlinkを流れるパケットのキャプチャ方法
##19.1 パケットキャプチャの準備

nlmonモジュールをローディングする。
[root@master ~]# modprobe nlmon
[root@master ~]# lsmod |grep nlmon
nlmon                  12924  0

nlmonタイプのデバイス(nlmon0)を追加する。
[root@master ~]# ip link add nlmon0 type nlmon
[root@master ~]# ip link set nlmon0 up
[root@master ~]# ip link show dev nlmon0
6: nlmon0: <NOARP,UP,LOWER_UP> mtu 3776 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/[824]

tcpdumpを実行する。
なお、NETLINKタイプの場合、標準出力へのデータ出力は未サポート。-wを使ってファイルにデータを保存する必要がある。
[root@master ~]# tcpdump -i nlmon0 -s0 -w test.pcap
tcpdump: listening on nlmon0, link-type NETLINK (Linux netlink), capture size 65535 bytes
13 packets captured
14 packets received by filter
0 packets dropped by kernel

NETLINKにパケットを流すため、ターミナルをもう1つオープンして、下記コマンドを実行する。
[root@master ~]# ip a
[root@master ~]# ip r
[root@master ~]# ip n

##19.2 パケットキャプチャの参照方法
採取したデータは、Wiresharkを使って参照します。
以下のように、Netlinkを流れるパケットを表示することができます。
nlmon1.png

##19.3 あと始末
テスト用に作成したデバイスの削除、モジュールのアンロードをする。

デバイス(nlmon0)を削除する。
[root@master ~]# ip link delete nlmon0
[root@master ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:18:5c:90 brd ff:ff:ff:ff:ff:ff
3: cbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1430 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 46:40:75:d9:7d:d5 brd ff:ff:ff:ff:ff:ff

nlmonモジュールを削除する。
[root@master ~]# rmmod nlmon
[root@master ~]# lsmod |grep nlmon
[root@master ~]#

#20 採取したtcpdumpを表示する方法(-r)

テスト用のtcpdumpを採取(-w)する。
[root@node1 ~]# tcpdump -i eth0 port 80 -w http.cap
-以下、略-

採取したtcpdumpを確認する。
[root@node1 ~]# ls -l http.cap
-rw-r--r-- 1 tcpdump tcpdump 38313  2月 11 21:48 http.cap
[root@node1 ~]#

採取したtcpdumpを表示(-r)する。
[root@node1 ~]# tcpdump -r http.cap
-中略-
21:47:39.816741 IP master.36345 > node1.http: Flags [S], seq 1437916452, win 29200, options [mss 1460,sackOK,TS val 7676049 ecr 0,nop,wscale 7], length 0
21:47:39.816879 IP node1.http > master.36345: Flags [S.], seq 296354756, ack 1437916453, win 28960, options [mss 1460,sackOK,TS val 6754970 ecr 7676049,nop,wscale 7], length 0
21:47:39.818131 IP master.36345 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 7676050 ecr 6754970], length 0
21:47:39.818180 IP master.36345 > node1.http: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 7676051 ecr 6754970], length 69
21:47:39.818234 IP node1.http > master.36345: Flags [.], ack 70, win 227, options [nop,nop,TS val 6754972 ecr 7676051], length 0
21:47:39.818968 IP node1.http > master.36345: Flags [.], seq 1:4345, ack 70, win 227, options [nop,nop,TS val 6754972 ecr 7676051], length 4344
21:47:39.819210 IP node1.http > master.36345: Flags [P.], seq 4345:5150, ack 70, win 227, options [nop,nop,TS val 6754973 ecr 7676051], length 805
21:47:39.820037 IP master.36345 > node1.http: Flags [.], ack 4345, win 296, options [nop,nop,TS val 7676052 ecr 6754972], length 0
21:47:39.820077 IP master.36345 > node1.http: Flags [.], ack 5150, win 319, options [nop,nop,TS val 7676053 ecr 6754973], length 0
21:47:39.822032 IP master.36345 > node1.http: Flags [F.], seq 70, ack 5150, win 319, options [nop,nop,TS val 7676053 ecr 6754973], length 0
21:47:39.822277 IP node1.http > master.36345: Flags [F.], seq 5150, ack 71, win 227, options [nop,nop,TS val 6754976 ecr 7676053], length 0
21:47:39.826081 IP master.36345 > node1.http: Flags [.], ack 5151, win 319, options [nop,nop,TS val 7676055 ecr 6754976], length 0
21:47:43.474723 IP master.36346 > node1.http: Flags [S], seq 3975369367, win 29200, options [mss 1460,sackOK,TS val 7679705 ecr 0,nop,wscale 7], length 0
21:47:43.474894 IP node1.http > master.36346: Flags [S.], seq 3828837720, ack 3975369368, win 28960, options [mss 1460,sackOK,TS val 6758628 ecr 7679705,nop,wscale 7], length 0
-以下、略-

----------------------------
2. sedを使って時刻を絞り込む
----------------------------
[root@node1 ~]# tcpdump -r http.cap |sed -n '/21:47:39\.816741/,/21:47:39\.826081/p'
-中略-
21:47:39.816741 IP master.36345 > node1.http: Flags [S], seq 1437916452, win 29200, options [mss 1460,sackOK,TS val 7676049 ecr 0,nop,wscale 7], length 0
21:47:39.816879 IP node1.http > master.36345: Flags [S.], seq 296354756, ack 1437916453, win 28960, options [mss 1460,sackOK,TS val 6754970 ecr 7676049,nop,wscale 7], length 0
21:47:39.818131 IP master.36345 > node1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 7676050 ecr 6754970], length 0
21:47:39.818180 IP master.36345 > node1.http: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 7676051 ecr 6754970], length 69
21:47:39.818234 IP node1.http > master.36345: Flags [.], ack 70, win 227, options [nop,nop,TS val 6754972 ecr 7676051], length 0
21:47:39.818968 IP node1.http > master.36345: Flags [.], seq 1:4345, ack 70, win 227, options [nop,nop,TS val 6754972 ecr 7676051], length 4344
21:47:39.819210 IP node1.http > master.36345: Flags [P.], seq 4345:5150, ack 70, win 227, options [nop,nop,TS val 6754973 ecr 7676051], length 805
21:47:39.820037 IP master.36345 > node1.http: Flags [.], ack 4345, win 296, options [nop,nop,TS val 7676052 ecr 6754972], length 0
21:47:39.820077 IP master.36345 > node1.http: Flags [.], ack 5150, win 319, options [nop,nop,TS val 7676053 ecr 6754973], length 0
21:47:39.822032 IP master.36345 > node1.http: Flags [F.], seq 70, ack 5150, win 319, options [nop,nop,TS val 7676053 ecr 6754973], length 0
21:47:39.822277 IP node1.http > master.36345: Flags [F.], seq 5150, ack 71, win 227, options [nop,nop,TS val 6754976 ecr 7676053], length 0
21:47:39.826081 IP master.36345 > node1.http: Flags [.], ack 5151, win 319, options [nop,nop,TS val 7676055 ecr 6754976], length 0
-以下、略-

#21 NFLOGの使い方
iptablesにNFLOGというターゲットがあります。
このターゲットでやり取りされるパケットのキャプチャ方法を以下に示します。

##21.1 実験結果

事前準備をする。宛先TCPポート番号が11111番は、NFLOGというターゲットに送る。
[root@master ~]# iptables -I INPUT -p tcp --dport 11111 -j NFLOG

設定を確認する。
[root@master ~]# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 44 packets, 4256 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 NFLOG      tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:11111

もう1つターミナルを開く。便宜上"ターミナル2"と呼ぶ。11111番ポートでListenする。
[root@master ~]# nc -kl 11111 &
[1] 1982

ターミナル2でtcpdumpを実行する。インタフェースとしてnflogを指定する。
[root@master ~]# tcpdump -i nflog -nn
-以下、略-

さらに、もう1つターミナルを開く。11111番ポートに対してTCPコネクションを張る。
[root@master ~]# nc master 11111

ターミナル2の標準出力を確認する。
[root@master ~]# tcpdump -i nflog -nn
tcpdump: WARNING: SIOCGIFADDR: nflog: No such device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nflog, link-type NFLOG (Linux netfilter log messages), capture size 65535 bytes
20:55:35.574281 IP 192.168.0.10.49970 > 192.168.0.10.11111: Flags [S], seq 426419978, win 43690, options [mss 65495,sackOK,TS val 1711742 ecr 0,nop,wscale 7], length 0
20:55:35.574608 IP 192.168.0.10.49970 > 192.168.0.10.11111: Flags [.], ack 381759371, win 342, options [nop,nop,TS val 1711742 ecr 1711742], length 0

##21.2 疑問
nflogインタフェースを通過するパケットは確認できた。しかし、3 way Hand Shakeの2つ目のパケットが採取できない。なぜだろうか???

  |---- SYN ---->|
  |<-- SYN+ACK --| <===このパケットがtcpdump実行結果に表示されない。。。なぜだろうか???
  |---- ACK ---->|

#22 指定したIPパケットを表示する方法
IPv4だけ、もしくはIPv6パケットだけを表示する方法を説明します。

IPv4パケットだけを表示する方法(ip)
[root@dns ~]# tcpdump -i eth0 ip
IPv6パケットだけを表示する方法(ip6)
[root@dns ~]# tcpdump -i eth0 ip6

#x 参考情報
http://www.tcpdump.org
ネットワークトラフィックをダンプ出力する

54
59
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
59