معرفی سرویس firewalld در سیستم عامل لینوکس

 همانطور که میدانید فایروال نرم افزار یا سخت افزاری هست که شبکه شما را از دسترسی ها و ترافیک های غیر مجاز خارجی حفظ می کند و عضو جدایی ناپذیر از شبکه شما محسوب می شود. همه سیستم عامل ها یک فایروال داخلی درون خودشان دارند و سیستم عامل لینوکس نیز از این قاعده مستثنی نیست و فایروال firewalld یکی از این فایروال ها می باشد. firewalld با زبان برنامه نویسی پایتون نوشته شده است و تحت لیسانس GNU GPL 2 می باشد. firewalld هم از IPv4 و هم از IPv6 پشتیبانی می کند.

در فایروال های لینوکسی مفهومی هست به نام Zone ها و ادمین های سیستم می توانند هر یک از Zone ها را توسط Rule ها پیکربندی کنند. این Rule ها هستند که به فایروال می گویند چه ترافیک هایی اجازه ورود یا خروج دارند و چه ترافیک هایی اجازه ورود و خروج به سیستم را ندارند. مطابق با استاندارد های NIST 800-171 و 53-800 به صورت پیش فرض firewalld ترافیک outbound یا خروجی از سیستم را Block یا مسدود نمی کند اما شما با استفاده از نوشتن Policy ها می توانید ترافیک های outbound را با توجه به نیازتان نیز مسدود کنید.

 

 firewalld در سیستم عامل لینوکس سرویس (daemon) فایروال هست که به عنوان یک فایروال Host-based که توسط اینترفیس D-bus کنترل می شود. همانطور که در بالا ذکر شد فایروال ها از یکسری Rule های از پیش تعریف شده به همراه Zone ها استفاده می کنند درست همانطور که هر سرویس از یک پورت خاص برای انجام کارش استفاده می کند. شما میتوانیم هر ترافیکی که میخواهد وارد سیستم شود را اجازه عبور بدهید و یا برعکس میتوانید ورود ترافیک را بر اساس شماره پورت مربوطه مسدود کنید. به عنوان مثال ، اگر شما نمیخواهید هیچ کسی به سیستم شما SSH connection بزند میتوانید شماره پورت 22 را Block یا مسدود کنید. و اینگونه میتوانید مطمئن شوید که هیچ شخصی نمیتواند به سیستم تان از بیرون با SSH متصل شود.

Zone ها

سرویس firewalld از مفهوم zone ها برای کارش استفاده می کند. شما اینترفیس های شبکه را میتوانید به Zone ها اختصاص دهید و میتوانید تصمیم بگیرید که کدام نوع ترافیک میتواند وارد شبکه شما شود. شما با استفاده از Network Manager میتوانید اینترفیس های شبکه تان را با استفاده از دستور firewall-cmd به Zone های خاصی نسبت دهید. firewall-cmd یکی از ابزار های خط فرمانی بسیار معروف و پرکاربرد در سیستم عامل لینوکس هست. Default Zone های firewalld در دایرکتوری /usr/lib/firewalld/zones/ ذخیره می شوند. حالا بیاید چند نمونه از Zone های از پیش تعریف شده در firewalld را با هم بررسی کنیم :

  • Block : در این zone ، هر connection ورودی توسط پیامی با عنوان  icmp-host-prohibited ریجکت یا مسدود می شود. و تنها connection های آغاز شده درون خود سیستم اجازه برقراری ارتباط خواهند داشت.
  • DMZ : همانطور که میدانید DMZ مخفف DeMilitarized Zone است برای سیستم هایی که ارتباطات محدود در شبکه داخلی را دارند این zone تنها connection های از پیش انتخاب شده را اجازه برقراری ارتباط میدهد.
  • Drop : در این zone ترافیک ها بدون هیچگونه اطلاع رسانی drop خواهند شد. اما ترافیک های خروجی اجازه عبور خواهند داشت.
  • Public : این zone همانطور که میدانید برای دیوایس های موجود در شبکه اینترنت استفاده می شود. همانطور که انتظار میرود بیشتری سختگیری ها برای این zone در نظر گرفته می شود.
  • Trusted : در این zone همه connection ها و ترافیک ها اجازه عبور دارند.

نکته : هر یک از این zone ها با توجه به نیاز کاربر میتواند به عنوان zone پیش فرض سیستم در نظر گرفته شود. Public zone بعد از راه اندازی firewalld به عنوان Default Zone سیستم در نظر گرفته می شود زیرا همانطور که قبلا نیز گفته شد بیشترین سخت گیری برای این نوع zone است. اگر چه شما میتوانید این پیش فرض را بنا به نیاز خود تغییر دهید.

کار با Firewall Rules در سیستم عامل لینوکس توزیع Red Hat Enterprise

حالا که مفاهیم اولیه firewalld را میدانید دیگر بهتر است به سراغ تشریح استفاده از دستورات این سرویس بروید. حال ما برایتان می گوییم که چگونه می توان سرویس های مختلف این فایروال را اضافه یا کم کنید. ابتدا به ساکن به سراغ مشاهده وضعیت سرویس بروید. برای اینکه status یا وضعیت سرویس را مشاهده کنید یکی از دو دستور زیر را اجرا کنید :

