設定、ログファイルからiptablesコマンドに変換する

■/var/log/iptables.log、/etc/iptables-saveからiptablesコマンドに変換
 sfwreport/sfw-reverce/sfw-or/sfw-refresh編
 「-t filter」のみサポート。

 sfw
 http://sourceforge.jp/users/labunix/pf/smallfirewall/

■「rsyslog.conf」の設定の変更

 「iptables」のログをdebugにして「/var/log/iptables.log」に保存、
 以降、「iptables」があるログは「syslog|messages」等に出力しない。

$ grep RULES -B 1 -A 6 /etc/rsyslog.conf
###############
#### RULES ####
###############

kern.debug                      /var/log/iptables.log
:syslogtag, contains, "iptables" ~
#
# First some standard log files.  Log by facility.
$ sudo /etc/init.d/rsyslog reload

■例えば以下のようなNICTにntpアクセスしているログがある

$ sudo grep IN= /var/log/iptables.log | head -1 | sed s/" "/"\n"/g
Mar
17
22:33:49
debian-lenny
kernel:
[1618197.008281]
iptables-ou
IN=
OUT=eth0
SRC=192.168.188.188
DST=133.243.238.243
LEN=76
TOS=0x00
PREC=0x00
TTL=63
ID=0
DF
PROTO=UDP
SPT=50852
DPT=123
LEN=56

■これをsfwreportを使ってiptablesのコマンドに変換

$ sudo ./sfwreport

■ポート123に絞って見る

$ grep 123 /var/log/sfwreport.log
iptables -A OUTPUT -o eth0 -s 192.168.188.188 -d 133.243.238.243 -p UDP --sport 50852 --dport 123 -j ACCEPT
iptables -A OUTPUT -o eth0 -s 192.168.188.188 -d 133.243.238.243 -p UDP --sport 43659 --dport 123 -j ACCEPT
iptables -A INPUT -i eth0 -s 131.113.63.2 -d 192.168.188.188 -p UDP --sport 123 --dport 123 -j ACCEPT

■上記を元にコマンドを作成、実行

$ sudo iptables -A INPUT -i eth0 -d 192.168.188.188 -p UDP --sport 123 --dport 123 -j ACCEPT
$ sudo iptables -A OUTPUT -o eth0 -s 192.168.188.188 -p UDP --dport 123 -j ACCEPT

※INPUTは「-m multiport」を使っても良い。

$ sudo iptables -A INPUT -i eth0 -d 192.168.188.188 -p UDP -m multiport --ports 123 -j ACCEPT

■「watch」コマンドでリアルタイムに確認

$ sudo watch -d -n 1 'iptables -L -v -n | grep ACCEPT'
Every 1.0s: iptables -L -v -n | grep ACCEPT             Sun Mar 18 00:41:19 2012

Chain INPUT (policy ACCEPT 1261 packets, 96692 bytes)
    0     0 ACCEPT     udp  --  eth0   *       0.0.0.0/0            192.168.188.188
        udp spt:123 dpt:123
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 979 packets, 117K bytes)
    0     0 ACCEPT     udp  --  *      eth0    192.168.188.188         0.0.0.0/0
        udp dpt:123

■「/etc/iptables-save」にカウンタを含めて保存

$ su root -c 'iptables-save -c > /etc/iptables-save'

■「sfw-reverce」コマンドで逆変換
 ※現状はfilterのみサポート

$ sudo ./sfw-reverce
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -d 192.168.188.188/32 -i eth0 -p udp -m udp --sport 123 --dport 123 -j ACCEPT
iptables -A OUTPUT -s 192.168.188.188/32 -o eth0 -p udp -m udp --dport 123 -j ACCEPT

■「FORWARD」ポリシーのヒットは「0」なので、POLICYをDROPに変更

$ sudo iptables -L -v -n | grep FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
$ sudo iptables -P FORWARD DROP
$ su root -c 'iptables-save -c > /etc/iptables-save'
$ sudo ./sfw-reverce
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -d 192.168.1.88/32 -i eth0 -p udp -m udp --sport 123 --dport 123 -j ACCEPT
iptables -A OUTPUT -s 192.168.1.88/32 -o eth0 -p udp -m udp --dport 123 -j ACCEPT

■FORWARDチェインにLOGルールを追加

