نگارش رول(Rule) در برنامه pf:

یکی از بخش های مهم در برنامه pf ایجاد کردن رول ها در فایل اصلی این برنامه به نام pf.conf است. این کار دارای قواعد و اصول خاصی است و از زبان این برنامه استفاده می کند. قواعد کلی برای فایروال های که قابلیت مدیریت بسته را دارد یا عبور دادن است و یا بلاک کردن ترافیکی که از طریق سیستم فایروال در رفت و آمد است. برنامه pf برای مدیریت کردن بسته های خود از اطلاعات لایه ۳ که همان آدرس ip است و لایه چهارم شبکه  که پروتکل های tcp  udp  icmp است استفاده می کند.

هر خطی که شما در قبال رول می نویسید هر بسته که با مشخصات آن رول سازگار باشد در دو حالت عبور را عدم عبور قرار می گیرد. بسته از بالا به سمت پایین حرکت می کنند و با رولی که سازگار باشند منطبق می شوند مگر اینکه از گزینه quick استفاده کرده باشید. همیشه آخرین رول را رولی قرار دهید که به همه بسته هایی که در رول های بالا منطبق نبوده است را شامل شود. در این زمینه دو دیدگاه مختلف وجود دارد، در دیدگاه اول رول آخر به همه ترافیک هایی که از فیلتر های بالا رد شده و مچ نشده باشند اجاره عبور می دهدpass all این حالت یک سیستم بازی است که شما قصد دارید فقط تعداد محدودی  از سرویس ها و ترافیک ها را محدود کنید این روش خوب است ولی در همه جا این روش مناسب نیست و رول آخر باید ترافیک هایی را که شما تسلطی روی آن ندارید را مسدود کرده و از رول block all  استفاده کنید. این روش دارای یک عیب بزرگی است که برای کاربران محدودیت ایجاد می کند و شما باید به دقت مسدود کردن ترافیک را در نظر بگیرد.

نحوه نوشتن رول(rule):

یک خط کامل از همه بخش های رول به صورت زیر است:

action [direction] [log] [quick] [on interface] [af] [proto protocol]  [from src_addr [port src_port]] [to dst_addr [port dst_port]]

در ادامه تمام بخش های رول را با هم مورد بررسی قرار می دهیم.

بخش action:

این بخش شامل دو حالت است pass و block، وقتی شما از عبارت pass استفاده می کنید به ترافیک اجازه تردد می دهید ولی زمانی که شما از قابلیت block استفاده می کنید به تناسب قواعدی که بخش تنظیمات block-policy تنظیم کرده اید اعمال می شود این بخش دو حالت دارد یا drop می کند و به صورت بی صدا بسته را حذف می کند یا بسته TCP RST بر می گرداند و پیغام بلاک شدن در tcp را تولید می کند و در حالت icmp  بسته ICMP Unreachable را تولید می کند و ارسال می کند.

بخش directions:

این بخش باید مسیر حرکت بسته ها را مشخص کند. دو حالت در این بخش وجود دارد in  و out. وارد شدن و خارج شدن بسته ها بستگی به مسیر و دیدگاه شما دارد. اگر شما در شبکه خود سرویسی دارید که می خواهید از دیده شبکه ورودی مسدود شود این حالت برروی کارت شبکه ای که شما به شبکه دوم متصل است in  می شود. برای تعیین کردن این دو حالت باید مسیر بسته را از فایروال خود مشخص کنید.

بخش log:

اگر این بخش به رول شما اضافه شود رفتار آن رول از طریق pflog گزارش گرفته می شود. در بخش گزارش گیری در این مورد مفصل بحث خواهد شد.

بخش quick:

اگر این بخش در رولی تنظیم شود و بسته ای با آن رول مطابقت کند به سرعت وارد بخش عمل یا action اعمال شود و بسته وارد سیکل چک شدن سایر رول ها نمی شود.

بخش interface:

در این بخش شما می توانید نام کارت های شبکه موجود را که قصد دارید رول ها برروی آن اعمال شود را مشخص می کنید.

بخش af:

شما در این بخش خانواده آدرس ip که دارید استفاده می کنید را مشخص می کنید تا زمان نوشتن این مقاله دو خانواد آدرس ip وجود دارد ipv4 و ipv6. برای تعیین کردن اینکه این رول در خانواده ورژن ۴ ادرس ip است از گزینه کلیدی inet استفاده و برای آدرس ورژن ۶ از عبارت inet6 استفاده کنید.

بخش protocol:

در این بخش نوع پروتکل هایی که در لایه ۴ قرار دارند و شما قصد کار کردن با آن را دارید را مشخص می کنید مثل tcp udp icmo icmp6 برای مشاهده لیست کامل همه آنها به فایل /etc/protocols شما می توانید از اعداد این بخش هم استفاده کنید که بین ۰ تا ۲۵۵  است.

بخش های src_addr و dst_addr:

در بخش src_addr شما مبدا آدرس ip مورد نظر و در بخش dst_addr مقصد آدرس ip مورد نظر را مشخص کنید.

 

بخش های src_port و dst_port:

در بخش مبدا و مقصد پورت مورد نظر که سرویس خاصی را ارایه می دهد را می توانید مشخص کنید. این بخش را می توانید از عدد پورت و یا نام سرویس مورد نظر استفاده کنید. برنامه pf نام ها را به اعداد از طریق فایل /etc/services تبدیل می کند.

در این بخش شما می توانید با استفاده از قابلیت لیست در فایل pf.conf و قواعد زیر شماره پورت های مورد نظر خود را به صورت گروهی مشخص کنید.

علامت ! یعنی به غیر از

علامت > یعنی بزرگتر از عدد شما

علامت > یعنی کوچکتر از

علامت <> یک دامنه معکوس

علامت >< یک رنج از پورت ها

دو نمونه از رول های ساده

همان طوری که در بخش های بالا گفته شد رول های پیش فرض همه ترافیک محدود از نظر امنیتی رول های خوبی هستند. شما برای ایجاد این نوع رول در خط پایانی از رول های فایروال خود دو خط زیر را اضافه کنید:

block in  all

block out all

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

# Pass traffic in on dc0 from the local network, 192.168.0.0/24,

# to the OpenBSD machine’s IP address 192.168.0.1. Also, pass the

# return traffic out on dc0.

pass in  on dc0 from 192.168.0.0/24 to 192.168.0.1

pass out on dc0 from 192.168.0.1 to 192.168.0.0/24

# Pass TCP traffic in on fxp0 to the web server running on the

# OpenBSD machine. The interface name, fxp0, is used as the

# destination address so that packets will only match this rule if

# they’re destined for the OpenBSD machine.

pass in on fxp0 proto tcp from any to fxp0 port www