معرفی فایروال های لینوکسی firewalld و iptables
معرفی iptables و firewalld:
سرویس های firewalld و iptables هر دو فایروال های پیش فرض سیستم عامل ها و توزیع های مبتنی بر RedHat میباشند و هر دو از بستر netfilter استفاده میکنند. iptables نسخه ای سنتی و قدیمی تر از firewalld می باشد که در نسخه RHEL7 یا firewalld جایگزین گردید. اما هر دو همچنان گستردگی استفاده خود را در دنیای لینوکس حفظ کرده اند.
هر دو ابزار با پشتیبانی IPv4 و IPv6 و پروتکل های TCP و UDP این امکان را فراهم میکنند تا امنیت سرور ها را در شبکه تا حد ممکن افزایش داده و از دسترسی های ناخواسته به سرور از طریق شبکه جلوگیری نمود.
نکته: در RHEL8 که اخیرا عرضه شده است، firewalld از بستر nftables به جای netfilter استفاده میکند.
در ادامه مستند به نصب هر دو سرویس ، معرفی و پیکربندی هرکدام خواهیم پرداخت.
iptables:
همانطور که پیش تر اشاره شد، iptables بر اساس netfilter پیاده سازی شده است و تا قبل از RHEL7 به عنوان فایروال پیش فرض استفاده می شده است. ساختار iptables بر اساس سه قسمت زیر است:
- Tables
- Chains
- Rules
Tables:
جداول iptables برای برای دسته بندی گروهی از chain ها که هر کدامل شامل یک یا چند rule میباشند مورد استفاده قرار میگیرند.جداول پیش فرض شامل 5 جدول به شرح زیر هستند:
- filter: جدول پیشرفض مورد استفاده iptables است که برای فیلتر کردن پکت های ورودی و خروجی مورد استفاده قرار میگیرد.
- nat: جدولی است که به منظور اعمال تنظیمات NAT مورد استفاده قرار میگیرد.
- raw: در حالت عادی کرنل پکت ها را بر اساس State آنها ( یا جزئی از یک کانشن جدید هستند یا جزئی از یک کانکشن جاری و باز) بررسی میکند. این جدول این امکان را فراهم میکند تا با پکت ها قبل از این که کرنل بر اساس state آنها اقدامی انجام دهد کارکرد.
- mangle: از طریق این جدول میتوان تغییراتی را در header پکت ها ایجاد نمود. به عنوان مثال تغییر مقدار TTL در پکت های دریافتی. این عمل تحت عنوان packet mark نیز شناخته می شود.
- security: برای مدیریت دسترسی از طریق متد MAC یا mandatory access control می باشد.
Chains:
هر جدول شامل تعدادی chain هستند که هر کدام گروهی از rule ها را در خود نگه میدارند. که میتوانند سیستمی باشند یا توسط کاربر ساخته شود.
سه chain اصلی عبارتند از :
- INPUT: برای مدیریت rule های مربوط به پکت های ورودی به سیستم به کار میرود.
- OUTPUT: برای مدیریت rule های مربوط به پکت های خروجی از سیستم به کار میرود.
- FORWARD: برای مدیریت پکت هایی که از طریق route در سیستم forward می شوند به کار میرود.
Rules:
مجموعه ای از قوانین هستند که درون chain ها نگه داری می شوند و شامل matches و targets است. بدین معنی که بخشی از rule ها بیانگر شروطی و بخشی دیگر بیانگر عملی است که در صورت صادق شدن آن شروط باید انجام شود.
هنگامی که پکتی بررسی می شود، از ابتدای این لیست به ترتیب rule ها بررسی می شوند تاmatch اتفاق افتد. در صورتی که پکتی با قوانین موجود در لیست همخوانی داشته باشد، بر اساس قواعد target با آن برخورد می شود.
به عنوان مثال:
اگر پکتی از آدرس 192.168.200.150 و از طریق پورت 5050 پروتکل TCP وارد شد آنگاه آن را drop کن.
در مثال بالا بخش اگر همان match و بخش آنگاه همان target خواهد بود.
Matches:
شرایطی است که برای پکت ها در نظر گرفته می شود. در صورتی که این شرایط برای پکت همخوانی داشته باشد، iptables پکت را بررسی و قواعد target را بر آن اعمال میکند.
برخی از match ها به شرح زیر می باشند.
- Source (-s): بیان گر مبدا پکت است که میتواند IP، رنج IP یا hostname باشد.
- destination (-d): بیانگر مقصد پکت است می تواند ، رنج IP یا hostname باشد.
- protocol (-p): بیانگر پروتکل پکت ورودی می باشد. مانند TCP یا UDP در صورتی که پروتکلی مشخص نشود، به صورت پیش فرض کلیه پروتکل های یا all در نظر گرفته می شود.
- –in-interface (-i): بیانگر اینترفیسی است که پکت از آن دریافت می شود.
- –out-interface (-o): بیانگر اینترفیسی است که پکت از آن خارج می شود.
Targets:
بیانگر اقدامی است که برای پکت در نظر گرفته می شود. target با –j یا –jump در انتهای دستور مشخص می شود. و چهار نوع دارد:
- :Accept اجازه دسترسی یا عبور پکت را میدهد.
- Drop: اجازه دسترسی به پکت یا عبور آن را نمیدهد و جوابی نیز به درخواست کننده نمی دهد.
- Queue: پکت های دریافتی را صف بندی میکند.
- Return: اگر rule دارای target برابر با return باشد، بررسی rule های آن chain برای پکت متوقف می شود و پکت بر اساس رول های chain بالا دستی بررسی می شود ولی در صورتی که این rule در یکی از chain های اصلی وجود داشته باشد، پالیسی پیشرفض برای آن اعمال خواهد شد.
در صورتی که قصد اضافه کردن rule به chain خاصی را داشته باشیم، از option با مقدار A- یا append– و در صورتی که قصد حذف آن را داشته باشیم از option با مقدار D- یا delete– استفاده میکنیم.
دستورات iptables:
حال بعد از آشنایی با iptables، به بررسی چند دستور جهت آشنایی بیشتر با نحوه حذف و اضافه نمودن rule ها می پردازیم.
جهت بررسی و مشاهده لیست rule های موجود از دستور زیر استفاده می کنیم.
iptables -L
در صورتی که صرفا لیست rule های یک chain به خصوص مد نظر باشد نیز در انتهای دستور اسم chain را به صورت زیر وارد میکنیم.
iptables –L INPUT
ایجاد Default policy:
در صورتی که پکتی با rule های هیچ یک از chain ها همخوانی نداشته باشد، نیاز است تا اقدامی به صورت پیش فرض برای آن در نظر گرفته شود. به عنوان نمونه اگر پکتی با هیچ rule خاصی همخوانی نداشت، آن را drop کنیم.دستور زیر سیاست پیش فرض را قبول یا accept قرار خواهد داد.
iptables -t filter -P INPUT ACCEPT
و دستور زیر سیاست پیش فرض را بر رد درخواست با drop قرار خواهد داد.
iptables -t filter -P INPUT DROP
ایجاد و حذف و جایگزین کردن فیلتر:
در مثال های زیر با اضافه نمودن چند فیلتر به ساختار دستوری iptables در حذف و اضافه کردن rule ها خواهیم پرداخت.
- مثال1: تمامی ترافیک های ورودی از یک ادرس را به سرور مسدود نمائیم. از آنجا که پروتکلی در دستور زیر مشخص نشده است، کل ترافیک ورودی از 192.168.200.200 به مقصد 192.168.200.201 مسدود خواهد شد.
iptables -A INPUT -s 192.168.200.200 -d 192.168.200.201 -j DROP
- مثال2: ترافیک SSH با دستور زیر فیلتر خواهد شد
iptables -A INPUT -s 192.168.200.200 -d 192.168.200.201 -p tcp --dport 22 -j DROP
- مثال3: ترافیک ورودی و خروجی TCP بر روی پورت 22 برای اینترفیس en33 مورد قبول واقع می شود
iptables -A INPUT -p tcp -i ens33 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -o ens33 --sport 22 -j ACCEPT
- مثال4: همانند مثال بالا با این تفاوت که چند پورت به صورت رنج معرفی گردیده است.
iptables -A INPUT -p tcp -i ens33 --dport 22:26 -j ACCEPT
در تمامی مثال های بالا rule هایی به chain های جدول filter اضافه گردید. حال اگر قصد حذف rule وارد شده را داشته باشیم از همان دستور اما با option برابر با D- استفاده می نمائیم.
iptables -D INPUT -s 192.168.200.200 -d 192.168.200.201 -j DROP
در صورتی که قصد داشته باشیم تمامی rule های یک chain را حذف نمائیم از دستور زیر استفاه میکنیم. در مثال زیر forward chain ازجدول filter تخلیه خواهد شد.
iptables -F FORWARD
در صورتی که قصد داشته باشیم تمامی rule های یک table را پاک نمائیم از دستور زیر استفاده خواهد شد.
iptables -t filter -F
نکته:
باید توجه داشت که ترتیب rule های هر chain مهم است. به عنوان نمونه در صورتی که خط اول INPUT برای پذیرش تمامی ترافیک ها و خط آخر برای عدم قبول ترافیک ICMP تنظیم شده باشد، ترافیک ورودی فقط با rule اول match خواهد شد. لذا این ترتیب بندی ها میبایست در نظر گرفته شود.
برای مشاهده شماره و ترتیب rule ها میتوان از دستور زیر استفاده کرد.
iptables -L --line-numbers
تا به اینجای کارrule اضافه شده در انتهای chain اضافه یا append می شدند. در صورتی که قصد داشته باشیم rule در جای خاصی از جدول اضافه شود به جای –A از –I یا –insert استفاده مینمائیم. مانند دستور زیر
iptables -I INPUT 2 -s 192.168..199 -d 192.168.200.201 -p tcp --dport 22 -j DROP
تفاوت این دستور با دستورات بالا در این است که علاوه بر استفاده از option -I مبنی بر insert در جدول، بعد از اسم chain نیز با مشخص کردن شماره خط، همانند شکل بالاrule اضافه شده را در خط دوم اضافه نمودیم.
حال که شماره rule ها در chain را در اختیار داریم، میتوانیم همانند دستور زیر، rule های مورد نظر را به id یا شماره آنها حذف نمود.
iptables -D INPUT 2
در نهایت اگر قصد داشته باشیم rule خاصی را replace نماییم میتوانیم از option –R یا –replace استفاده وکنیم.
با دستور زیر rule دوم از تصویر بالا را با rule مورد نظر جایگزین می نمائیم.
iptables -R INPUT 2 -s 192.168.200.199 -d 192.168.200.201 -p tcp --dport 22 -j DROP
firewalld:
سرویس firewalld همانطور که پیشتر اشاره شد از نسخه RHEL7 جایگزین iptables شد اما تا قبل از نسخه 8 از یک بستر استفاده میکردند. در firewalld از ابزاری به نام firewall-cmd برای ایجاد، جایگزینی و حذف rule ها استفاده می شود. قبل از معرفی این ابزار برخی از مفاهیم firewalld را مورد بررسی قرار میدهیم.
Zones:
firewalld rule ها را در مجموعه هایی به نام zone مدیریت میکند. در واقع Zone ها لیستی از rule ها هستند که رفتار firewalld با ترافیک دریافتی اینترفیس ها از طریق آنها مشخص می شود.
Zone های پیش فرض در firewalld به شرح زیر می باشند:
- drop: کمترین میزان اعتماد در این zone وجود دارد. در این zone تمامی ترافیک های دریافتی بدون ارسال هیچ پاسخی drop خواهند شد و فقط ترافیک های خروجی مجاز خواهند بود.
- block: همانند drop می باشد اما با خشونتی کمتر از آن. در این zone نیز تمامی ترافیک های ورودی drop می شوند اما در پاسخ به درخواست های ورودی، پیغامی مانند icmp-host-prohibited و یا icmp6-adm-prohibited نیز ارسال می شود.
- public: به نوعی بیانگر شبکه های عمومی و سطح امنیت و اعتماد کم در آن هاست. ترافیک های ورودی در این zone تماما بسه نمی شوند می میتوان بر اساس نیاز به آنها اجازه دسترسی داد.
- external: در صورتی که قصد NAT کردن Private IP خود را داشته باشیم از این zone استفاده می نمائیم.
- internal: ترافیک های دریافتی در این zone قابل اعتماد تر هستند و برخی سرویس ها در این zone نیز ممکن است در دسترس باشند.
- dmz: برای ایزوله کردن ترافیک از سایر آدرس هاش شبکه مورد استفاده قرار میگیرد و فقط ترافیک های خاصی امکان اتصال خواهند اشت.
- work: بیشتر ترافیک های ورودی در این zone قابل اعتماد هستند و تعدادی کمی از سرویس ها نیز در آن فعال و در دسترس هستند.
- home: برای محیط خانگی کاربرد دارد و تضور بر این است که تمام سیستم های شبکه اعتماد وجود دارد. سطح دسترسی از طریق سرویس های مختلف کمی بیشتر از home می باشد.
- trusted: به تمام ماشین های داخل شبکه اعتماد کامل وجود دارد و کمترین محدودیت در ترافیک ها را اعمال میکند.
دریافت اطلاعات Zone ها:
هر کارت شبکه به یک zone متصل خواهد شد و قوانین آن zone بر ترافیک های ورودی و خروجی آن اینترفیس حاکم خواهد بود. این امکان وجود دارد که در صورت نیاز zone مورد نظر خود را ایجاد و خصوصیات آن را ویرایش کرده و سپس اینترفیسی را به آن متصل نمائیم.
Rule ها در firewalld یا به صورت آنی (immediate) و یا به صورت دائمی (permanent ) خواهند بود. در صورتی که تغییری در rule خاصی ایجاد شود یا rule جدیدی اضافه شود مادامی که به صورت دائمی ثبت نشوند موقت خواهند بود ودر بوت بعدی وجود نخواهند داشت.
اضافه کردن دائمی rule و یا ایجاد تغییرات در آن ها با option –permanent صورت میپذیرد.
برای مشاهده لیست zone ها و zone پیش فرض از دو دستور زیر استفاده مینمائیم.
firewall-cmd get-zones
firewall-cmd --get-default-zone
در صورتی که قصد داشت هباشیم rule های هر zone را مشاهده کنیم، میتوانیم از دستور زیر استفاده کنیم.
firewall-cmd --list-all --zone=block
دستور بالا rule های block zone را به صورت زیر نمایش می دهد. در صورتی که اسم zone مشخص نشود، rule های zone پیشفرض نمایش داده می شود.
در صورتی که قصد داشته باشیم اینترفیسی را به zone خاصی متصل کنیم، از دستور زیر استفاد می نماییم.
firewall-cmd --zone=trusted --change-interface=ens33
همانطور که در تصویر قابل مشاهده است، اینترفیس ens33 به trusted zone متصل گردید.
نکته مهم:
در هنگام انتقال اینترفیس ها باید مد نظر داشت که این تغییرات بر روی سرویس درحال کار تاثیر گزار خواهد بود. بدین صورت که اگر اینترفیسی از zone فعلی که دارای ارتباط ssh فعال است به zone دیگری که در آن ssh مسدود است منتقل شود ممکن است ارتباط قطع گردد. لذا در صورتی این تغییرات انجام شود که یا از عملیات مطمئن بوده یا دسترسی به سرور در صورت بروز مشکل فراهم باشد.
در صورتی که مدیریت تمامی اینترفیس ها از طریق یک zone فراهم باشد، میتوان zone پیش فرض را به zone مورد نظر و با دستور زیر تغییر داد.
firewall-cmd --set-default-zone=home
اضافه کردن rule برای سرویس ها:
در firewalld برخی از سرویس ها مهم و پر کاربرد به همراه اطلاعات آنها مانند پروتکل و پورت مورد استفاده آن ها به صورت از پیش تعریف شده وجود دارند. این امکان برای ما فراهم است تا تنظیمات و اضافه کردن سرویس ها را بر اساس این اطلاعات انجام دهیم.
اطلاعات مرتبط با سرویس ها با نام همان سرویس در مسیر /usr/lib/firewalld/services و در فرمت xml قابل مشاهده هستند. برای دریافت لیستی از سرویس ها میتوان از دستور زیر استفاده کرد.
firewall-cmd --get-services
به عنوان نمونه درصورتی که بخواهیم سرویس ssh را به public zone اضافه نمیایم به صورت زیر عمل خواهیم کرد.
firewall-cmd --zone=public --add-service=ssh
و برای حذف سرویس نیز از remove-service– به صورت زیر استفاده خواهیم کرد.
firewall-cmd --zone=public --remove-service=ssh
در صورتی که بخواهیم تغییرات به صورت دائمی ثبت شوند نیز میتوان مانند دستور زیر از –permanent استفاه نمائیم.
firewall-cmd --zone=work --add-service=ssh --permanent
در صورتی که سرویس مورد نظر در لیست سرویس های firewalld قرار نداشت میتوانیم با استفاده از فرمت xml یکی از سرویس ها سرویس مورد نظر خود را ایجاد نمائیم یا این که پورت مورد استفاده در سرویس مورد نظر را در firewalld و با دستور زیر اضافه نماییم.
با دستور زیر پورت 3550 بر روی پروتکل tcp به public zone اضافه میگردد.
firewall-cmd --zone=public --add-port=3550/tcp
همچنین در صورتی که بخواهیم رنجی از پورت ها را در این zone اضافه کنیم نیز میتوانیم به صورت زیر این کار را انجام دهیم.
firewall-cmd --zone=public --add-port=3720-3725/tcp
در firewalld ویژگی دیگری به نام rich rule وجود دارد که از طریق آن میتوان با جزئیات بیشتر اقدام به محدود کردن ترافیک ها نمود. به عنوان نمونه، هدایت کردن ترافیک یک پورت بر روی پورتی دیگر، ایجاد Whitelist، محدود کردن تعداد درخواست های ورودی و…
نمونه ای از rich rule به صورت زیر می باشد که در آن rule مورد نظر بر روی IPv4 و از مبدا 192.168.200.199 و برای سرویس http فعال خواهد شد و تعداد درخواست ها در ساعت را برابر با 100 درخواست در ساعت قرار داده و در صورتی که شرایط مطرح شده در rule برقرار شود، آن را در فایل messages ثبت می نماید. در آموزشی مجزا به تشریح rich rule ها خواهم پرداخت.
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.200.199/32 service name=http log level=notice prefix="firewalld rich rule INFO: " limit value="100/h" accept'
نتیجه گیری:
در این مستند، به بررسی مفاهیم و ساختار دو فایروال مطرح و محبوب لینوکسی firewalld و iptables پرداخته شد و سعی شد پس ایجاد آشنایی با دستورات هر دو سرویس، نحوه ایجاد، حذف و اضافه کردن rule ها و ایجاد یا رفع محدودیت در ترافیک های ورودی و خروجی را به صورت ابتدایی مورد بررسی قرار دهیم. حفظ امنیت سرور و جلوگیری از دسترسی ها و ایجاد ترافیک های ناخواسته در محیط های عملیاتی بسیار مهم و حیاتی می باشند در نتیجه آشنایی با این سرویس ها برای ایجاد امنیت هر چه بیشتربرای system administrator ها امری ضروری خواهد بود.