ابزار FirewallD یک پوسته کنترلی برای iptables است که برای ایجاد قوانین ثابت ترافیک شبکه استفاده میشود. این ابزار که آن را میتوان هم از طریق خط فرمان و هم از طریق رابط کاربری گرافیکی به کار گرفت، در منابع بسیاری از توزیعهای لینوکس در دسترس قرار میگیرد. کار با ابزار FirewallD نسبت به استفاده مستقیم از iptables، دارای دو تفاوت اساسی است.
- ابزار FirewallD به جای زنجیره و قوانین، از نواحی (zones) و سرویسها استفاده میکند.
- مدیریت مجموعه قوانین به صورت دینامیکی و پویاست. به این معنا که بدون خلل در وضعیت و اتصال کنونی، اجازه بروزرسانی را میدهد.
نکته: FirewallD یک پوسته برای iptables است که موجب سادهتر شدن مدیریت قوانین آن میشود. بنابراین، جایگزینی برای iptables محسوب نمیشود. البته هنوز هم میتوان از فرمانهای iptables در ابزار FirewallD استفاده کرد؛ امّا توصیه میشود که تنها از فرمان خود FirewallD در FirewallD استفاده کنید.
در این مطلب قصد داریم که شما را با ابزار FirewallD، مفهوم نواحی و سرویسهای آن و برخی تنظیمات پایه آشنا کنیم. با ما همراه باشید.