# systemctl status firewalld
# firewall-cmd --state running

خروجی این دستور به صورت زیر است :

firewalld.service - firewalld - dynamic firewall daemon
  Loaded: loaded (/usr/lib/systemd/system/firewalld.service;
enabled; vendor preset: enabled)  
  Active: active (running) since Fri 2020-11-13 18:19:05 CET; 4 
months 4 days ago

برای مشاهده اطلاعات مربوط به default zone از دستور زیر میتوانید استفاده کنید :

# firewall-cmd --list-all

خروجی این دستور به صورت زیر است :

public (active)
target: default
icmp-block-inversion: no  
interfaces: baremetal cni-podman0 eno1 eno2 eno3 provisioning  
sources:   services: cockpit dhcpv6-client http ssh 
ports: 8080/tcp 80/tcp 80/udp 67/udp 68/udp  protocols:  
masquerade: no  
forward-ports:  
source-ports:
icmp-blocks:
rich rules:

همانطور که در خروجی فوق مشاهده می کنید Public zone به عنوان Default Zone ست شده است. همچنین اینترفیس یا همان کارت شبکه های اختصاص یافته به این zone به همراه پورت های فعال شده و سرویس های تخصیص یافته را نیز میتوانید در خروجی دستور مشاهده کنید.

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

# firewall-cmd --list-all --zone=MyHome

برای اینکه در زمان startup سیستم بخواهید سرویس firewalld استارت و عملیاتی شود میتوانید از دستور زیر استفاده کنید :

# systemctl enable firewalld 
# systemctl start firewalld

برای غیرفعال و متوقف کردن سرویس firewalld از دستور زیر استفاده کنید :

# systemctl disable firewalld 
# systemctl stop firewalld

برای نمایش تمامی Zone های ساخته شده توسط firewalld از دستور زیر استفاده کنید :

# firewall-cmd --list-all-zones

اضافه کردن پورت ها و سرویس ها به Zone و Permanent کردن آنها

حالا بیایید چند سرویس و پورت به یک Zone خاص اضافه کنیم و آنها را permanent کنیم. permanent کردن در سرویس firewalld به معنای این است که کاری کنیدکه پورت ها و سرویس هایی که Assign شده تان بعد از Reboot شدن سیستم از بین نرود و بعبارتی اطلاعاتش به جای حافظه RAM در هارد دیسک نوشته شود. خوب برای باز یا بستن پورت ها با استفاده از firewalld از دستورات زیر استفاده می شود :

# firewall-cmd --list-ports         
# firewall-cmd --add-port <port-number/port-type> --permanent 
# firewall-cmd --reload

همانطور که میدانید Port ها دیوایس های منطقی ای هستند که سیستم عامل را قادر میسازند تا ترافیک های ورودی را دریافت کنند و به سرویس های سیستم انتقال دهند. معمولا این سرویس ها روی پورت های استاندارد به درخواست ها گوش میدهند. برای مثال HTTP روی پورت 80 و HTTPS روی پورت 443 به درخواست ها گوش میدهد. در مثال زیر میخواهیم پورت 443 را به Default Zone سیستم یعنی Public Zone اضافه کنیم و آنرا Permanent کنیم :

# firewall-cmd --add-port 443/tcp --zone=public --permanent 
# firewall-cmd --reload

در دستور دوم سرویس firewalld را Reload کنید تا تغییرات روی سرویس اعمال شود. شما با استفاده از آپشن remove-port– میتوانید پورت مربوطه را از Zone مربوطه حذف کنید. یادتان نرود که در آخر سرویس را Reload کنید.

استفاده از Rich Rule ها در firewalld

Rich Rule ها در سرویس firewalld دارای یکسری قابلیت های پیشرفته در خصوص filtering پکت ها یا بسته های اطلاعاتی هستند. با استفاده از Rich rule ها شما میتوانید اجازه عبور Packet هایی با آدرس های IP خاص و یا رنج های خاص آدرس IP را بدهید. با اجرای دستور زیر میتوانید Rich Rule فعلی ست شده روی سیستم تان را مشاهده کنید :

# firewall-cmd --list-rich-rules

حالا در مثال زیر در سیستم تعریف کنید که اجازه عبور ترافیک SSH را فقط از آدرس 10.1.111.21 بده و SSH connection دیگر IP را Block کن :

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.1.111.21/24 service name=ssh log prefix="SSH Logs" level="notice" accept'

به عنوان مثالی دیگر ، در دستور زیر بسته های Ping از طرف تمامی سیستم ها با نشان دادن یک پیغام خطا reject می شود :

# firewall-cmd --add-rich-rule='rule protocol value=icmp reject'

و در مثال زیر ترافیک های ورودی از طرف آدرس 172.92.10.90/32 و با پورت 21 ریجکت می شود و برای سایر ترافیک ها اجازه عبور داده می شود :

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.92.10.90/32 port port=21 protocol=tcp  reject'