iptablesの様々なログ取得方法

■定番の方法「tail -f」
 「nmap -A」でのログ

$ sudo tail -f /var/log/syslog | grep iptables
Feb 27 21:19:44 squeeze kernel: [ 2298.195783] iptables-ou IN= \
 OUT=eth0 SRC=192.168.72.188 DST=192.168.72.1 LEN=40 TOS=0x00 PREC=0x00 TTL=64 
ID=0 DF PROTO=TCP SPT=1 DPT=50537 WINDOW=0 RES=0x00 RST URGP=0

■量が多すぎて追えない/量が多い通信が知りたい/iptablesの設定がしやすい形式で見たい。
 「nmap -A」のログ

 smallfirewall-20120223_v0.0_working.tar.gz
 http://sourceforge.jp/users/labunix/pf/smallfirewall/

$ tar zxvf smallfirewall-20120223_v0.0_working.tar.gz
$ cd smallfirewall-20120223
$ sudo ./sfwreport

以下のようなシステムメールが届く

      5 IN=eth0,OUT=,SRC=192.168.72.1,DST=192.168.72.188,PROTO=UDP,SPT=42498,DPT=42297
      5 IN=eth0,OUT=,SRC=192.168.72.1,DST=192.168.72.188,PROTO=TCP,SPT=50537,DPT=1,ACK
      5 IN=eth0,OUT=,SRC=192.168.72.1,DST=192.168.72.188,PROTO=TCP,SPT=50536,DPT=1,SYN
   〜省略〜

■「logtool」でリッチに
 DBはおまかせで良い。
 これをiptablesのルールに再適用する事を考えると返って読み難かったりする。

$ apt-cache search logtool\$
logtool - 多くの出力オプションを持つ syslog スタイルのログファイルパーサ

$ sudo apt-get install logtool

$ sudo tail -f /var/log/syslog | logtool | grep iptables
Feb 27 21:31:29 squeeze iptables: -j LOG: kernel: [ 3002.685578] iptables-in  {TCP} 192.168.72.1:57106 -> 192.168.72.188:1
Feb 27 21:31:29 squeeze iptables: -j LOG: kernel: [ 3002.685609] iptables-ou  {TCP} 192.168.72.188:1 -> 192.168.72.1:57106
Feb 27 21:31:29 squeeze iptables: -j LOG: kernel: [ 3002.710627] iptables-in  {TCP} 192.168.72.1:57107 -> 192.168.72.188:1

■iptablesのログをリアルタイムで見る
 ハイライト表示にすると、「nmap -A」が「LOG」のルールに引っかかっていることが分かる。
 しかし、これをパイプで持っていこうとすると文字化けるのでカスタマイズ性に欠ける。

$ sudo watch -n 1 -d 'iptables -n -L -v'
Every 1.0s: iptables -L -v -n                                      Mon Feb 27 21:33:11 2012
 pkts bytes target     prot opt in     out     source               destination
〜省略〜
Chain INPUT (policy DROP 0 packets, 0 bytes)
   94  5482 LOG        tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           lim
it: avg 10/sec burst 4 LOG flags 0 level 6 prefix `iptables-in '
■パケットが0で無いものは、iptablesのルールに引っかかったもの

$ sudo iptables -L -v -n | awk '{if ($1 !=0) print}' | head -5
Chain INPUT (policy DROP 1 packets, 332 bytes)
 pkts bytes target     prot opt in     out     source               destination
10424 3159K ACCEPT     tcp  --  lo     *       0.0.0.0/0            0.0.0.0/0
  425 42617 ACCEPT     udp  --  lo     *       0.0.0.0/0            0.0.0.0/0
   25  5040 ACCEPT     icmp --  lo     *       0.0.0.0/0            0.0.0.0/0

■「while」ループで囲ってみる。
 一般的にというか、大体のterminalの行数のデフォルトは24行。
 最終行を使うと、最初の行が見えないので(行数-1)とした。
 パケット列(awk分の$1の箇所)の変化が無い(0)の場合は表示しない。
 パケット列の多い順に並べ替え「sort -n -r -k 1」

$ while true ;do \
     sudo iptables -L -v -n | awk '{if ($1 !=0) print}' | sort -n -r -k 1 |  head -23; \
     sleep 1; \
     clear; \
   done

⇒sfwwatchとか名前付けてsmallfirewallに入れようかなw。

■正常時とアタック時の比較に使う、
 カウンタがリセットされていないか確認したい
 理由はともかく、とにかく残したい場合はシステムメールで。
 cronに登録するなりすれば、定期的にメールで確認できる。

$ sudo iptables -L -v -n | mail -s "iptables status" root