$ sudo iptables -A FORWARD -j LOG --log-prefix "iptables-fw " --log-level debug
$ sudo iptables -L -v -n | grep -A 2 "FORWARD"
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0   
        LOG flags 0 level 7 prefix 'iptables-fw '
$ su root -c 'iptables-save -c > /etc/iptables-save'
$ sudo ./sfw-reverce
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -d 192.168.1.88/32 -i eth0 -p udp -m udp --sport 123 --dport 123 -j ACCEPT
iptables -A FORWARD -j LOG --log-prefix "iptables-fw" --log-level 7
iptables -A OUTPUT -s 192.168.1.88/32 -o eth0 -p udp -m udp --dport 123 -j ACCEPT

■ポリシーが「0」で無いのは、「INPUT/OUTPUT」チェイン

$ sudo iptables -L -v -n | grep "policy" | grep -v " 0 "
Chain INPUT (policy ACCEPT 2934 packets, 220K bytes)
Chain OUTPUT (policy ACCEPT 2279 packets, 262K bytes)

■INPUTチェインのログを出して、設定に反映する

$ sudo iptables -A INPUT -j LOG --log-prefix "iptables-in " --log-level debug
$ sudo iptables -L -v -n | grep -A 3 "INPUT" | grep LOG
   88  6792 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0 
          LOG flags 0 level 7 prefix 'iptables-in '
$ sudo ./sfw-reverce | grep LOG | grep INPUT
iptables -A INPUT -j LOG --log-prefix "iptables-in " --log-level 7
$ sudo ./sfwreport
$ grep INPUT /var/log/sfwreport.log  | sort | uniq | head -5 | grep -v 123
iptables -A INPUT -i eth0 -s 192.168.188.190 -d 192.168.188.188 -p TCP --sport 1275 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.188.189 -d 192.168.188.188 -p TCP --sport 1917 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.188.189 -d 192.168.188.188 -p TCP --sport 3804 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.188.189 -d 192.168.188.188 -p TCP --sport 3805 --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -i eth0 -d 192.168.188.188 -p TCP --dport 22 -j ACCEPT

■rsyslogdのログをリセット
 ※一旦INPUTログを空行を追加する。
  sshルールを追加した後にLOGが来るようにLOGルールの削除と追加

$ sudo iptables -D INPUT -j LOG --log-prefix "iptables-in " --log-level debug
$ sudo iptables -A INPUT -j LOG --log-prefix "iptables-in " --log-level debug
$ su root -c ' echo "" > /var/log/iptables.log ;pkill -HUP rsyslogd'

■また、「/etc/iptables-save」の設定をコマンドに還元するので、以下のようにも出来る。
 ※実行権を付与しても良い。

$ su root -c ' ./sfw-reverce > /etc/smallfirewall'
$ sudo /bin/bash /etc/smallfirewall

■ssh経由等、設定が失敗して困る場合は以下のようにする。
 ※「/etc/iptables-save」は正常に機能する最新の設定である事が条件。
  タイムアウトすると、「/etc/iptables-save」から設定を書き戻す。
  同じ事を「sfw-or」で行える。

$ sudo iptables -P INPUT DROP;sudo iptables-apply -t 10 /etc/iptables-save || sudo iptables-restore -c /etc/iptables-save
$ sudo iptables -P INPUT DROP; sudo ./sfw-or
Applying new ruleset... done.
Can you establish NEW connections to the machine? (y/N)

■「/etc/smallfirewall」の移行サンプル

# sed s%"192.168.188.88/32"%'${HOMEIP}'%g /etc/smallfirewall  | \
  sed s%"192.168.188.0/24"%'${HOMENET}'%g | \
  sed s%"192.168.188.255/32"%'${HOMECAST}'%g | \
  sed s%'iptables -P INPUT'%'#!/bin/bash'"\n"'HOMEIP=192.168.188.189/32'"\n&"% | \
  sed s%"^HOMEIP.*\$"%"\n&"'HOMENET=192.168.188.0/24'"\n"'HOMECAST=192.168.188.255/32'% > /etc/smallfirewall.homenet

■移行先でのコマンド

# iptables -F;/bin/bash /etc/smallfirewall.homenet
# sfw-refresh

■ちなみに否定の「!」を使う際は位置にご注意を。

★Lenny

 -s ! ${HOMENET}

★squeeze

 ! -s ${HOMENET}