Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1502629
  • 博文数量: 297
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3082
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 11:36
文章分类

全部博文(297)

文章存档

2011年(1)

2009年(45)

2008年(67)

2007年(184)

我的朋友

分类: LINUX

2007-08-23 15:30:59

iptables之日志利器-ULOGD使用手记

ULOGD - the Userspace Logging Daemon
引用一段作者的原话:
Harald Welte <laforge@gnumonks.org>

This packages is intended for passing packets from the kernel to userspace
to do some logging there. It should work like that:

- Register a target called ULOG with iptables
- if the target is hit:
- send the packet out using netlink multicast facility
- return NF_CONTINUE immediately

New with ipt_ULOG 0.8 we can accumulate packets in userspace and send
them in small batches (1-50) to userspace. This reduces the amount of
expensive context switches.

More than one logging daemon may listen to the netlink multicast address.

当我们在使用iptables配合LOG使用的时候,总感觉有些凌乱,因为里面啥都有,可我们只需要其中的一部分而已,并且从众多LOG中提取出的有用的记录,并且还要有效地组织起来还得真费一番脑筋,假如要是能把这些记录都存进数据库,那就好办了,于是查看iptables文档,发现了ULOG这个利器,以下就是我在安装,使用过程中的一点心得体会,希望能给有这需要的兄弟提供一点便利,当作抛砖引玉吧!


ULOG可以在用户空间记录被匹配的包的信息,这些信息和整个包都会通过netlink socket被多播。然后,一个或多个用户空间的进程就会接受它们。换句话说,ULOG是至今iptables和Netfilter下最成熟、最完善的日志工具,它包含了很多更好的工具用于包的记录。这个target可以是我们把信息记录到MySQL或其他数据库中。这样,搜索特定的包或把记录分组就很方便了。
ULOG 直接由 iptables 将纪录写入mysql等数据库,效能比较好。

一、条件:如果内核版本>=2.4.18-pre8,那么内核已经支持ULOG了,一般会在/lib/modules/内核版本/kernel/net/ipv4/netfilter/
下会有ipt_ULOG.o,那就说明你不需要再重新编译内核了,如果你的没有,那得重新编译内核了,内核版本要高于2.4.18-pre8
在内核选项的将ULOG选上,然后重新编译/kernel/net/ipv4/netfilter这个目录就行了.
2.4内核用make modules SUBDIRS=net/ipv4/netfilter,
2.6用make ./net/ipv4/netfilter,如果你不清楚的话,在你存放内核的目录使用make --help,查看相关说明。
只编译对应模块就行了,没必要将内核重新编译一次,省时省力。

二、ulogd源码可以在此处找到,Srpm包也可以在此处找到
然后:
tar -zxvf ulogd-1.23.tar.bz2
cd ulogd-1.23
./configure --help
如果你想要它支持Mysql,或者是pgsql、sqlite3等,可加上选当参数--with-mysql=path或是--with-pgsql=path,这个要mysql-devel、pgsql-devel包,
使用rpm -ql mysql-devel,看看在什么路径,然后在加在后面,像我的系统是/usr/include,则为:--with-mysql=/usr/include
./configure --with-mysql=/usr/include
如果其中有错误的话,看出错信息,将一些缺少的包装上,应该就没问题了。
make
make install
默认安装路径为/usr/local/
至此安装过程完了,接下来就是具体使用它的功能了;

三、1.创建mysql数据库,这个在后面要用到:
以下为mysql数据库操作,为了使不会mysql的兄弟也能看懂,加上了注释;
#mysql -u root
mysql>create database ulogd;
#创建用于存放ulogd的数据库ulogd
mysql>grant create,select,insert on ulogd.* to ulog_user@localhost identified by 'ulog_passwd'
#以上是将ulogd数据库的create,select,insert此三项权限赋于用户ulog_user,并且ulog_user只能从本机登陆,密码为:ulog_passwd
mysql>quit

然后我们要把ulogd内建的table输入到mysql,此table在/doc目录下,是个标准的sql文件,用于创建ulogd内置的ulog表:
cd ulogd-1.23/doc
#cat mysql.table|mysql -D ulogd -u ulogd_user -p
然后输入密码ulog_passwd,这样如果没出错的话,建好了,如果有出错,查看出错信息,找出原因;
验证一下是表是否成功:

