■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]