■バッチモードは「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
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