■/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
kern.debug /var/log/iptables.log
syslogtag, contains, "iptables" ~
$ 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.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
■移行先でのコマンド
■ちなみに否定の「!」を使う際は位置にご注意を。
★Lenny
-s ! ${HOMENET}
★squeeze
! -s ${HOMENET}