در لینوکس، فایروال یک برنامه یا سرویسی است که ترافیک شبکه را فیلتر یا کنترل می کند. یک فایروال معمولا به نحوی پیکربندی می گردد تا به ترافیک های معینی اجازه عبور داده و سایر ترافیک ها را مسدود کند.
Firewalld یک راهکار مدیریت فایروال برای بسیاری از توزیعات لینوکسی از جمله Ubuntu، Debian، CentOS، RHEL و Fedora است. firewalld همانند یک رابط برای سیستم فیلترینگ iptables عمل می کند. از ویژگی های کلیدی آن می توان به عدم وابستگی به پروتکل ارتباطی خاصی اشاره کرد. firewalld از IPv4، IPv6، ethernet bridge و مجموعه های آی پی (IP sets) پشتیبانی می کند.
firewalld از مفهوم نواحی (zones) جهت مدیریت ترافیک شبکه استفاده می کند. zone ها مجموعه ای از قوانین (rules) هستند که به رابط های شبکه (interfaces) اختصاص داده می شوند.
تصویر(1)
در این مقاله، توضیحات در خصوص کانفیگ و راه اندازی Firewalld روی سیستم عامل Red Hat Enterprise 9 یا RHEL 9 ارائه خواهد شد.
نحوه کانفیگ و راه اندازی Firewalld
به صورت پیش فرض، firewalld روی توزیعات مبتنی بر RHEL همچون RHEL، AlmaLinux، CentOS، Rocky Linux و Fedora نصب می باشد. با این حال، چنانچه به هر دلیلی firewalld نصب نبود، شما می توانید با دستور زیر اقدام به نصب آن نمایید.
sudo dnf install firewalld -y
در اوبونتو و توزیعات مبتنی بر Debian، دستورات زیر را اجرا کنید:
sudo apt update
sudo apt install firewalld -y
پس از نصب با دستور زیر آن را فعال نموده تا در هنگام boot اجرا شود:
sudo systemctl enable firewalld
سپس با دستور زیر سرویس firewalld را اجرا نمایید:
sudo systemctl start firewalld
هم اکنون باید فایروال با zone و rule های پیشفرض اجرا شده باشد. جهت بررسی اجرای سرویس می توانید از دستور زیر استفاده نمایید:
sudo systemctl status firewalld
تصویر(2)
همچنین میتوانید از دستور زیر استفاده نمایید:
sudo firewall-cmd --state
تصویر(3)
خروجی های فوق، وضعیت فعال سرویس را تایید می کنند.
Zone های Firewalld
جهت یادگیری نحوه کانفیگ و راه اندازی Firewalld، نیاز است ابتدا با چند مفهوم مربوط به این ابزار آشنا شوید.
سرویس firewalld از zone ها جهت مدیریت ترافیک استفاده می کند. به زبان ساده، zone مجموعه قوانین از پیش تعریف شده است که مشخص میکند چه ترافیکی با توجه به سطح اعتماد در شبکه، اجازه عبور دارد. 9 عدد zone از پیش تعریف شده وجود دارد که در ادامه بر اساس سطح اعتماد به بررسی آنها پرداخته می شود.
Drop: این zone پایین ترین سطح اعتماد را دارد و تمامی ترافیک های ورودی را بدون ارسال هیچگونه تاییدیه به فرستنده، رد می کند.
Block: این zone بسیار شبیه به drop zone می باشد. ترافیک ورودی در این zone رد شده اما پیامی به فرستنده ارسال میشود.
Public: به ترافیک از شبکه عمومی مشخصی اجازه دسترسی می دهد.
External: این zone زمانی استفاده می شود که سیستم شما به عنوان یک gateway یا روتر در حال کار است.
Internal: مجموعه قوانینی که روی کامپیوترهای شبکه داخلی اعمال می شود.
DMZ: این zone برای کامپیوترها یا سرورهای واقع در demilitarized zone (منطقه غیر نظامی) استفاده می شود. منظور از این ناحیه، یک شبکه کوچک و ایزوله است که بین اینترنت و شبکه خصوصی قرار دارد.
Work: این zone برای محل کار که در آن شما به اکثر کامپیوتر ها اعتماد دارید، استفاده می شود. سطح اعتماد در این zone بالا است.
Home: اکثر کامپیوتر ها در این zone به یکدیگر اعتماد دارند. سطح اعتماد در این zone بالاتر از work است.
Trusted: این zone بالاترین سطح اعتماد را دارد. تمامی کامپیوتر ها در این شبکه مورد اعتماد هستند.
شما می توانید از دستور زیر جهت مشاهده لیست تمامی zone ها استفاده نمایید:
sudo firewall-cmd --get-zones
تصویر(4)
همچنین هر zone فایل xml مربوط به خود را دارد که در دایرکتوری زیر ذخیره شده است:
/usr/lib/firewalld/zones/
می توانید لیست فایل های مسیر مربوطه را با دستور زیر مشاهده نمایید:
ls -l /usr/lib/firewalld/zones/
تصویر(5)
برای مشاهده zone پیش فرضی که هم اکنون به رابط شبکه شما اختصاص یافته است از دستور زیر استفاده نمایید:
firewall-cmd --get-default-zone
تصویر(6)
در صورتی که تغییری روی فایروال اعمال نکنید، zone پیش فرض public است و تمامی رابط های شبکه به این zone متصل هستند. جهت روشن شدن موضوع، در مثال زیر دو رابط شبکه فعال به سیستم RHEL متصل است. نام رابط های مربوطه ens160 و ens224 می باشد. شما می توانید نام رابط های شبکه را با یکی از دستورهای زیر مشاهده نمایید:
ip link
یا
ip link show
تصویر(7)
جهت بررسی zone فعال، از دستور زیر استفاده نمایید:
firewall-cmd --get-active-zones
تصویر(8)
همانطور که در تصویر فوق مشاهده می کنید هر دو رابط توسط public zone مدیریت می شوند.
به منظور چاپ پیکربندی zone پیشفرض، از دستور زیر استفاده نمایید:
sudo firewall-cmd --list-all
تصویر(9)
از خروجی دستور فوق نیز می توانید zone مربوط به رابط های شبکه را مشاهده نمایید.
تغییر zone رابط های شبکه
هنگامی که فایروال اجرا گردید، همه رابط های شبکه به zone پیشفرض متصل هستند. در صورت تمایل می توانید در طی سشن خود، یک رابط شبکه را با استفاده از ترکیب فلگ های =zone-- و =change-interface-- به zone دیگری متصل نمایید.
برای مثال، جهت انتقال رابط ens160 به زون internal، دستور زیر را اجرا کنید:
sudo firewall-cmd --change-interface=ens160 --zone=internal
جهت بررسی موفقیت آمیز بودن عملیات فوق، با استفاده از دستور زیر می توانید این مورد را بررسی نمایید:
sudo firewall-cmd --get-active-zones
تصویر(10)
در خروجی فوق، همانطور که مشاهده می کنید دو zone فعال (internal و public) وجود دارد. رابط ens160 هم اکنون به زون internal منتقل شده است.
شما می توانید پیکربندی مربوط به یک zone دیگر را با فلگ های =zone-- و list-all-- به صورت کامل بررسی نمایید. به عنوان مثال جهت بررسی پیکربندی زون internal دستور را به شکل زیر وارد کنید:
sudo firewall-cmd --list-all --zone=internal
تصویر(11)
با استفاده از پارامتر list-all-zones-- می توانید پیکربندی تمام zone ها را چاپ کنید:
sudo firewall-cmd --list-all-zones
خروجی دستور فوق طولانی است. جهت مشاهده بهتر خروجی، می توانید آن را همانند زیر به دستور less پایپ نمایید تا امکان اسکرول کردن وجود داشته باشد.
sudo firewall-cmd --list-all-zones | less
نکته مهم: زمانی که یک رابط یا interface را به zone جدیدی منتقل می کنید، نیاز است احتیاط لازم را به عمل آورید. زیرا برخی سرویس های مربوط به یک zone ممکن است در zone دیگر وجود نداشته باشند. برای مثال انتقال یک interface به زون trusted منجر به از کار افتادن کانکشن SSH می شود. زیرا در zone مذکور، SSH به صورت پیشفرض فعال نمی باشد و در نتیجه ارتباط شما با سرور قطع می گردد.
تنظیم کردن zone پیشفرض
پارامتر =set-default-zone-- به شما اجازه می دهد که zone پیش فرض را تغییر دهید. به عنوان مثال، با دستور زیر zone پیش فرض روی work قرار داده می شود.
sudo firewall-cmd --set-default-zone=work
جهت بررسی zone پیشفرض می توانید از دستور زیر استفاده نمایید:
sudo firewall-cmd --list-all
تصویر(12)
مدیریت سرویس firewalld
هر سرویس به یک پورت مرتبط است. به عنوان مثال سرویس SSH روی پورت 22 و سرویس http روی پورت 80 اجرا می شود. جهت لیست کردن تمامی سرویس های مربوط به zone فعال، از دستور زیر استفاده نمایید:
sudo firewall-cmd --list-all
تصویر(13)
به منظور محدودسازی و لیست کردن سرویس های مربوط به یک zone خاص، می توانید از فلگ =zone-- استفاده نمایید. دستور زیر، سرویس های مربوط به زون home را لیست می کند.
sudo firewall-cmd --list-all --zone=home
تصویر(14)
اگر توجه کرده باشید برخی از سرویس ها به صورت پیشفرض در برخی از zone ها فعال هستند. از جمله این سرویس ها میتوان به cockpit، SSH و dhcpv6-client اشاره کرد.
نحوه لیست کردن سرویس های پشتیبانی شده توسط firewalld
جهت نمایش تمامی سرویس هایی که توسط firewalld پشتیبانی می شوند، دستور زیر را اجرا نمایید.
sudo firewall-cmd --get-services
تصویر(15)
همچنین میتوانید جستجوی خود را به یک سرویس خاص محدود نمایید. دستور زیر سرویس MongoDB را از لیست سرویس ها، مشخص کرده و نمایش می دهد.
sudo firewall-cmd --get-services | grep -i mongodb
نحوه حذف و اضافه سرویس در firewalld
زمانی که سرویس یا پورتی به فایروال اضافه میشود، مستقیما به zone فعال پیشفرض متصل خواهد شد مگر اینکه صریحا روی zone دیگری پیکربندی گردد. برای فعال کردن سرویس برای یک zone، از پارامتر --add-service= استفاده نمایید. zone با استفاده از پارامتر =zone-- مشخص می شود.
فرض کنید وب سروری وجود دارد که در حال اجرای سرویس HTTP است. جهت فعالسازی دسترسی در zone پیشفرض public، از دستور زیر استفاده نمایید:
sudo firewall-cmd --add-service=http --zone=public --permanent
آپشن permanent-- موجب دائمی شدن تغییرات می شود.
برای اینکه تغییرات پس از ریبوت نیز اعمال شوند، با دستور زیر کانفیگ فایروال را مجدد بارگذاری کنید:
sudo firewall-cmd --reload
تصویر(16)
شما باید پیام success را به عنوان خروجی هر دستور دریافت نمایید که به معنی اجرای موفقیت آمیز دستور است. زون public باید هم اکنون به سرویس HTTP در فایروال اجازه دسترسی دهد. شما می توانید این مورد را با دستور زیر بررسی نمایید:
sudo firewall-cmd --list-services --zone=public
تصویر(17)
برای حذف سرویس از zone، از فلگ remove-service-- استفاده نموده و مجددا فایروال را بارگذاری نمایید.
sudo firewall-cmd --remove-service=http --zone=public --permanent
sudo firewall-cmd --reload
تصویر(18)
چنانچه مجددا سرویس های مجاز فایروال را بررسی نمایید، سرویس HTTP از لیست مربوطه حذف شده است.
نحوه باز و بسته کردن پورت در firewalld
firewalld خدماتی برای برنامه های متداول که ممکن است تمایل داشته باشید به آنها اجازه دسترسی داده شود، فراهم می کند. در اکثر موارد، خدمات ارائه شده توسط firewalld، با پورت هایی که برنامه های مختلف استفاده می کنند، یکسان است. برای مثال، پورت سرویس های HTTP و MySQL به ترتیب 80 و 3306 میباشد و این پورتها به صورت پیشفرض در فایروال باز هستند.
اما در برخی موارد ممکن است خدمات مربوطه، پاسخگوی پورتی که اپلیکیشن با آن کار می کند، نباشد. به عنوان مثال، اگر برنامه با پورت 5000 کار می کند، نیاز است شما این پورت را با استفاده از فلگ =add-port-- باز نمایید. پورت ها می توانند TCP یا UDP باشد.
sudo firewall-cmd --add-port=5000/tcp --zone=public --permanent
جهت دائمی کردن تغییرات نیاز است پیکربندی فایروال را مجددا بارگذاری نمایید:
sudo firewall-cmd --reload
تصویر(19)
جهت بررسی باز شدن پورت در zone، از دستور زیر استفاده نمایید:
sudo firewall-cmd --zone=public --list-ports
تصویر(20)
همچنین شما می توانید یک رنج از پورت ها را نیز مشخص نمایید. برای مثال، جهت باز کردن پورت های بین 5000 تا 6000 در زون public از دستورات زیر استفاده می شود:
sudo firewall-cmd --add-port=5000-6000/tcp --zone=public --permanent
sudo firewall-cmd --reload
مجددا می توانید با دستور زیر تغییرات را بررسی نمایید:
sudo firewall-cmd --zone=public --list-ports
تصویر(21)
جهت مسدود سازی یک پورت، می توانید از پارامتر =remove-port-- استفاده نمایید. به عنوان مثال، جهت مسدود کردن پورت 5000 در زون public، باید دستور زیر اجرا شود:
sudo firewall-cmd --remove-port=5000/tcp --zone=public --permanent
سپس با دستور زیر پیکربندی فایروال را مجددا بارگذاری کرده تا تغییرات دائمی گردد:
sudo firewall-cmd --reload
نتیجه گیری
چنانچه توضیحات را به صورت کامل مطالعه کرده باشید، هم اکنون درک درستی از نحوه کانفیگ و راه اندازی Firewalld روی سرورهای لینوکسی به منظور مدیریت ترافیک کسب کردهاید. سرویس فایروال میتواند مجموعهای از قوانین روی interface ها و zone ها اعمال نماید که به مدیران انعطافپذیری و استقلال در مدیریت ترافیک شبکه را ارائه میدهد.