[OpenBSD]

[上一小节: 数据包标记] [总目录] [下一小节: 性能]

PF: Logging


目录


介绍

PF在log一个数据包时, 一份数据包头的拷贝被发送到 pflog(4) 接口, 同时还有一些额外的信息, 比如数据包经过的接口, PF采取的动作(放行或禁止)等。pflog(4) 接口允许用户空间的应用程序从内核接收PF的记录数据。如果系统启动时启用了PF, 守护进程 pflogd(8) 就会启动。默认 pflogd(8) 监听 pflog0 接口并将所有log的数据写到日志文件 /var/log/pflog 中。

logging数据包

为了log通过PF的数据包, 必须使用 log 关键字。 注意PF只能记录那些自己放行或禁止的数据包;你不能指定一条规则仅记录数据包。

log 关键字将使所有匹配此规则的数据包被log。在这种情形下这条规则产生了状态, 只有看见的第一个数据包(导致产生状态的数据包)会被log。

可以提供给 log 关键字的选项是:

all
将使所有的匹配数据包, 而非仅有初始化数据包被log。对产生状态的规则很有用。
to pflogN
将所有的匹配数据包记录到指定的 pflog(4)接口。例如, 当使用 spamlogd(8) 时, PF将所有的SMTP通讯记录到专用的 pflog(4) 接口。守护进程 spamlogd(8) 被告知监听哪个接口。这可以使PF的主log文件里不记录SMTP通讯,而且它们也没有必要被记录在那里。 使用 ifconfig(8) 来建立 pflog(4) 接口, 默认的记录接口 pflog0 是自动创建的。
user
将UNIX的user-id和group-id拥有的套接字, 数据包的sourced from/destined to(无论那个套接字是否是本地的)与常规的记录信息一同log下来。

选项在 log 关键字的后面的圆括号内给出;多个选项可以用逗号或空格分开。

pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

阅读log文件

pflogd写的Log文件是二进制格式, 不能使用文本编辑器阅读。想查看log必须用Tcpdump。

查看log文件:

# tcpdump -n -e -ttt -r /var/log/pflog

注意, 这样用tcpdump(8)看pflog文件时并不是显示的实时信息。要实时查看log的数据包必须使用 pflog0 接口:

# tcpdump -n -e -ttt -i pflog0

注意: 当分析日志时, 要特别小心tcpdump的详细协议解码(通过在命令行里增加 -v 选项激活)。Tcpdump的协议解码器并没有完美的安全历史。至少在理论上, 可能通过log设备记录的部分数据包负载记录发起一个延时的攻击。推荐的做法是在进行分析前将日志文件从防火墙所在机器移出来。

另一个需要注意的是安全地访问logs。默认情况下, pflogd 把数据包的96个字节记录在log文件里, 访问日志文件就能访问数据包的部分敏感信息(像 telnet(1)ftp(1) 的username和password等).

过滤log输出

因为pflogd在log时采用tcpdump二进制格式, 当查看这些log时可以使用tcpdump的全部功能。例如, 只查看匹配某个特定端口的数据包:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

可以通过指定到特定主机和端口的数据包得到更精确的结果:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

同样, 这种思路也可以用在从pflog0接口读取:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

注意, 这并不影响数据包被记录到pflogd的log文件; 上面的命令仅显示正在被记录的数据包。

除了使用标准的 tcpdump(8) 过滤规则, 为了阅读pflogd的输出tcpdump过滤语言代码已经进行的扩展:

例如:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

这会实时显示在wi0接口上被阻止的进站数据包的记录。

通过Syslog来log数据包

在许多情况下, 我们希望有ASCII格式的防火墙log和/或把它们发送到一个远程日志服务器。所有这些可以通过用一个小的 shell 脚本, 再稍微修改一下OpenBSD的配置文件, 以及logging守护进程 syslogd(8) 来完成。Syslogd以ASCII格式记录并可以发送到一个远程日志服务器上。

创建下列脚本:

/etc/pflogrotate

	#!/bin/sh
	PFLOG=/var/log/pflog
	FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M")
	pkill -ALRM -u root -U root -t - -x pflogd
	if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then
	   mv $PFLOG $FILE
	   pkill -HUP -u root -U root -t - -x pflogd
	   tcpdump -n -e -ttt -r $FILE | logger -t pf -p local0.info
	   rm $FILE
	fi

编辑 root 的定时任务cron job:

# crontab -u root -e

加上下面的两行:

# rotate pf log file every 5 minutes
0-59/5 *       *       *       *       /bin/sh /etc/pflogrotate

将下面这行加到/etc/syslog.conf:

local0.info     /var/log/pflog.txt

如果你还想记录到一个远程日志服务器上, 加上这行:

local0.info     @syslogger

确定主机 syslogger 已经在 hosts(5) 文件中被定义过了。

创建文件 /var/log/pflog.txt 以允许syslogd进程log到那个文件, 并赋予它和pflog文件同样的权限。

# touch /var/log/pflog.txt
# chmod 600 /var/log/pflog.txt

重新启动syslogd以使其应用新配置:

# kill -HUP $(cat /var/run/syslog.pid)

现在所有log的数据包被发送到 /var/log/pflog.txt。如果增加了第二行(译者注:这里应该是指 "local0.info     @syslogger" 这行), log数据也会被发送到远程的日志主机 syslogger 上。

脚本 /etc/pflogrotate 现在开始运行、而后它会删除 /var/log/pflog, 所以通过 newsyslog(8) 对pflog进行归档转储也就没必要了, 应禁用。 然而, 因为 /var/log/pflog.txt 代替/var/log/pflog 存贮log, 所以应该激活对 /var/log/pflog.txt 的日志轮询(归档转储)。像这样更改 /etc/newsyslog.conf:

#/var/log/pflog       600    3    250    *    ZB "pkill -HUP -u root -U root -t - -x pflogd"
/var/log/pflog.txt    600    7    *      24

PF将日志以ASCII格式log到 /var/log/pflog.txt 文件。如果在 /etc/syslog.conf 内也做了这样的配置, 日志也将被log到一台远程的日志服务器上。log不会马上开始, 当开始log后约5-6分钟 (定时任务间隔) 被记录的数据包才会出现在log文件中。

[上一小节: 数据包标记] [总目录] [下一小节: 性能]


[back] www@openbsd.org
$OpenBSD: logging.html, v 1.36 2008/10/31 16:49:34 nick Exp $