نصب و مدیریت ابزار FirewallD
ابزار FirewallD به صورت پیشفرض در سیستمعامل لینوکس CentOS 7 وجود دارد، امّا به صورت غیرفعال است. کنترل آن همانند سایر بخشهای systemd خواهد بود.
برای شروع سرویس و فعالکردن FirewallD در هنگام شروع به کار سیستم داریم:
[php]
sudo systemctl start firewalld
sudo systemctl enable firewalld
[/php]
همچنین برای توقف و غیرفعالکردن این سرویس از فرمانهای زیر استفاده میشود.
[php]
sudo systemctl stop firewalld
sudo systemctl disable firewalld
[/php]
وضعیت فایروال را بررسی کنید. خروجی باید نشان دهد که این سرویس در حال اجراست یا خیر.
[php]
sudo firewall-cmd –state
[/php]
برای مشاهده وضعیت ابزار FirewallD داریم:
[php]
sudo systemctl status firewalld
[/php]
نمونه خروجی
[php]
firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-08-08 15:11:24 IST; 23h ago
Docs: man:firewalld(1)
Main PID: 2577 (firewalld)
CGroup: /system.slice/firewalld.service
└─2577 /usr/bin/python -Es /usr/sbin/firewalld –nofork –nopid
[/php]
برای بارگذاری دوباره تنظیمات ابزار FirewallD، فرمان زیر را تایپ کنید.
[php]
sudo firewall-cmd –reload
[/php]
تتظیمات FirewallD
ابزار FirewallD بهوسیله فایلهای XML تنظیم میشود. البته تا زمانی که به تنظیم فوقالعادهای نیاز نداشته باشید، احتیاجی به تغییر آنها ندارید و به جای آنها باید از firewall-cmd استفاده کنید.
فایلهای تنظیمات در دو دایرکتوری قرار میگیرند.
- /usr/lib/FirewallD دربرگیرنده تنظیماتی مانند نواحی پیشفرض و سرویسهای معمول است. حتماً از بروزرسانی آنها خودداری کنید؛ چرا که این فایلها در هر بار بروزرسانی بسته firewalld تغییر خواهند کرد.
- /etc/firewalld دربرگیرنده فایلهای تنظیمات سیستم است. این فایلها به صورت تنظیمات پیشفرض نوشته میشوند.
مجموعه تنظیمات
ابزار Firewalld از دو مجموعه یا سری تنظیمات استفاده میکند؛ تنظیمات لحظهای (Runtime) و همیشگی (Permanent). تنظیمات لحظهای بعد از شروع به کار دوباره FirewallD حفظ نمیشوند. این در حالی است که تغییرات همیشگی برای یک سیستم در حال اجرا نخواهند بود.
به صورت پیشفرض، فرمانهای firewall-cmd به تنظیمات لحظهای اِعمال میشوند. امّا در صورتی که از گزینه –permanent در فرمان استفاده کنید، تنظیمات به صورت ثابت انجام میگردند. برای اضافه و فعال کردن یک قاعده همیشگی، میتوانید از یکی از این دو روش استفاده کنید.
۱) اضافهکردن قاعده به هر دو سری تنظیمات لحظهای و همیشگی
[php]
sudo firewall-cmd –zone=public –add-service=http –permanent
sudo firewall-cmd –zone=public –add-service=http
[/php]
۲) اضافهکردن قاعده به سری تنظیمات همیشگی و راهاندازی دوباره ابزار FirewallD
[php]
sudo firewall-cmd –zone=public –add-service=http –permanent
sudo firewall-cmd –reload
[/php]
نکته
فرمان reload تمام تنظیمات جاری و لحظهای را حذف و تنظیمات همیشگی را اِعمال میکند. البته به دلیل دینامیکبودن مدیریت firewalld، وضعیتها و ارتباطات کنونی با خلل روبرو نمیشوند.
نواحی فایروال
ناحیهها یا زونها یک سروی قواعد از پیش تعیین شده برای سطوح مختلف اطمینان هستند و برای برخی نقاط یا سناریوهای خاص استفاده میشوند نواحی مختلف به سرویسها و انواع مختلف ترافیکها اجازه ورود میدهند و در مقابل، هر چیز ورودی دیگر را میگیرند. بعد از فعالسازی ابزار FirewallD برای اولین بار، ناحیه پیشفرض “Public” خواهد بود.
همچنین زونها را میتوان به رابطهای کاربری مختلف شبکه اِعمال کرد. به عنوان مثال، در صورتی که دو رابط کاربری جداگانه برای شبکه داخلی و اینترنت وجود داشته باشد، میتوانید به پروتکل DHCP در شبکه داخلی اجازه ورود بدهید، ولی در ناحیه خارجی تنها HTTP و SSH مجوّز داشته باشند. هر رابط کاربری که برایش یک ناحیه خاص تعیین نشده باشد، به ناحیه پیشفرض خواهد پیوست.
برای مشاهده ناحیه پیشفرض داریم:
[php]
sudo firewall-cmd –get-default-zone
[/php]
برای تغییر ناحیه پیشفرض، از فرمان زیر استفاده میشود.
[php]
sudo firewall-cmd –set-default-zone=internal
[/php]
برای دیدن نواحی مورد استفاده رابط یا رابطهای کاربری شبکه:
[php]
sudo firewall-cmd –get-active-zones
[/php]
نمونه خروجی
[php]
public
interfaces: eth0
[/php]
برای دریافت تمام تنظیمات موجود برای یک زون خاص، فرمان زیر را تایپ کنید.
[php]
sudo firewall-cmd –zone=public –list-all
[/php]
نمونه خروجی
[php]
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http
ports: 12345/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[/php]
و برای دریافت تمام تنظیمات موجود برای تمام نواحی:
[php]
sudo firewall-cmd –list-all-zones
[/php]
نمونه خروجی
[php]
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
…
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[/php]
کار با سرویسها
ابزار FirewallD میتواند بر اساس قواعد از پیش تعریف شده برای سرویسهای شبکه خاص، اجازه ورود ترافیک را بدهد. شما میتوانید خودتان قواعد سفارشی سرویسها را بسازنید و آنها به هر کدام از نواحی اِعمال کنید. فایلهای تنظمیات برای سرویسهای پیشفرض در /usr/lib/firewalld/services و فایل تنظیمات سرویسهای که توسط کاربر تعریف شدهاند، در آدرس /etc/firewalld/services قرار گرفتهاند.
برای مشاهده سرویسهای در دسترس پیشفرض از فرمان زیر استفاده کنید.
[php]
sudo firewall-cmd –get-services
[/php]
مثالی برای فعال و غیرفعالکردن سرویس HTTP
[php]
sudo firewall-cmd –zone=public –add-service=http –permanent
sudo firewall-cmd –zone=public –remove-service=http –permanent
[/php]
مجوّز یک پورت یا پروتکل دلخواه
به عنوان مثال، برای دادن مجوّز یا لغو مجوّز ترافیک به پورت 12345 داریم:
[php]
sudo firewall-cmd –zone=public –add-port=12345/tcp –permanent
sudo firewall-cmd –zone=public –remove-port=12345/tcp –permanent
[/php]
ارجاع پورت
مثال زیر، ارجاع ترافیک پورت 80 را به پورت 12345 در همان سرور نشان میدهد.
[php]
sudo firewall-cmd –zone="public" –add-forward-port=port=80:proto=tcp:toport=12345
[/php]
برای هدایت ترافیک یک پورت به یک سرور متفاوت، به روش زیر عمل میشود.
۱) فعالکردن حالت پوششگذاری یا masquerade در یک ناحیه دلخواه
[php]
sudo firewall-cmd –zone=public –add-masquerade
[/php]
۲) اضافهکردن قاعده ارجاع. در این مثال، ترافیک پورت محلی 80 به پورت 8080 در یک سرور ریموت در آدرس IP برابر 198.51.100.0 هدایت میشود.
[php]
sudo firewall-cmd –zone="public" –add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.51.100.0
[/php]
برای حذف قاعده میتوانید –add را با –remove جایگزین کنید. به عنوان نمونه:
[php]
sudo firewall-cmd –zone=public –remove-masquerade
[/php]
ایجاد یک سری قواعد یا Ruleset با ابزار FirewallD
به عنوان یک مثال، در اینجا از ابزار FirewallD برای اضافهکردن قواعد پایه به سرور استفاده میکنیم.
ناحیه dmz را به عنوان ناحیه پیشفرض به eth0 اضافه کنید. این ناحیه به عنوان بهترین گزینه برای شروع کار با اپلیکیشن FirewallD محسوب میشود؛ چرا که تنها به پروتکلهای SSH و ICMP اجازه ورود میدهد.
[php]
sudo firewall-cmd –set-default-zone=dmz
sudo firewall-cmd –zone=dmz –add-interface=eth0
[/php]
اضافه کردن قاعده همیشگی سرویس برای HTTP و HTTPS برای ناحیه dmz
[php]
sudo firewall-cmd –zone=dmz –add-service=http –permanent
sudo firewall-cmd –zone=dmz –add-service=https –permanent
[/php]
حالا باید ابزار FirewallD را دوباره راهاندازی کنید تا تغییرات اِعمال شوند.
[php]
sudo firewall-cmd –reload
[/php]
اگر فرمان firewall-cmd –zone=dmz –list-all را اجرا کنید، احتمالاً با خروجی زیر مواجه میشوید.
[php]
dmz (default)
interfaces: eth0
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[/php]
این خروجی به ما میگوید که ناحیه dmz، ناحیه پیشفرض است و برای رابط کاربری eth0، تمام منابع شبکه و پورتها استفاده میشود. ترافیک ورودی HTTP (پورت 80(، HTTPS (پورت 443) و SSH (پورت 22) اجازه ورود خواهند داشت و از آنجایی که هیچ محدودیتی در نسخههای IP وجود ندارد، این موضوع برای هر دو پروتکل IPv4 و IPv6 انجام میشود. امکان پوششگذاری و ارجاع پورت وجود نخواهد داشت. هیچ بلوک ICMP نداریم. بنابراین ترافیک ICMP بهطور کامل مجوّز دارد. همچنین به تمام ترافیکهای خروجی اجازه داده میشود.
تنظیمات پیشرفته
سرویسها و پورتها برای انجام تنظیمات پایه مناسب هستند. ولی در عین حال، میتوانند کار را برای سناریوهای پیشرفته محدود کنند. ابزار موسوم به Rich Rules و Direct Interface به شما اجازه میدهند که قواعدی کاملاً سفارشی به فایروال برای هر ناحیه و با هر پورت و پروتکلی اضافه کنید.
Rich Rules
قالب Rich rules بسیار گسترده است که در صفحه راهنمای firewalld.richlanguage به صورت کامل توضیح داده شده است. در عین حال، میتوانید با استفاده از گزینههای –add-rich-rule، –list-rich-rules و –remove-rich-rule در فرمان firewall-cmd آن را مدیریت کنید.
در اینجا، برخی از رایجترین نمونهها را مشاهده میکنید.
مجوّز به ترافیک IPv4 از هاست 192.0.2.0
[php]
sudo firewall-cmd –zone=public –add-rich-rule ‘rule family="ipv4" source address=192.0.2.0 accept’
[/php]
مسدود کردن ترافیک IPv4 از طریق TCP از هاست 192.0.2.0 به پورت 22
[php]
sudo firewall-cmd –zone=public –add-rich-rule ‘rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject’
[/php]
اجازه ترافیک IPv4 از طریق TCP از هاست 192.0.2.0 به پورت 80 و ارجاع آن به پورت 6532
[php]
sudo firewall-cmd –zone=public –add-rich-rule ‘rule family=ipv4 source address=192.0.2.0 forward-port port=80 protocol=tcp to-port=6532’
[/php]
ارجاع تمام ترافیک IPv4 در پورت 80 به پورت 8080 در هاست 198.51.100.0 (پوششگذاری یا masquerade باید در ناحیه فعال شود).
[php]
sudo firewall-cmd –zone=public –add-rich-rule ‘rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=198.51.100.0’
[/php]
برای مشاهده تمام قواعد Rich Rules در ناحیه public داریم:
[php]
sudo firewall-cmd –zone=public –list-rich-rules
[/php]
رابط کاربری مستقیم iptables
برای کاربران حرفهای iptables، ابزار FirewallD یک رابط کاربری مستقیم ارائه کرده که اجرای فرمانهای خام iptables را فراهم میکند. این قواعد به صورت همیشگی نخواهند بود؛ مگر اینکه با گزینه –permanent همراه شوند.
برای مشاهده تمام زنجیرهها یا قواعد اضافهشده به FirewallD از فرمانهای زیر استفاده کنید.
[php]
firewall-cmd –direct –get-all-chains
firewall-cmd –direct –get-all-rules
[/php]
البته موضوع قالبهای iptables در ابزار FirewallD فراتر از بحث آموزشی در این مطلب است و شاید بخواهید از منابع زیر نیز برای اطلاعات بیشتر کمک بگیرید.