iptablesとwatchでトラブルシュート

■バッチモードは「while」文を使うとして、「watch」コマンドをもう少し遊んでみる。

 『問題点』
 ・「awk '{if ($1 != 0) print }'」のシングルクォーテーションがそのまま使えない。
  ⇒「grep -v "^   0"」で代用。

 ・それでも1ページで収まらない。
  ⇒ルールやポートの絞込みで対応

 ・各環境で必要な設定は異なるので、ユーザレベルで使える設定方法を示したい。

$ sudo watch -d -n 1 'iptables -L -v -n | grep -v "^    0"'
Every 1.0s: iptables -L -v -n | grep -v "^    0"                   Tue Feb 28 22:18:41 2012

Chain INPUT (policy DROP 9 packets, 2824 bytes)
 pkts bytes target     prot opt in     out     source               destination
   88  4400 ACCEPT     tcp  --  lo     *       0.0.0.0/0            0.0.0.0/0
〜省略〜

■特定のポートのみ監視

$ sudo watch -d -n 1 'iptables -L -v -n | grep ":22 \|Chain"'
Every 1.0s: iptables -L -v -n | grep ":22 \|Chain"                 Tue Feb 28 22:22:40 2012

Chain INPUT (policy DROP 9 packets, 2824 bytes)
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            192.168.1.0/24      tcp
 dpt:22 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp
 spt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp
 dpt:22 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp
 spt:22 state NEW,RELATED,ESTABLISHED
Chain OUTPUT (policy DROP 290 packets, 37326 bytes)
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           tcp
 spt:22 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           tcp
 dpt:22

■DROPのみ監視
 ※sfwのデフォルトではDROPしない。各ポリシーをDROPに変更している
  明示的にACCEPTされないパケットは破棄。
  ⇒LOGとDROPの数がイコールの関係にある。

$ sudo watch -d -n 1 'iptables -L -v -n | grep "DROP\|Chain\|LOG"'
Every 1.0s: iptables -L -v -n | grep "DROP\|Chain\|LOG"            Tue Feb 28 22:26:00 2012

Chain INPUT (policy DROP 9 packets, 2824 bytes)
    9  2824 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG
 flags 0 level 6 prefix `iptables-in '
Chain FORWARD (policy DROP 0 packets, 0 bytes)
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG
 flags 0 level 6 prefix `iptables-fo '
