همواره میتوانید به آخرین نسخه این مقاله در دانشنامه بیاسدی دسترسی داشته باشید.
پیکربندی در هسته
البته نیازی به پیکربندی هسته نیست. چون IPFW در هسته پیشفرض به صورت ماژول در دسترس است. اگر میخواهید IPFW را به صورت ثابت در هسته قرار دهید، خط زیر را به فایل پیکربندی هسته اضافه کنید و سپس آن را کامپایل نمایید:
options IPFIREWALL
این خط پشتیبانی از IPFW را در هسته فعال میکند.
IPFW میتواند از عبور و مرور بستهها گزارش تهیه کند. این گزارشها در فایل /var/log/security ذخیره میشوند. البته برای فعال کردن این قابلیت باید خطوط زیر در فایل پیکربندی هسته وجود داشته باشد:
options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT
بصورت پیشفرض IPFW مانع عبور تمامی بستهها میشود. اگر میخواهید این رفتار را تغییر دهید، خط زیر را به فایل پیکربندی هسته اضافه کنید:
options IPFIREWALL_DEFAULT_TO_ACCEPT
افزودن خط زیربه فایل پیکربندی هسته، قابلیت NAT را فعال میکند.
options IPDIVERT
فایل /etc/rc.conf
IPFW بصورت پیشفرض غیرفعال است. برای فعال کردن فایروال خط زیر را فایل /etc/rc.conf اضافه کنید:
firewall_enable=\"YES\"
بعد از اینکه سیستم خود را راه اندازی کردید، خط زیر را خواهید دید:
ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled
خب تبریک میگوییم! IPFW فعال شده است! حالا باید قوانین مورد نظر خود را برای عبور و مرور بستهها وضع کرده و تعیین کنید که چه بستههایی اجازه عبور دارند و یا از عبور چه بستههایی باید جلوگیری شود. در نصب پیشفرض، تعدادی ruleset در FreeBSD تعبیه شده که میتوانید یکی از آنها را بعد از خواندن فایل /etc/rc.firewall انتخاب کنید. بعد از انتخاب ruleset دلخواه خود، آن را بصورت زیر فعال کنید:
firewall_type=\"open\"
مقادیر قابل قبول برای این گزینه عبارتند از:
open به تمام بستهها اجازه عبور داده میشود.
client تنها از این ماشین محافظت خواهد کرد.
simple از کل شبکه محافظت خواهد کرد.
closed مانع از عبور تمام ترافیک خواهد شد (بجز کارت شبکه loopback)
UNKNOWN این گزینه هیچ rule ای را بارگزاری نخواهد کرد.
filename اگر خودتان یک مجموعه rule نوشتهاید، میتوانید آنها را در فایلی ذخیره کرده و آدرس کامل این فایل را وارد کنید تا rule ها از آن فایل بارگزاری شوند.
شما مجبور نیستید از ruleset های پیشفرض استفاده کنید. خودتان هم میتوانید یکی بنویسید. برای بارگزاری کردن rule هایی که نوشتهاید، دو راه پیش رو دارید. یکی اینکه rule های مورد نظر خود را بدون دستور ipfw در فایلی نوشته و سپس آن فایل را با گزینه firewall_type معرفی کنید. یک نمونه از این فایل را در زیر میبینید:
add deny in add deny out
روش دوم هم تقریبا مشابه روش اول است. ابتدا rule های خود را در داخل یک شلاسکریپت نوشته و سپس آدرس کامل این شلاسکریپت را با گزینه firewall_script معرفی کنید. یک نمونه از این شل اسکریپت را در زیر میبینید:
#!/bin/sh ipfw -q flush ipfw add deny in ipfw add deny out
برای فعال کردن logging هم خط زیر را اضافه کنید:
firewall_logging=\"YES\"
دستور ipfw
به کمک دستور ipfw میتوانید rule های مورد نظر خود را اضافه یا حذف کنید. مشکلی که این روش دارد این است که با راهاندازی مجدد رایانه، تمام rule ها از بین خواهند رفت. برای رفع این مشکل میتوانید rule ها مورد نظر خود را در فایلی نوشته و آن فایل را به فایروال معرفی کرده تا در هنگام بوت سیستم خوانده شود. روشهای انجام این کار توضیح داده شد. به تمام ruleها یک شماره از ۱ تا ۶۵۵۳۴ اختصاص مییابد. شماره ۶۵۵۳۵ یک rule ویژه است که تمام بستهها را مسدود میکند.
ipfw برای هر rule یک شمارنده یا کنتور در نظر میگیرد. هر بار که بستهای با یک rule تطابق (match) پیدا کرد، این شمارنده یک واحد افزایش مییابد. وقتی که در حال آزمودن rule های خود هستید، میتوانید با نگاه کردن به این شمارنده متوجه شوید که آیا تطابق رخ داده یا نه.
برای دیدن لیستی از rule های در حال استفاده دستور زیر را اجرا کنید:
# ipfw list
برای اینکه بدانید یک rule آخرین بار کی تطبیق پیدا کرده، دستور زیر را اجرا کنید.
# ipfw -t list
دستور زیر rule ها پویا را هم بهمراه rule های ایستا نمایش میدهد:
# ipfw -d list
دستور زیر شمارندهها را صفر میکند:
# ipfw zero
دستور زیر شمارنده یک rule خاص را صفر میکند. NUM همان شماره rule مورد نظر است:
# ipfw zero NUM
یک ruleset به مجموعه چند rule گفته میشود. این rule ها با توجه به مشخصاتی یک بسته دارد در مورد عبور آن تصمیم گیری میکنند.
وقتی که یک بسته وارد فایروال میشود، با اولین rule موجود در ruleset مقایسه میشود. اگر تطبیقی رخ نداد، rule بعدی بر روی بسته آزمایش میشود و به همین ترتیب. بمحض اینکه بستهای با یکی از rule ها تطبیق پیدا کرد، پردازش بسته متوقف شده و با توجه به عملیات تعریف شده برای آن rule، درباره سرنوشت آن بسته تصمیم گیری میشود. این روش به «اولین تطبیق برنده است» معرف است. اگر بسته مورد نظر با هیچ rule ای منطبق نشد، بالاجبار گرفتار آخرین rule میشود. آخرین rule بصورت پیشفرض، بسته مورد نظر را بدون هیچ قید و شرطی نابود خواهد کرد و به آن اجازه عبور نخواهد داد. البته این رفتار قابل تغییر است.
هنگامی که این متن را میخوانید، به این نکته توجه داشته باشید که در شبکه ارتباطات دوطرفه هستند. وقتی که شما درخواستی را برای کسی ارسال میکنید، او هم یک پاسخ برایتان ارسال خواهد کرد. در هنگام نوشتن rule ها توجه داشته باشید که ruleها ی خود را هم برای درخواستها و هم برای پاسخها بنویسید. اگر به درخواستی اجازه عبور دهید اما به پاسخ آن اجازه عبور ندهید، نتیجهای دریافت نخواهید کرد. برای رفع این مشکل کافیست در آخر rule خود از کلیدواژه keep-state استفاده کنید تا اجازه ارتباط دو طرفه بین مبدا و مقصد صادر شود.
نحوه نوشته ruleها
Rule ها از یکسری کلیدواژه تشکیل میشوند. این کلید واژه ها را باید با یک ترتیب خاصی از چپ به راست بنویسید. شکل کلی هر rule بصورت زیر است:
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL
فیلد CMD
در ابتدای تمام ruleها کلیدواژه add قرار میگیرد که برای اضافه کردن یک rule بکار میرود. از کلیدواژه delete هم برای پاک کردن یک rule استفاده میشود.
فیلد RULE_NUMBER
هر rule یک شماره منحصر به فرد دارد. این شماره باید بین ۱ تا ۶۵۵۳۵ باشد. میتوانید این شماره را در هنگام نوشتن rule مشخص کنید. البته انجام این کار اختیاری است. اگر این کار را انجام ندهید، ipfw اولین شماره قابل استفاده را انتخاب کرده و آن را هر ۱۰۰ تا ۱۰۰ تا افزایش میدهد.
فیلد ACTION
این فیلد سرنوشت بسته را تعیین میکند. میتوانید بر اساس مشخصاتی که یک بسته دارد به آن اجازه عبور دهید یا این اجازه را از او بگیرید. برای اینکه به یک بسته اجازه عبور دهید، از کلیدواژه های زیر استفاده کنید:
allow | accept | pass | permit
تمام کلیدواژه های بالا معادل یکدیگر بوده و با هم هیچ فرقی ندارند. از هر کدام که دوست داشتید استفاده کنید. تمام این کلیدواژهها به بسته مورد نظر اجازه عبور را میدهند.
deny | drop
این کلیدواژه ها هم مانع از عبور یک بسته میشوند و عملکردی یکسان دارند.
reset
این کلید واژه، ابتدا بسته مورد نظر را از بین برده و سپس یک پیغام TCP reset برای مبدا ارسال میکند.
count
این کلیدواژه باعث میشود تا شمارنده rule یک واحد افزایش یابد. بقیه rule ها بر روی بسته آزمایش میشوند و پردازش بسته متوقف نخواهد شد.
فیلد LOGGING
این گزینه به فایروال میگوید که از مشخصات این بسته گزارش تهیه کن. این گزارش برای ثبت به syslog ارسال میشود. انجام این کار میتواند شما را در خطایابی یاری دهد. اگر ruleها مطابق میل شما رفتار نمیکنند، میتوانید با ثبت گزارش از بستهها اقدام به خطایابی کنید.
فیلد SELECTION
کلید واژه هایی که در این قسمت تشریح میشوند، برای مشخص کردن ویژگیهای بسته مورد نظر بکار میروند. این کلیدواژهها را باید با ترتیب خاصی وارد کنید.
udp | tcp | icmp | ip
پروتکل مربوط به بسته مورد نظر را مشخص میکنند. میتوانید از هر پروتکل دیگری که خواستید استفاده کنید؛ به شرطی که در فایل /etc/protocols تعریف شده باشد. مشخص کردن این فیلد اجباری است.
from src to dst
کلیدواژههای from و to برای مشخص کردن فرستنده و گیرنده استفاده میشوند. میتوانید از آدرس IP یا نام دامنه استفاده کنید. from مشخص میکند که بسته توسط چه کسی ارسال شده و to هم مشخص میکند که بسته توسط چه کسی دریافت خواهد شد. باید هم مبدا و هم مقصد را مشخص کنید. کلیدواژهای به نام any وجود دارد که ‘’همهجا’’ معنی میدهد و با تمام آدرسهای IP تطابق دارد. Any همان آدرس ۰٫۰٫۰٫۰/۰ را مشخص میکند. me هم کلیدواژه دیگریست که مشخص کننده تمام آدرسهای IP متعلق به فایروال است. (یعنی همین ماشینی که قرار است ipfw بر روی آن پیکربندی شود)
برای مثال:
from me to any بستههایی را مشخص میکند که مبدا آنها فایروال است.
from any to me بستههایی را مشخص میکند که مقصد آنها فایروال است.
from any to any مبدا و مقصد اهمیتی ندارد. تمام بستها از هر مبدائی به هر مقصدی را شامل میشود.
آدرسهای IP را باید به روش CIDR بنویسید.
port number
بعضی از پروتکلها با پورتها سروکار دارند (مثل TCP و UDP) برای این پروتکلها باید بالاجبار شماره پورت را هم مشخص کنید. هم میتوانیم شماره پورت را بنویسید و هم میتوانید از نامی که در فایل /etc/protocols به پورت مورد نظر اختصاص داده شده استفاده کنید.
in | out
مشخص میکند که بسته مورد نظر قرار است به فایروال وارد شده یا اینکه از آن خارج شود.
keep-state
وقتی که تطبیق رخ داد، یک rule پویا ایجاد شده و اجازه ارتباط دو طرفه بین مبدا و مقصد صادر میشود. همینجا متذکر میشوم که rule های پویا عمر محدودی دارندو بعد از مدت مشخصی از بین خواهند رفت. این مدت زمان را میتوانید با تغییر گزینه net.inet.ip.fw توسط sysctl تنظیم کنید.
مثال:
فرض کنید که قوانین زیر را برای عبور و مرور بستهها وضع کردهایم:
# ipfw l 00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
فرض کنید که فایروال ما یک IP با آدرس ۲۰۵٫۲۳۸٫۱۲۹٫۲۲۱ دارد و یک بسته telnet از اینترنت دریافت میکند. یعنی شخصی (مثلا با آدرس ۱٫۲٫۳٫۴) سعی میکند از طریق telnet به فایروال ما دسترسی پیدا کند. بنابراین بسته ارسالی توسط او مشخصات زیر را دارد:
Source_IP Source_PORT Destination_IP Destination_PORT Protocol 1.2.3.4 3333 205.238.129.221 23 TCP
مراحل زیر برای پردازش این بسته در فایروال انجام میشود:
۱)کرنل بسته را از کارت شبکه xl0 دریافت میکند.
۲)کرنل بسته را با rule شماره ۱۰۰ آزمایش میکند.
=====> 00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
3)بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 ======> 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
4)بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 ======> 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
5)بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any ======> 65000 allow ip from any to any 65535 deny ip from any to any
6)بسته تطبیق داده شد! سرنوشت بسته بر اساس rule تعیین خواهد شد که در اینجا بسته اجازه عبور دارد.
۷)بسته به دایمن telnet بر روی پورت ۲۳ تحویل داده میشود تا مورد پردازش قرار گیرد.
۸)دایمن telnet بسته مورد نظر را پردازش کرده و پاسخ آن را ارسال میکند.
همانطور که قبلا گفتم، در شبکه ارتباطات دو طرفه است و هر درخواستی یک پاسخ بهمراه دارد. بیشتر افراد این موضوع را فراموش میکنند و بهمین دلیل از ruleهای خود نتیجه دلخواه را نمیگیرند. مشخصات پاسخی که دایمن telnet ارسال کرده به شرح زیر است:
Source_IP Source_PORT Destination_IP Destination_PORT Protocol 205.238.129.221 23 1.2.3.4 3333 TCP
بنابراین، ما مراحل بالا را برای این بسته هم تکرار میکنیم:
۱) کرنل بسته را با rule شماره ۱۰۰ آزمایش میکند.
=====> 00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
2) بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 ======> 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
3) بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 ======> 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
4)بسته تطبیق داده نشد. بنابراین بسته با rule بعدی آزمایش میشود:
۰۰۱۰۰ allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any ======> 65000 allow ip from any to any 65535 deny ip from any to any
5)مشخصات بسته همخوانی دارد! بنابراین اجازه خروج برای او صادر خواهد شد.
در مثال بالا، اگر ما rule شماره ۶۵۰۰۰ را نداشتیم، بسته توسط rule شماره ۶۵۵۳۵ نابود میشد!