筆記,IPTables log analyzer安裝起因,之前在和網友討論iptables,進而發現下面這篇文章.
http://www.spps.tp.edu.tw/documents/memo/iptables/iptables.htm有興趣的朋友可以看看,但內容有些需要更正,可以和下面這篇討論,一起參考著看
http://phorum.vbird.org/viewtopic.php?t=3480&highlight=http%3A%2F%2Fwww.spps.tp.edu.tw%2Fdocuments%2Fmemo%2Fiptables%2Fiptables.htm這則討論也很值得閱讀哦! ^^
而原來文章,使我感興趣的是有介紹到一套叫IPTables log analyzer的iptables log 分析軟體,所以就找時間實作了,可以和原文對照做個參考. ^^
這套程式要用到perl,apache,php,mysql.
請到這下載
http://iptablelog.sourceforge.net/原文章中教的是3.0,而我安裝的是4.0版,但大同小異,甚致因為一個在下無法解決的問題(start-stop-daemon: command not found),所以4.0及3.0的裝法完全相同. >"<
而我做想法是,不想在firewall上裝其它與firewall不相關的東西,所以我找了另一台裝有apache,php及mysql server的A機器存放分析過的資料,而B機器是firewall僅拿來做分析log檔及透過mysql client將分析好的資料,
傳到前者那台跑apache,php及mysql server的A機器來跑其它東西,並在firewall上設定syslogd把,iptables的log獨立出來,這是與原文章環境不同的地方,也給大家做個參考.
A機器設定:在A機器這邊要做,允許firewall這邊連線過來的設定及把php程式,放到apache的web目錄下並設定.
這裡引用原文章中的說明:
root@firewall sql# mysql -u root -p(以 root 身分登入 MySql 主控台)
mysql> create database iptables;(建立一個資料庫叫做 iptables,資料庫也可以自行命名,但是要記得修改相關程式)
mysql> grant create,select,insert on iptables.* to iptables_admin@localhost identified by 'xx';(將 iptables 資料庫新建、讀取和寫入權限授權給 iptables_admin 這個帳號,並限制只能從本機連線,密碼為 xx,請自行修改上述指令中之帳號與密碼)
mysql> grant create,select on iptables.* to iptables_user@localhost identified by 'xx';(將 iptables 資料庫讀取權限授權給 iptables_user 這個帳號,並限制只能從本機連線,密碼為 xx,請自行修改上述指令中之帳號與密碼)
root@firewall sql# cat db.sql | mysql -u iptables_admin -p iptables(以 iptables_admin 身分來執行 db.sql,如果你改了資料庫的名字,請記得修改 db.sql)
三四行的部份分別建立了二個帳號,且給與不同的權限,第三行這個帳號是用於分析iptables log將結果傳進mysql server用的,
而php的程式是用第四行的帳號讀取mysql server中的資料,若您嫌麻,都用第三行的資料相信也是可以的. ^^
這裡要注意的是,第三行主機的部份localhost,要改成firewall的ip,因為分析完的資料是從firewall傳過來的.
在來解開抓下來的套件,複製裡面名為web的php程式目錄到,您apache的web目錄下,並更名為newiptables.
然後編輯,config.php,設定php程式連線mysql server的相關設定,也就是用上面到的第四行的使用者權限.
# Host of the MySQL database
$db_host="localhost";
# User of the MySQL database
$db_user="iptables_user";
# Password of the MySQL database
$db_password="xxxx";
如此,A機器設定完成.
B機器設定:ok!在firewall B機器這邊大致上要做的事是,設定iptables的log,安裝mysql client套件,執行iptables的log分析程式.
關於安裝mysql client,因為我有用apt所以....
apt-get insqll mysql
就裝好了.^_____^
而perl在裝linux時,就裝了.
裝完mysql client可以用下面指令測試看看,並驗證剛機器A的設定有沒有問題:
mysql -u iptables_admin -h mysql主機ip -p
若mysql連線有問題請參考:
http://phorum.vbird.org/viewtopic.php?t=1803&highlight=mysql+%B3s%BDuhttp://phorum.study-area.org/viewtopic.php?t=15549&highlight=mysqliptables的log設定:
這裡我只做關鍵性的說明.
log設定的部份,我用User define chain建立,而User define chain須建立在,有用到該chain的rule之前參考如下:
#建立User define chain
iptables -N LOG_DROP #建立LOG_DROP chain
iptables -A LOG_DROP -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DROP] : ' #log target的設定
iptables -A LOG_DROP -j RETURN #RETURN回原來的chain,這裡是回INPUT chain
#建立User define chain
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j RETURN
#用到User defin chain 的rule
iptables -A INPUT -i eth0 -s 123.123.123.123 -p tcp --dport 2222 -j LOG_ACCEPT #符合條件就進LOG_ACCEPT chain
iptables -A INPUT -i eth0 -s 123.123.123.123 -p tcp --dport 2222 -j ACCEPT
#用到User defin chain 的rule
iptables -A INPUT ! -d 192.168.0.255 -j LOG_DROP #符合條件就進LOG_DROP chain,這裡的例子把,broadcast packet 除外.
iptables -A INPUT -j DROP
LOG Target
--log-tcp-options :紀錄tcp header的相關資訊
--log-ip-options :紀錄ip header的相關資訊
但我測試時發現,--log-tcp-options及--log-ip-options ,加不加log的資料似乎沒差,差別再於加了前者,會多"OPT (020405B401010402)"這樣的資料,
但在下不明白那是什麼,man iptables去看,也沒明細,若知道的朋友或許指點一二.
--log-prefix :
用於紀錄log時,在log句首加上某些字串,如:
--log-prefix '
[IPTABLES ACCEPT] : '
--log-prefix '
[IPTABLES DROP] : '
則於log檔中的紀錄(預設會log在/var/log/messages中):
May 6 15:46:38 rh80-1 kernel: [IPTABLES ACCEPT] : IN=eth0 OUT= MAC=00:50:fc:89:3e:b7:00:02:3b:01:6e:ec:08:00 SRC=123.123.123.123 DST=456.456.456.456 LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=7089 DF PROTO=TCP SPT=1272 DPT=2222 WINDOW=64240 RES=0x00 SYN URGP=0 OPT (020405B401010402)
May 6 16:36:26 rh80-1 kernel: [IPTABLES DROP] : IN=eth0 OUT= MAC=00:50:fc:89:3e:b7:00:02:3b:01:6e:ec:08:00 SRC=69.10.8.124 DST=123.123.123.123 LEN=40 TOS=0x00 PREC=0x00 TTL=110 ID=63627 PROTO=TCP SPT=22 DPT=22 WINDOW=43263 RES=0x00 SYN URGP=0
提外話,上面那行DROP的紀錄是真的哦!internet可真是危險呀!才一做log就看到不想看的.
另外因為不希望iptables的資料,log在/var/log/messages中,想獨立出來,所以,修改syslog.
vi /etc/syslog.conf
# *.info,那行加上kern.none 如:
*.info;mail.none;authpriv.none;cron.none;kern.none /var/log/messages
#kernel的資料紀錄到/var/log/iptables.
kern.* /var/log/iptables
然後
service syslog restart
再去看看相關資料是否有log到/var/log/iptables中.
後來經damon及aloysius大的指點,依上面的方式,雖然不會跟message的log混在一起,但kernel的log並不是只有iptables的log還有其它的kernel log,所以可以用iptables log level的方式來作.
在log 的rule加上--log-level debug參數.
iptables -A LOG_DROP -j LOG --log-tcp-options --log-ip-options
--log-level debug --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_ACCEPT -j LOG --log-tcp-options --log-ip-options
--log-level debug --log-prefix '[IPTABLES ACCEPT] : '
再改syslog.conf
# *.info,那行把kern.none 拿掉:
*.info;mail.none;authpriv.none;cron.none; /var/log/messages
#將
kern.* /var/log/iptables
#改為
kern.=debug /var/log/iptables
這樣就獨立出來了. ^^y
執行分析程式:
這4.0版有支緩daemon的方式啟用,步驟是把scripts目錄下,分別把feed_db.pl及iptablelog這二個檔,複製到/usr/local/bin及/etc/rc.d/init.d下,並設定它們,但執行iptablelog時會出現
start-stop-daemon: command not found
的error ,找過系統中沒有這個檔,而套件中也沒附,用google也找不到我要的答案(英文太淺>"<),只知道好像是debin的東西,
好像是個script檔,去rpmfind找,好像是dbkg這個套件裡的東西,但也沒for redhat的,實在技窮,若有朋友知道原由,請各位小弟指點小弟一二.
http://phorum.study-area.org/viewtopic.php?t=16072後來經由上面的討論,得到twu2大的幫忙小弟作了一點改寫,如下:
我把內容改了,現在可以用
./iptablelog start 來啟動.
./iptablelog stop 來停止.
藍色是原本的內容,紅色是我改的內容,但stop部份覺得自己寫得很差(自己都快看不下去了),不知道有沒有更好的方式f^^,還有,改成這樣還算是以daemon的方式在run嗎??
#!/bin/sh
#
# System V init script for iptables logfile analyzer
#
# (c) Thomas Vallaitis <bonewood@gmx.net>
#
# pid isn't saved by iptables logfile analyzer (afaik)
# we have two processes -> more difficult
#
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
LONGNAME="iptables logfile analyzer"
NAME="iptablelog"
DAEMON='/usr/local/bin/feed_db.pl'
set -e
# Main Loop
case $1 in
start)
echo -n "Starting $LONGNAME: ";
#start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- --background
$DAEMON --background
echo $NAME;
;;
stop)
echo -n "Stopping $LONGNAME: "
allpid=`ps aux --cols 1000 | grep "tail --follow=name --retry" | tr -s ' ' | cut -d ' ' -f2`
pid1=`echo $allpid | cut -d ' ' -f1`
pid2=`echo $allpid | cut -d ' ' -f2`
kill -9 $pid1
kill -9 $pid2
#echo -n "Stopping $LONGNAME: "
#start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid || true
#rm -f /var/run/$NAME.pid
#echo $NAME
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop}" >&2
exit 1
;;
esac
exit 0
# EOF
另外也還是可以用回舊版的方法執行
把剛解出來套件,裡面scripts目錄中的feed_db.pl複製到/usr/local/bin下,注意要有執行權限哦!
最後執行
tail --follow=name --retry /var/log/iptables | /usr/local/bin/feed_db.pl &
致此B機器也設定完成.
試試從瀏覽器下http://your.domain/netiptables看看吧! ^^
參考資料:
man iptables
http://phorum.study-area.org/viewtopic.php?t=5072&highlight=iptables+prefixhttp://iptablelog.sourceforge.net/doc/faq.htmlhttp://www.study-area.org/linux/system/linux_conf.htm