Chain OUTPUT (policy DROP 290 packets, 37326 bytes)
  290 37326 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG
 flags 0 level 6 prefix `iptables-ou '
■待ち受け監視
 ※強引に最新のsyslogと一緒に出力

$ sudo watch -d -n 1 'iptables -L -v -n | grep ":22 \|Chain\|LOG";grep "IN=" /var/log/syslog | grep "22" | tail -1'
Every 1.0s: iptables -L -v -n | grep ":22 \|Chain\|LOG";grep "...  Tue Feb 28 23:01:44 2012

Chain INPUT (policy ACCEPT 13 packets, 884 bytes)
    0     0 ACCEPT     tcp  --  eth0   *       192.168.72.1         0.0.0.0/0           tcp
 spt:22
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            192.168.72.1        tcp
 dpt:22
    0     0 LOG        tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp
 spt:22 LOG flags 0 level 6 prefix `sfw-log '
   13   884 LOG        tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp
 dpt:22 LOG flags 0 level 6 prefix `sfw-log '
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 11 packets, 2464 bytes)
Feb 28 22:55:23 squeeze kernel: [  669.829772] sfw-log IN=eth0 OUT= MAC=00:XX:XX:XX
:XX:XX:00:XX:XX:XX:00:XX:XX:00 SRC=192.168.72.1 DST=192.168.72.199 LEN=52 TOS=0x10 PREC=0x0
0 TTL=64 ID=16985 DF PROTO=TCP SPT=46628 DPT=22 WINDOW=501 RES=0x00 ACK URGP=0
■上記は以下の間違った設定のログ。指定するべきは、「-s,--dport」。

iptables -A INPUT -i eth0 -p tcp -s 192.168.72.1 --sport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -d 192.168.72.1 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -j LOG --log-level info --log-prefix "sfw-log "
iptables -A INPUT -i eth0 -p tcp --dport 22 -j LOG --log-level info --log-prefix "sfw-log "

■よって、INPUTについては、以下の一行だけで良い。

$ sudo iptables -A INPUT -i eth0 -p tcp -s 192.168.72.1 --dport 22 -j ACCEPT

■再確認。INPUTのカウントアップは、設定したルールのみ。

$ sudo watch -d -n 1 'iptables -L -v -n | grep ":22 \|Chain\|LOG"'

Every 1.0s: iptables -L -v -n | grep ":22 \|Chain\|LOG"            Tue Feb 28 23:05:57 2012

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
   85  7492 ACCEPT     tcp  --  eth0   *       192.168.72.1         0.0.0.0/0           tcp
 dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 71 packets, 8892 bytes)

■sfwreportでログの確認。

    372 IN=eth0,OUT=,SRC=192.168.72.1,DST=192.168.72.199,PROTO=TCP,SPT=46628,DPT=22,ACK
    310 IN=,OUT=eth0,SRC=192.168.72.199,DST=192.168.72.1,PROTO=TCP,SPT=22,DPT=46628,ACK,PSH
     45 IN=eth0,OUT=,SRC=192.168.72.1,DST=192.168.72.199,PROTO=TCP,SPT=46628,DPT=22,ACK,PSH
      5 IN=,OUT=eth0,SRC=192.168.72.199,DST=192.168.72.1,PROTO=TCP,SPT=22,DPT=46628,ACK

■上記からOUTPUT/INPUTを検証用に書き直すとこんな感じ。
 ということは、ゼロカウントの場合、設定が不要か、間違っているという事。
 再考が必要ですね。。。

$ cat sshonly_test.sh
#!/bin/bash

iptables -A INPUT -i eth0 -p tcp -s 192.168.72.0/24 --dport 22 \
  -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp -s 192.168.72.0/24 --dport 22 \
  -m state --state NEW -m recent --update --seconds 60 \
  --hitcount 8 --rttl --name SSH -j DROP
iptables -A INPUT -i eth0 -p tcp -s 192.168.72.0/24 --dport 22 \
  -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 192.168.72.0/24 --dport 22 \
  -m state --state RELATED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.72.1 --sport 22 \
  -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.72.1 --sport 22 \
  -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.72.1 --sport 22 \
  -m state --state RELATED -j ACCEPT

■sshで通信が確立している状態、ログインが成功しても、8回/分まで。
 普段使わない「RELATED」は「ログ+許可」か、「ログ+拒否」も要検討。。。

$ sudo watch -d -n 1 'iptables -L -v -n | grep ":22 \|Chain\|LOG"'
Chain INPUT (policy ACCEPT 14 packets, 917 bytes)
    9   540            tcp  --  eth0   *       192.168.72.0/24      0.0.0.0/0
        tcp dpt:22 state NEW recent: SET name: SSH side: source
    2   120 DROP       tcp  --  eth0   *       192.168.72.0/24      0.0.0.0/0
        tcp dpt:22 state NEW recent: UPDATE seconds: 60 hit_count: 8 TTL-Match n
ame: SSH side: source
  432 42608 ACCEPT     tcp  --  eth0   *       192.168.72.0/24      0.0.0.0/0
        tcp dpt:22 state ESTABLISHED
    0     0 ACCEPT     tcp  --  eth0   *       192.168.72.0/24      0.0.0.0/0
        tcp dpt:22 state RELATED
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 7 packets, 497 bytes)
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            192.168.72.1
        tcp spt:22 state NEW
  334 64759 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            192.168.72.1
        tcp spt:22 state ESTABLISHED
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            192.168.72.1
        tcp spt:22 state RELATED