#mysql -u root
mysql>use ulogd;
mysql>show tables;
查看其输出结果,看是否存在一个叫ulog的表,要是有了,就成功了。

四、接下来修改一下ulogd的配置文件:
如果你选择了支持mysql及其它一些参数的话,要先修改ulog的配置文件才能使用对应功能,
vi /etc/ulogd.conf
将下面这段进行修改,修改为你在./configure所指定的参数即可,我选择的是支持mysql,如下:

# output plugins.
plugin="@libdir@/ulogd_LOGEMU.so"
#plugin="@libdir@/ulogd_OPRINT.so"
#plugin="@libdir@/ulogd_MYSQL.so"
#plugin="@libdir@/ulogd_PGSQL.so"
#plugin="@libdir@/ulogd_SQLITE3.so"
#plugin="@libdir@/ulogd_PCAP.so"

修改为:
# output plugins.
#plugin="@libdir@/ulogd_LOGEMU.so" #注释掉此行
#plugin="@libdir@/ulogd_OPRINT.so"
plugin="@libdir@/ulogd_MYSQL.so" #启用mysql作为输出插件
#plugin="@libdir@/ulogd_PGSQL.so"
#plugin="@libdir@/ulogd_SQLITE3.so"
#plugin="@libdir@/ulogd_PCAP.so"


还要修改mysql一些参数:表名、密码、用户名、数据库名、登陆主机;
[MYSQL]
table="ulog"
pass="changeme"
user="laforge"
db="ulogd"
host="localhost"

修改为和上面设置的参数一致:
[MYSQL]
table="ulog"
pass="ulog_passwd"
user="ulog_user"
db="ulogd"
host="localhost"

如果你喜欢其它的一些参数,请对应做修改就行:
好了,到此ulogd就已经都搞定了,

五、接下来就具体应用于功能:
首先启用ulogd进程:
ulogd -d
也可以将ulogd-1.23目录下的ulogd.init拷贝到/etc/init.d/ulogd下,将ulogd路径做适当的修改,chkconfig --level 235 ulogd on ,
service ulogd start启动。
然后在iptables里面加入相应的对数即可;
共有四个参数可供使用:
1.--ulog-nlgroup
iptables -A INPUT -p TCP --dport 22 -j ULOG --ulog-nlgroup 2
指定向哪个netlink组发送包,比如-- ulog-nlgroup 2。一共有32个netlink组,它们被简单地编号位1-32。默认值是1。

2.--ulog-prefix
iptables -A INPUT -p TCP --dport 22 -j ULOG --ulog-prefix "SSH connection attempt: "
指定记录信息的前缀,以便于区分不同的信息。使用方法和 LOG的prefix一样,只是长度可以达到32个字符。

3.--ulog-cprange
iptables -A INPUT -p TCP --dport 22 -j ULOG --ulog-cprange 100
指定每个包要向“ULOG在用户空间的代理”发送的字节数,如--ulog-cprange 100,
表示把整个包的前100个字节拷贝到用户空间记录下来,其中包含了这个包头,还有一些包的引导数据。默认值是0,表示拷贝整个包,不管它有多大。

4.--ulog-qthreshold
iptables -A INPUT -p TCP --dport 22 -j ULOG --ulog-qthreshold 10
告诉ULOG在向用户空间发送数据以供记录之前,要在内核里收集的包的数量,如--ulog-qthreshold 10。
这表示先在内核里积聚10个包,再把它们发送到用户空间里,它们会被看作同一个netlink的信息,只是由好几部分组成罢了。
默认值是1,这是为了向后兼容,因为以前的版本不能处理分段的信息

当你在需要记录日志的地方使用了ULOG后,如果有包被匹配的话,在你的mysql的数据库ulogd里就会有相应的记录了,在这
里不得不说一句它的缺陷,当我查看记录的时候发现登记的ip地址是一个无符号整形数,也就是说你要自己将它进行转化,
先将它转化为16进制,然后每两位再转化为10进制就可以了,一点都不直观,不知道能不能修改一下,有能力的兄弟
自己修改一下吧,呵呵,记录下的数据你就可以通过登陆mysql数据库来进行查看,并且现在有很多mysql的前端工具,
配合使用这些工具查看起来就会更为方便了,如phpMyAdmin等,这部分内容就不在此讨论,论坛有很多相关资料,
如有需要请搜索相关内容。
至于ULOG的一些其它功能就希望有用到的弟兄进行补充了。。
阅读(1609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~