فایل پیکربندی برنامه pf:

یکی از بخش های مهم همه سرویس های موجود، فایل پیکربندی است که سرویس ها رفتارها، متغیرها و سایر تنظیمات خود را از آن فایل می خوانند و رفتار مورد نظر شما را اعمال می کنند در سیستم عامل های مبتنی بر BSD فایل های پیکربندی سرویس هایی که به صورت پیش فرض در خود سیستم عامل نصب شده اند در زیرشاخه etc قرار دارند و شما هر برنامه جدید که نصب می کنید و نیاز به فایل پیکربندی دارد در زیر شاخه usr/local/etc قرار می گیرد، برنامه pf به دلیل اینکه در پایه سیستم عامل OpenBSD به صورت پیش فرض راه اندازی و نصب شده است فایل پیکربندی آن در مسیر etc قرار می گیرد.

یک قاعده کلی برای همه فایل های پیکربندی وجود دارد و آن این است که خطوطی که با علامت # شروع می شود در اصطلاح توضیحات بوده و هیچ تاثیری ندارد و در بسیاری از موارد برای راحتی کار کاربران مثال ها و پیش فرض هایی وجود دارد که شما به راحتی با پاک کردن علامت #  از ابتدای خط می توانید رفتار مورد نظر را اعمال کنید.

نکته: برری اعمال شدن تغییرات حتما یا باید سرویس مورد نظر را Restart کنید یا با استفاده از فرمان های موجود مدیریتی فایل را دوباره بارگذاری کنید.

نکته: برای ویرایش کردن این نوع از فایل ها نیاز به ویرایشگر متن دارید که در بخش قبل در مورد آنها به صورت مختصر توضیح داده شد.

هر فایل پیکربندی برای خود دارای اصول و قواعد نوشتاری خاص برنامه خود است که در صفحه ۸ man آن برنامه توضیحات کاملی در مورد آن داده شده است. در برنامه pf قواعد کلی به نام های list macro tables وجود دارد که در همین مقاله در مورد آنها توضیح داده می شود.

نکنه: در این بخش شما فقط با اصطلاحات و کاربردهای آنها آشنا می شوید و هدف آموزش نحوه نوشتن رول های فایروال نیست، مثال ها را فارغ از خطوط رول ها مطالعه کنید.

لیست در فایل pf.conf چیست؟

در بسیاری از موارد شما در نوشتن رول ها مجبور هستید برای یک نوع آیتم مورد نظر خود چند خط بنویسید این خطوط در اصل فقط در یک آیتم خاص مشترک هستند مثل شماره پورت های مورد نظر شما برای باز یا بسته بودن از طریق فایروال شما، یا پروتکل ها و آدرس های ip، در این گونه از موارد شما می توانید با استفاده از قابلیت list چند خط را به یک خط با استفاده از list کاهش دهید. برای این کار کافی است که موارد تکرار را در بین  دو علامت {} قرار دهید.  در مثال زیر مشاهده می کنید که شما قصد دارید به صورت آدرس ip متفاوت یک دسترسی یکسان ارایه دهید اگر از لیست استفاده کنید باید دو خط به صورت زیر در فایل برنامه pf  به صورت زیر اضافه کنید:

block out on fxp0 from 192.168.0.1 to any

block out on fxp0 from 10.5.32.6 to any

حال اگر شما از قابلیت list استفاده کنید می توانید دو آدرس ip را در یک لیست در داخل براکت قرار دهید و خطی به صورت زیر ایجاد کنید:

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

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

match in on fxp0 proto tcp to port { 22 80 } rdr-to 192.168.0.6 block out on fxp0 proto { tcp udp } from { 192.168.0.1, 10.5.32.6 } to any port { ssh telnet }

شما می توانید از لیست ها به صورت متغیر هم استفاده کنید و در هر بخشی که به آن نیاز دارید از علامت $ و نام آن لیست استفاده کنید این امر باعث می شود که شما راحت تر بتوانید تنظیمات خود را تغیر دهید و فقط یک لیست را ویرایش کنید و نه هر خط از فایل پیکربندی  را، این بخش را در زیر با یک مثال مشاهده کنید:

trusted = "{ 192.168.1.2 192.168.5.36 }"

pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22

در خط اول یک متغیر به نام trusted ایجاد شده و در رول بعدی از آن در قابل یک لیست دیگر با استفاده از علامت $ فراخوانی شده است.

 

 

در بعضی از موارد شاید نیاز بر این موضوع باشد که از داخل یک رنج آدرس ip یک آدرس خاص جدا شود. برای این منظور شما از علامت !  در ابتدای آن آدرس یا حتی پورت مورد نظر استفاده می کنید، در list هم می توانید از علامت ! به صورت زیر استفاده کنید:

pass in on fxp0 from 10.0.0.0/8

pass in on fxp0 from !10.1.2.3

با استفاده از قابلیت list:

 

pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }

بخش macro در فایل پیکربندی چیست؟

این بخش در حقیقت مثل یک متغیر در سیستم عامل های BSD عمل می کند و وظیفه آن نگه داشتن از مقادیر مورد نظر شما مثل آدرس ip، شماره پورت، نام یک کارت شبکه خاص  و سایر موارد مورد نیاز شما است. این امر هم نوشتن رول ها را برای شما ساده تر می کند و هم اعمال تغییرات برای شما راحت تر است.

قواعد نوشتاری ماکرو به این صورت است که باید با حروف شروع شود و می تواند هم شامل حروف عدد و خط _ باشد و در ماکرو شما نمی توانید از نام های رزور شده مثل pass out و .. استفاده کنید. در زیر یک مثال از ماکرو را مشاهده می کنید:

ext_if = "fxp0"

block in on $ext_if from any to any