labunix's blog

labunixのラボUnix

10分置きにローテーションと圧縮しながらパケットキャプチャする。

10分置きにローテーションと圧縮しながらパケットキャプチャする。
 環境は以下。

$ lsb_release -d
Description:	Debian GNU/Linux 8.2 (jessie)

$ sudo tcpdump -help 2>&1 | head -3
tcpdump version 4.6.2
libpcap version 1.6.2
OpenSSL 1.0.1k 8 Jan 2015

$ tshark -v | head -1
TShark 1.12.1 (Git Rev Unknown from unknown)

$ wireshark -v | head -1
wireshark 1.12.1 (Git Rev Unknown from unknown)

■ところでdebianに付属のmanマニュアルは余りに古すぎる。

$ man 8 tcpdump 2>/dev/null | tail -1 | awk '{print $1,$2,$3}'
30 June 1997

■一行説明であれば、下記で十分だと思う。

$ w3m -dump http://www.tcpdump.org/tcpdump_man.html | \
    awk '/^-i|^-w|^-G|^-z|^-Z/{print}'
-G rotate_seconds
-i interface
-w file
-z postrotate-command
-Z user

■「-Z [username]」オプションがポイント

$ sudo tcpdump -i eth0 "port 53" \
    -w dnsclient-%F-%T.pcap -G 600 -z gzip -Z labunix &
  sudo tcpdump -i eth2 "port 3128" \
    -w squid-%F-%T.pcap -G 600 -z gzip -Z labunix &

■DNSは上位側のNICから出ていく環境。
 直接外部に出ることはなく、
 上位のDNSサーバのクエリログで分かる情報なので突合せ用のオマケ程度。

$ sudo tcpdump -n -r dnsclient-2015-11-21-00\:10\:11.pcap 2>/dev/null | tail -5
00:12:08.785016 IP 192.168.102.1.254.53 > 192.168.102.1.253.37590: 49044 2/2/2 CNAME star-mini.c10r.facebook.com., A 31.13.82.36 (146)
00:15:54.001990 IP 192.168.102.1.253.37590 > 192.168.102.1.254.53: 30246+ A? shavar.services.mozilla.com. (45)
00:15:54.002049 IP 192.168.102.1.253.37590 > 192.168.102.1.254.53: 48026+ AAAA? shavar.services.mozilla.com. (45)
00:15:54.008770 IP 192.168.102.1.254.53 > 192.168.102.1.253.37590: 48026 0/0/0 (45)
00:15:54.034966 IP 192.168.102.1.254.53 > 192.168.102.1.253.37590: 30246 9/4/4 CNAME shavar.prod.mozaws.net., A 52.26.89.67, A 52.88.155.162, A 52.25.63.78, A 52.27.63.37, A 52.27.159.60, A 54.191.145.186, A 52.32.59.229, A 52.27.10.252 (407)

■どこの家庭でもプロキシサーバ宛の通信をFWで制限していると思う。
 内部側のTCPはsshとプロキシポート位しか通過しないのだけど、
 sshのパケットは意外と大きいので「not tcp port 22」で除外しても良い。
 「http.request.method」を使うと宛先URLを絞りやすい。

 tsharkでSquid3のSSL転送を確認してみる。
 http://labunix.hateblo.jp/entry/20151022/1445451661

$ sudo tshark -n -r squid-2015-11-21-00\:10\:44.pcap \
    -T fields -E separator=';' \
    -e frame.time \
    -e ip.src -e tcp.srcport \
    -e ip.dst -e tcp.dstport \
    -e tcp.flags.syn -e tcp.flags.ack \
    -e http.request.method -e http.host \
    -e http.request.uri 2>/dev/null | \
   awk '/GET|PUT|POST|CONNECT/{print}' | tail -5
Nov 21, 2015 00:22:46.596043000 JST;172.17.21.90;39985;172.17.21.254;3128;0;1;GET;www.fortinet.com;http://www.fortinet.com/sites/default/files/fonts/fontawesome-webfont.woff?v=4.0.3
Nov 21, 2015 00:12:08.539115000 JST;172.17.21.90;39958;172.17.21.254;3128;0;1;CONNECT;googleads.g.doubleclick.net:443;googleads.g.doubleclick.net:443
Nov 21, 2015 00:12:08.615497000 JST;172.17.21.90;39958;172.17.21.254;3128;0;1;CONNECT;googleads.g.doubleclick.net:443;googleads.g.doubleclick.net:443
Nov 21, 2015 00:12:08.742056000 JST;172.17.21.90;39959;172.17.21.254;3128;0;1;CONNECT;www.facebook.com:443;www.facebook.com:443
Nov 21, 2015 00:12:18.157433000 JST;172.17.21.90;39960;172.17.21.254;3128;0;1;CONNECT;blog.st-hatena.com:443;blog.st-hatena.com:443

■pcap形式なので、wiresharkでも読める。

$ gunzip squid-2015-11-21-00\:10\:44.pcap.gz 
$ wireshark -r squid-2015-11-21-00\:10\:44.pcap

■余分なパケットが無く私しか利用しない環境なのでパケットサイズも
 それほど大きくならない。なお、圧縮率は平均50%。

$ ls [ds]*pcap.gz | awk '{print "gzip -l "$1}' | sh | \
    awk '/^ *[0-9]/{sum+=$3;cnt+=1};END{print sum/cnt"%"}'
50.525%

$ ls [sd]*.pcap*
dnsclient-2015-11-21-00:10:11.pcap.gz  squid-2015-11-21-00:10:44.pcap.gz
dnsclient-2015-11-21-00:22:03.pcap.gz  squid-2015-11-21-00:21:31.pcap.gz
dnsclient-2015-11-21-00:32:07.pcap     squid-2015-11-21-00:31:31.pcap

$ jobs$ du -h [ds]*pcap*
8.0K	dnsclient-2015-11-21-00:10:11.pcap.gz
8.0K	dnsclient-2015-11-21-00:22:03.pcap.gz
0	dnsclient-2015-11-21-00:32:07.pcap
268K	squid-2015-11-21-00:10:44.pcap.gz
996K	squid-2015-11-21-00:21:31.pcap.gz
56K	squid-2015-11-21-00:31:31.pcap

$ gzip -l squid-2015-11-21-00:10:44.pcap.gz
         compressed        uncompressed  ratio uncompressed_name
             266604              379151  29.7% squid-2015-11-21-00:10:44.pcap

■ジョブの確認

$ jobs
[1]-  実行中               sudo tcpdump -i eth0 "port 53" -w dnsclient-%F-%T.pcap -G 600 -z gzip -Z labunix &
[2]+  実行中               sudo tcpdump -i eth2 "port 3128" -w squid-%F-%T.pcap -G 600 -z gzip -Z labunix &

■ログオフしても使うなら「nohup」

$ sudo nohup tcpdump -i eth0 "port 53" -w dnsclient-%F-%T.pcap -G 600 -z gzip -Z labunix &
$ sudo nohup tcpdump -i eth2 "port 3128" -w squid-%F-%T.pcap -G 600 -z gzip -Z labunix &

■ログオフして再ログインした場合

$ jobs
$ ps aux | awk '/[p]cap/{print $2,$(NF-6)}'
3794 dnsclient-%F-%T.pcap
3795 dnsclient-%F-%T.pcap
3796 squid-%F-%T.pcap
3797 squid-%F-%T.pcap

$ seq 3794 3797 | awk '{print "pstree "$1}' | sh
sudo───tcpdump
tcpdump
sudo───tcpdump
tcpdump
$ pkill tcpdump
$ ps aux | grep tcpdum[p]