firewalld یک نرم افزار مدیریت فایروال است که در دسترس بسیاری از توزیع های لینوکس قرار دارد و به عنوان frontend برای nftable های درون هسته لینوکس یا سیستم های فیلترینگ بسته iptables عمل می کند. در این مقاله، ما به بررسی نحوه راه اندازی فایروال با استفاده از firewalld در راکی لینوکس 8 خواهیم پرداخت و اصول مدیریت فایروال را با ابزار مدیریتی firewall-cmd توضیح خواهیم داد.
فهرست مطالب
نحوه راه اندازی فایروال با استفاده از firewalld
پیش نیازهای قبل راه اندازی فایروال
1- نیاز به سرور راکی لینوکس
2- کاربر non-root
3- کاربر با امتیازات sudo
مرحله اول: مرور مفاهیم اصلی در firewalld
پیش از بررسی نحوه استفاده دقیق از ابزار firewall-cmd برای مدیریت پیکربندی فایروال، باید با چند مفهوم که این ابزار معرفی می کند آشنا شویم.
zones
deamon firewalld، گروه هایی از قوانین را با استفاده از واحدهایی که zone نام دارد، مدیریت می کند. zone ها مجموعه ای از قوانین را تشکیل می دهند که بسته به میزان اعتمادی که به شبکه داریم، تعیین می کنند چه ترافیکی باید مجاز باشد. رابط های شبکه به یک zone اختصاص داده می شود تا تعیین کند چه رفتاری را فایروال باید مجاز بداند.
برای رایانه هایی که ممکن است به طور مکرر بین شبکه ها حرکت کنند (برای مثال لپ تاپ)، این نوع انعطاف پذیری روش خوبی برای تغییر قوانین، البته بسته به محیط ما، ارائه می دهد. ممکن است قوانین سخت گیرانه ای داشته باشیم که بیشتر ترافیک را هنگام کار در یک شبکه عمومی ممنوع می کند و برعکس، محدودیت های راحت تری را هنگام اتصال به شبکه خانگی، مجاز می سازد. از آنجایی که محیط شبکه به ندرت تغییر می کند، این zone ها برای یک سرور چندان مهم نیستند.
بدون در نظر گرفتن این نکته، که چقدر محیط شبکه ما می تواند پویا باشد، آشنایی با ایده کلی پشت هر یک از zone های از پیش تعریف شده برای فایروال، مفید خواهد بود. zone های از پیش تعریف شده در فایروال، از لحاظ اعتماد، به ترتیب از کمترین تا بیشترین به صورت زیر است:
- drop: پایین ترین سطح اعتماد. در این حالت، تمام اتصالات ورودی بدون پاسخ قطع می شوند و فقط اتصالات خروجی امکان پذیر است.
- block: مشابه مورد بالا است، ولی بجای حذف اتصالات، درخواست های دریافتی با پیام icmp-host-prohibited یا icmp6-adm-prohibited رد می شوند.
- public: نشان دهنده شبکه های عمومی و غیر قابل اعتماد است. با اینکه ما به رایانه های دیگر اعتماد نداریم، ممکن است در موارد خاص اتصالات ورودی انتخابی را مجاز کنیم.
- external: شبکه های خارجی هستند، البته در صورتی که ما از فایروال به عنوان دروازه خود استفاده کنیم. این zone برای پنهان کردن NAT پیکربندی شده است تا شبکه داخلی ما خصوصی بماند ولی قابل دسترسی باشد.
- internal: طرف مقابل external zone است که برای بخش داخلی یک دروازه استفاده می شود. در این حالت، رایانه ها نسبتا قابل اعتماد هستند و برخی خدمات اضافی نیز در دسترس قرار می گیرند.
- dmz: برای رایانه های واقع در dmz (رایانه های جداگانه ای که به بقیه شبکه دسترسی ندارند) استفاده می شود. در اینجا فقط برخی از اتصالات ورودی مجاز هستند.
- work: برای ماشین های کار استفاده می شود. می توانیم به اکثر رایانه های موجود در شبکه اعتماد کنیم. در این حالت ممکن است چند سرویس دیگر نیز مجاز باشد.
- home: یک محیط خانگی است. بطور کلی به این معناست که به اکثر رایانه ها اعتماد داریم و پذیرای چند سرویس دیگر نیز می تواند باشد.
- trusted: در این حالت به تمام ماشین های موجود در شبکه می توانیم اعتماد کنیم. کاملا در دسترس قرار دارد و باید در حد کم استفاده شود.
برای استفاده از فایروال می توانیم قوانینی ایجاد کنیم و ویژگی های zone خود را تغییر دهیم و سپس رابط های شبکه خود را به هر منطقه ای که مناسبتر است، اختصاص دهیم.
ماندگاری قواعد
در firewalld، قوانین را می توان به مجموعه قوانین زمان اجرا فعلی محدود کرد و یا بطور دائمی اعمال کرد. هنگامی که یک قانون اضافه شده و یا اصلاح می شود، بطور پیش فرض، فقط فایروال در حال اجرا تغییر می کند. بنابراین، پس از راه اندازی مجدد بعدی یا بارگزاری مجدد سرویس فایروال، فقط قوانین دائمی است که باقی می ماند.
اکثر عملیات های firewall-cmd می توانند یک flag دائمی داشته باشند تا نشان دهند که تغییرات باید در پیکربندی دائمی اعمال شوند. علاوه بر این، فایروال در حال اجرا را می توان با دستور firewall-cmd –runtime-to-permanent در پیکربندی دائمی ذخیره کرد.
در اینجا، جداسازی زمان اجرا از پیکربندی دائمی به این معنی است که می توانیم با خیال راحت قوانین را در فایروال فعال خود آزمایش کنیم و سپس با شروع مجدد، در صورت وجود مشکل، آن را مجددا بارگیری کنیم.
مرحله دوم- نصب و فعال سازی firewalld
firewalld بطور پیش فرض، روی برخی از توزیع های لینوکس، از جمله بسیاری از deployment های راکی لینوکس، نصب شده است. با این حال، ممکن است لازم باشد خودمان فایروال را نصب کنیم. در این صورت می توانیم این کار را با استفاده از مدیریت بسته dnf rocky انجام دهیم:
sudo dnf install firewalld -y
پس از نصب فایروال، باید سرویس را با استفاده از systemctl فعال کنیم. باید به خاطر داشته باشیم که فعال کردن فایروال باعث راه اندازی سرویس در هنگام بوت می شود. بهتر است قوانین فایروال خود را ایجاد کنیم و در حالی که از طریق SSH وارد سیستم شده ایم، از این فرصت برای تست آنها استفاده کنیم تا از مشکلات احتمالی جلوگیری کنیم.
sudo systemctl enable firewalld sudo systemctl start firewalld
با تایپ دستور زیر می توانیم وضعیت دسترسی و اجرای سرویس را شناسایی کنیم:
sudo firewall-cmd --state
این دستور نشان می دهد که فایروال با تنظیمات پیش فرض آماده و اجرا می شود. قبل از انجام تغییرات بیشتر، باید با محیط پیش فرض و قوانین ارائه شده توسط firewalld آشنا شویم.
بررسی پیش فرض ها در فایروال
با اجرای دستور firewall-cmd –get-default-zone می توانیم ببینیم که کدام zone در حال حاضر به عنوان پیش فرض انتخاب شده است:
firewall-cmd --get-default-zone
از آنجایی که هیچ دستوری برای انحراف از zone پیش فرض در فایروال ایجاد نکرده ایم و هیچ یک از رابط های ما برای اتصال به zone دیگری پیکربندی نشده اند، zone پیش فرض همچنان تنها zone فعال حواهد بود. با اجرای دستور firewall-cmd –get-active-zones می توانیم آن را تایید کنیم:
firewall-cmd --get-active-zones
در این قسمت می توانیم ببینیم که سرور نمونه ما دارای دو رابط شبکه است که توسط فایروال کنترل می شود (eth0 و eth1).
هر دو در حال حاضر، براساس قوانین تعریف شده برای public zone مدیریت می شوند.
حالا با استفاده از دستور firewall-cmd –list-all می توانیم قوانین مرتبط با پیکربندی zone پیش فرض را چاپ کنیم:
sudo firewall-cmd --list-all
بررسی zone های جایگزین در فایروال
در اینجا می توانیم اطلاعاتی درباره zone های دیگر پیدا کنیم:
برای مشاهده فهرستی از zone های در دسترس، دستور firewall-cmd –get-zones را اجرا می کنیم:
firewall-cmd --get-zones
می توانیم پیکربندی خاص مرتبط با یک zone را با گنجاندن پارامتر =zone– در دستور list-all– مشاهده کنیم:
sudo firewall-cmd --zone=home --list-all
در مرحله بعد، با اختصاص دادن zone ها به رابط های شبکه آشنا خواهیم شد.
مرحله سوم- انتخاب zone ها برای رابط ها در فایروال
هر رابط در هنگام راه اندازی فایروال در zone پیش فرض قرار می گیرد، مگر اینکه رابط های شبکه بطور دیگری پیکربندی شده باشند.
تغییر zone یک رابط
با استفاده از ترکیب پارامتر =zone– با =change-interface– می توانیم یک رابط را بین zone ها در طول یک جلسه جابجا کنیم. مانند تمام دستورات دیگر، برای تغییر فایروال از دستور sudo استفاده می کنیم.
برای مثال، می توانیم با دستور زیر رابط eth0 به home zone انتقال دهیم:
sudo firewall-cmd --zone=home --change-interface=eth0
توجه: هر زمان که یک رابط را به یک منطقه جدید منتقل می کنیم، باید این مورد را در نظر بگیریم که درحال تغییر دادن خدماتی هستیم که قرار است اعمال شوند. برخی از zone های دیگر، ssh را در حالت پیش فرض فعال نمی کنند و جابجایی به یکی از این zone ها می تواند باعث قطع اتصال شود و از ورود مجدد به سرور جلوگیری کند.
حالا با بررسی zone های فعال، می توانیم تایید کنیم که این کار با موفقیت انجام شده است:
firewall-cmd --get-active-zones
تنظیم zone پیش فرض در فایروال
اگر تمام رابط های ما توسط یک zone از پیش تعریف شده، به خوبی قابل مدیریت باشند، باید آن zone را به عنوان پیش فرض در نظر بگیریم. می توانیم zone پیش فرض را با پارامتر =set-default-zone– تغییر دهیم. این کار باعث تغییر رابط کاربری با استفاده از zone پیش فرض می شود:
sudo firewall-cmd --set-default-zone=home
مرحله چهارم- تنظیم قوانین برای برنامه ها
حالا بیایید باهم روش های تعریف استثناهای فایروال را بررسی کنیم.
افزودن یک سرویس به zone
ساده ترین روش این است که سرویس ها یا پورت های مورد نیاز خود را به zone هایی که استفاده می کنیم اضافه کنیم. با استفاده از گزینه -get-services– از firewall-cmd می توانیم لیستی از تعاریف سرویس های موجود را دریافت کنیم:
firewall-cmd --get-services
توجه: با مشاهده فایل xml مرتبط با هر یک از این سرویس ها در پوشه usr/lib/firewalld/services/ می توان جزئیات بیشتری را در مورد هر یک از آنها یافت.
با استفاده از پارامتر=add-service– می توانیم یک سرویس را برای zone فعال کنیم. این کار قوانین zone پیش فرض یا هر zone دیگری که توسط پارامتر =zone– مشخص شده است را هدف قرار می دهد. می توانیم پیکربندی دائمی فایروال را با اضافه کردن permanent– تنظیم کنیم.
برای مثال، اگر از یک وب سرور استفاده می کنیم که ترافیک http را ارائه می دهد، می توانیم به طور موقت این ترافیک را برای رابط های موجود در public zone خود مجاز کنیم:
sudo firewall-cmd --zone=public --add-service=http
می توانیم =zone– را برای تغییر zone پیش فرض، حذف کنیم. همچنین، با استفاده از list-all– یا list-services– می توانیم موفقیت عملیات را تایید کنیم:
sudo firewall-cmd --zone=public --list-services
وقتی درستی عملیات را بررسی کردیم، می توانیم قوانین دائمی فایروال را تغییر دهیم تا سرویس پس از راه اندازی مجدد همچنان در دسترس باشد. حالا با افزودن permanent– می توانیم دستور قبلی را دائمی کنیم:
بطور متناوب، می توانیم از runtime-to-permanent– برای ذخیره پیکربندی در حال اجرا، در پیکربندی دائمی استفاده کنیم:
sudo firewall-cmd --runtime-to-permanent
تمام تغییرات ایجاد شده در فایروال در حال اجرا، بطور دائم اعمال می شوند، پس باید مراقب این گزینه باشیم.
ما در هر روشی می توانیم با اضافه کردن permanent– به list-services– تایید کنیم که عملیات موفقیت آمیز بوده است. حالا لازم است برای هر یک از عملیات های permanent– از sudo استفاده کنیم:
sudo firewall-cmd --zone=public --list-services --permanent
اگر وب سرور ما برای استفاده از SSL/TLS پیکربندی شده باشد، باید سرویس https را نیز اضافه کنیم. با تایپ کردن می توانیم آن را در session فعلی و مجموعه قوانین دائمی اضافه کنیم:
sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --add-service=https --permanent
سرویس هایی که با نصب فایروال گنجانده شده اند، بسیاری از برنامه های رایج را نشان می دهند، که ممکن است نیاز به اجازه دسترسی به آنها را داشته باشیم. با این حال، باید احتمال وجود این سناریو را در نظر بگیریم که سرویس ها با نیازهای ما مطابقت ندارند. در این حالت ما دو گزینه خواهیم داشت:
باز کردن یک پورت برای zone ها
ساده ترین راه برای افزودن پشتیبانی برای برنامه های خاص، باز کردن پورت هایی است که در zone های مناسب استفاده می شوند. این کار با تعیین محدوده پورت و پروتکل مرتبط یعنی tcp یا udp برای پورت ها انجام می شود.
برای مثال، اگر برنامه بر روی پورت 5000 اجرا شود و از tcp استفاده کند، می توانیم بطور موقت آن را با public zone با پارامتر =add-port– استفاده کنیم. پروتکل ها را می توان به عنوان tcp یا udp تعیین کرد:
sudo firewall-cmd --zone=public --add-port=5000/tcp
حالا با استفاده از پارامتر list-ports– می توانیم موفقیت عملیات را تایید کنیم:
sudo firewall-cmd --zone=public --list-ports
همچنین می توان با جدا کردن پورت شروع و پایان در محدوده با یک خط تیره، یک محدوده متوالی از پورت ها را مشخص کرد. برای مثال، دستور زیر را در نظر بگیرید:
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
پس از آزمایش، می توانیم این موارد را به فایروال دائمی اضافه کنیم. حالا از sudo firewall-cmd –runtime-to-permanent استفاده می کنیم و یا permanent– را دوباره اجرا می کنیم:
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp sudo firewall-cmd --zone=public --permanent --list-ports
تعریف یک سرویس
باز کردن پورت ها برای zone های موجود یک راه حل ساده است. اما پیگیری اینکه هر یک از آنها برای چه چیزی استفاده می شوند، دشوار است. اگر تا به حال سرویسی را در سرور خود از کار انداخته باشیم، ممکن است در فهرست کردن پورت هایی که باز شده با مشکل مواجه شویم. برای جلوگیری از این وضعیت، می توانیم یک سرویس جدید تعریف کنیم.
سرویس ها، مجموعه ای از پورت ها با نام و توضیحات مرتبط هستند. مدیریت فایروال ما با استفاده از سرویس ها، عموما قابلیت نگهداری بیشتری نسبت به پورت های نقشه برداری دارد، اما نیاز به پیکربندی اولیه است. می توانیم با کپی کردن اسکریپت موجود در usr/lib/firewalld/services/ در فهرست etc/firewalld/services/ شروع کنیم.
به عنوان مثال، می توانیم تعریف سرویس SSH را، برای استفاده در تعریف سرویس مثال خود، کپی کنیم. به مثال زیر توجه کنید:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
حالا فایل را باز کرده و از ویرایشگر مورد علاقه خود یا دستور vi استفاده می کنیم:
sudo vi /etc/firewalld/services/example.xml
برای شروع، فایل باید حاوی تعریف SSH باشد که کپی کرده ایم:
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> </service>
بیشتر این تعریف، در واقع metadata است. باید نام کوتاه سرویس را در تگ های «short» تغییر دهیم. همچنین باید توضیح اضافی دهیم تا در صورت نیاز به audit سرویس، اطلاعات بیشتری داشته باشیم. حالا تنها پیکربندی که باید انجام دهیم تعریف پورت است که در آن شماره پورت و پروتکل باز کردن آن را شناسایی می کنیم.
در این میان، چندین tag برای «/port» می توان مشخص کرد. در نهایت، ذخیره کرده و فایل را می بندیم.
حالا فایروال را برای دسترسی به سرویس جدید، مجددا بارگذاری می کنیم:
sudo firewall-cmd --reload
همانطور که می بینید، سرویس ما در میان فهرست سرویس های قابل دسترسی قرار دارد:
firewall-cmd --get-services
حالا با خیال راحت می توانیم سرویس را در zone های خود استفاده کنیم.
مرحله پنجم- ایجاد zone های مختص به خودمان در فایروال
در حالی که zone های از پیش تعریف شده برای اکثر کاربران قابل استفاده است، تعریف یک سری از zone ها برای خودمان مفید خواهد بود.
به عنوان مثال، احتمالا لازم باشد یک zone برای وب سرور خود ایجاد کنیم که public web نام دارد. در آن واحد، ممکن است یک zone جداگانه برای سرویس DNS، که در شبکه خصوصی خود ارائه می دهیم، پیکربندی کنیم. می توانیم نام آن را privateDNS بگذاریم.
هنگام اضافه کردن zone، باید آن را به پیکربندی فایروال دائمی اضافه کنیم. سپس می توانیم مجددا بارگیری کرده و پیکر بندی را در جلسه در حال اجرا خود قرار دهیم. برای مثال، ما از دستور firewall-cmd –new-zone برای ایجاد دو zone استفاده می کنیم:
sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS
با تایپ دستور زیر مشخص می کنیم که این دو در پیکربندی دائمی ما وجود دارند:
sudo firewall-cmd --permanent --get-zones
و حالا نوبت بارگیری مجدد فایروال و قرار دادن zone ها در session در حال اجرا است:
sudo firewall-cmd --reload firewall-cmd --get-zones
اکنون می توانیم سرویس ها و پورت های مناسب را به zone های خود اختصاص دهیم. این را هم بدانید که تنظیم زمان اجرای فایروال و ذخیره تغییرات در پیکربندی دائمی، پس از آزمایش آن ایده خوبی است. برای مثال، می توانیم سرویس های SSH, http و https را به publiczone اضافه کنیم:
sudo firewall-cmd --zone=publicweb --add-service=ssh sudo firewall-cmd --zone=publicweb --add-service=http sudo firewall-cmd --zone=publicweb --add-service=https sudo firewall-cmd --zone=publicweb --list-all
سپس، می توانیم سرویس DNS را به privateDNS zone خود اضافه کنیم:
sudo firewall-cmd --zone=private DNS --add-service=dns sudo firewall-cmd --zone=private DNS --list-all
اکنون باید پیکربندی خود را تست کنیم. اگر این مقادیر کارساز بود می توانیم آنها را به پیکربندی دائمی اضافه کنیم. با اجرا دستور permanent– این کار را انجام می دهیم. ولی حالا باید از دستور the –runtime-to-permanent برای ذخیره تغییرات استفاده کنیم:
sudo firewall-cmd --runtime-to-permanent
بعد از انجام این مراحل فایروال را مجددا بارگیری می کنیم تا تغییرات اعمال شود:
sudo firewall-cmd --reload
اکنون باید با دستور زیر تایید کنیم که zone ها را به درستی تعیین کرده ایم:
firewall-cmd --get-active-zones
و سپس، تایید می کنیم که سرویس های مناسبی برای هر دو zone در دسترس داریم:
sudo firewall-cmd --zone=publicweb --list-services
sudo firewall-cmd --zone=privateDNS --list-services
در نهایت، ما با موفقیت zone های خود را راه اندازی کردیم. حالا برای قرار دادن یکی از این zone ها برای رابط و بطور پیش فرض، باید از پارامتر زیر استفاده کنیم:
sudo firewall-cmd --set-default-zone=publicweb
سایت مربوطه : https://firewalld.org
سخن آخر
با مطالعه این مقاله، شما باید درک نسبتا کاملی از نحوه مدیریت سرویس فایروال در سیستم راکی لینوکس به دست آورید. همچنین، آموختید که سرویس firewalld به شما امکان می دهد تا مجموعه قوانین قابل نگهداری را پیکربندی کنید تا محیط شبکه شما را در نظر بگیرد. این عملکرد باعث می شود تا بطور یکپارچه بین قوانین مختلف فایروال با استفاده از zone ها جابجا شوید. فرا گرفتن دانش کاربردی این سیستم باعث می شود که از انعطاف پذیری و قدرتی که این ابزار به شما می دهد، به خوبی استفاده کنید. از اینکه ما را در این آموزش همراهی کردید متشکریم و امیدواریم مطالب فوق برای شما مفید بوده باشد.