گزارش گیری از pf با pflog:
شما می توانید با استفاده از برنامه PF به گزارش گیری از بسته های ارسالی بپردازید زمانی این اتفاق می افتد که بسته به رابط pflog ارسال شود. برنامه pflogd به صورت اتومانیک زمانی که برنامه pf راه اندازی می شود راه اندازی شده و ارایه سرویس می کند. به صورت پیش فرض pflogd برروی کارت شبکه مجازی pflog0 به گوش کردن می پردازد و همه گزارشها را در فایل /var/log/pflog ذخیره می کند. برای این کار باید شما از کلمه log در رول ها استفاده کنید. هر رولی که در آن از کلمه log استفاده شده باشد و هر بسته ای که با این رول مچ می شود ذخیره می شود. این فایل در قالب باینری ذخیره می شود و برای مشاهده نیاز به ابزار خاصی است که در ادامه با آن بیشتر آشنا می شوید.

در ادامه با بخش های متفاوتی که می توانید با کلمه log استفاده کنید آشنا می شوید:

all: اگر از این کلمه بعد از log استفاده کنید همه بسته ها را log می گیرد.

to pflogN: به گزارشگیری از بسته هایی می پردازد که به یک رابط خاص ارسال می شود. پیش فرض این رابط pflog0 است.

User: در یک سری از موارد یک user-id یا group-id مالک یک سوکت خاص است شما با استفاده از pf می توانید از این سطح ها گزارشگیری کنید.

در زیر یک مثال از این بخش را مشاهده می کنید، فقط یک نکته وجود دارد که optionsهای مختلف با استفاده از فاصله و ویرگول از هم جدا می شوند.

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

خواندن فایل log:
به دلیل اینکه فایل log در قالب باینری نوشته می شود به همین دلیل با ویرایشگرهای متنی قابل باز کردن و خواندن نیست. برای این منظور به برنامه خاصی نیاز دارید که در این مورد برنامه tcpdump این کار را برای شما انجام می دهد. برای مشاهده این فایل باید از فرمان tcpdump به صورت زیر استفاده کنید:

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

اگر قصد دارید این فایل را در حالت real-time مشاهده کنید باید از فرمان tcpdump به صورت زیر استفاده کنید تا در این وضعیت آخرین تغییرات را در صفحه نمایش خود مشاهده کنید:

# tcpdump -n -e -ttt -i pflog0

فیلتر کردن خروجی فایل log:
چون برنامه log در pf فایل خود را در قالب باینری ذخیره می کند برای فیلتر کردن بخش های مختلف این فایل باید از خود برنامه 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

همچنین شما می توانید یک رابط خاص را هم فیلتر کنید، این عمل در فرمان زیر قرار گرفته است:

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

شما برای فیلتر کردن خروجی هم می توانید از زبان فرمان tcpdump که مخصوص pflogd توسعه داده شده استفاده کنید این بخش ها در زیر توضیح داده شده:

  • ip: این بخش برای ورژن ۴ آدرس ip استفاده می شود.
  • ip6: این بخش برای ورژن ۶ آدرس ip استفاده می شود.
  • on int: برای بسته هایی که از طریق کارت شبکه int.
  • ifname int: دقیقا مثل بخش بالا عمل می کند.
  • rulenum num: شماره رول فیلتری که بسته با آن مچ می شود. ، در قسمت num عدد رول را باید بنویسید.
  • action act: حالتی که برای بسته در نظر گرفته شده است، دو حالت در این بخش وجود دارد pass و block.
  • inbound: بسته هایی که وارد می شوند.
  • outbound: بسته هایی که خارج می شوند.

در زیر یک مثال در این زمینه مشاهده می کنید:

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

این بخش به صورت real-time بخش log را به صورت بسته های ورودی که مسدود شده اند و از کارت شبکه wi0 عبور می کنند نمایش می دهد.

 گزارش گیری بسته ها با استفاده از Syslog:
در بسیاری از وضعیت ها مدیران سرورها دوست دارند که فایل log از firewall به صورت باینری نباشد و بتوانید فایل مربوطه به یک سرور دیگر برای ذخیره سازی ارسال شود، برای این کار شما نیاز به یک اسکریپ کوچک و مقداری تغییرات کوچک در فایل پیکربندی syslogd دارید که در ادامه با این بخش ها آشنا می شوید.

برای شروع اسکریپ زیر را در یک ویرایشگر ایجاد کنید:

#!/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 -s 160 -ttt -r $FILE | logger -t pf -p local0.info
rm $FILE
fi

این فایل را به نام pflogrotate در شاخه /etc قرار دهید. حال باید crontab مربوط به کاربر root را تغییر دهید این امر با استفاده از فرمان زیر انجام می شود:

# crontab -u root –e

حال خط زیر را در این بخش ایجاد کنید:

# rotate pf log file every 5 minutes
۰-۵۹/۵ * * * * /bin/sh /etc/pflogrotate

حال باید فایل syslog.conf را که در مسیر  /etc/ وجود دارد ویرایش کنید و خط زیر را اضافه کنید:

local0.info /var/log/pflog.txt

اگر شما قصد دارید که این فایل در یک سرور دیگر ذخیره شود باید خط زیر را در این فایل اضافه کنید:

local0.info @syslogger

syslogger نام سرور شماست که البته می تواند آدرس ip هم باشد و حتی شما می توانید این بخش را در فایل host قرار دهید.در مرحله بعدی شما باید فایل  /var/log/pflog.txt را با دسترسی های لازم برای برنامه syslog ایجاد کنید، این امر در بخش زیر نمایش داده شده است:

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

حال باید به برنامه syslog این تغییرات را اعلام کنید و برای این منظور باید از فرمان زیر استفاده کنید:

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