[上一小节: 数据包标记] [总目录] [下一小节: 性能]
PF在log一个数据包时, 一份数据包头的拷贝被发送到 pflog(4) 接口, 同时还有一些额外的信息, 比如数据包经过的接口, PF采取的动作(放行或禁止)等。pflog(4) 接口允许用户空间的应用程序从内核接收PF的记录数据。如果系统启动时启用了PF, 守护进程 pflogd(8) 就会启动。默认 pflogd(8) 监听 pflog0 接口并将所有log的数据写到日志文件 /var/log/pflog 中。
为了log通过PF的数据包, 必须使用 log 关键字。 注意PF只能记录那些自己放行或禁止的数据包;你不能指定一条规则仅记录数据包。
log 关键字将使所有匹配此规则的数据包被log。在这种情形下这条规则产生了状态, 只有看见的第一个数据包(导致产生状态的数据包)会被log。
可以提供给 log 关键字的选项是:
选项在 log 关键字的后面的圆括号内给出;多个选项可以用逗号或空格分开。
pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state
查看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等).
# 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
在许多情况下, 我们希望有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文件中。
[上一小节: 数据包标记] [总目录] [下一小节: 性能]