ابزار FirewallD یک پوسته کنترلی برای iptables است که برای ایجاد قوانین ثابت ترافیک شبکه استفاده می‌شود. این ابزار که آن را می‌توان هم از طریق خط فرمان و هم از طریق رابط کاربری گرافیکی به کار گرفت، در منابع بسیاری از توزیع‌های لینوکس در دسترس قرار می‌گیرد. کار با ابزار FirewallD نسبت به استفاده مستقیم از iptables، دارای دو تفاوت اساسی است.

  • ابزار FirewallD به جای زنجیره و قوانین، از نواحی (zones) و سرویس‌ها استفاده می‌کند.
  • مدیریت مجموعه قوانین به صورت دینامیکی و پویاست. به این معنا که بدون خلل در وضعیت و اتصال کنونی، اجازه بروزرسانی را می‌دهد.

نکته: FirewallD یک پوسته برای iptables است که موجب ساده‌تر شدن مدیریت قوانین آن می‌شود. بنابراین، جایگزینی برای iptables محسوب نمی‌شود. البته هنوز هم می‌توان از فرمان‌های iptables در ابزار FirewallD استفاده کرد؛ امّا توصیه می‌شود که تنها از فرمان خود FirewallD در FirewallD استفاده کنید.

در این مطلب قصد داریم که شما را با ابزار FirewallD، مفهوم نواحی و سرویس‌های آن و برخی تنظیمات پایه آشنا کنیم. با ما همراه باشید.

ابزار FirewallD

نصب و مدیریت ابزار FirewallD

ابزار FirewallD به صورت پیش‌فرض در سیستم‌عامل لینوکس CentOS 7 وجود دارد، امّا به صورت غیرفعال است. کنترل آن همانند سایر بخش‌های systemd خواهد بود.

برای شروع سرویس و فعال‌کردن FirewallD  در هنگام شروع به کار سیستم داریم:

sudo systemctl start firewalld
sudo systemctl enable firewalld

همچنین برای توقف و غیرفعال‌کردن این سرویس از فرمان‌های زیر استفاده می‌شود.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

وضعیت فایروال را بررسی کنید. خروجی باید نشان دهد که این سرویس در حال اجراست یا خیر.

sudo firewall-cmd --state

برای مشاهده وضعیت ابزار FirewallD داریم:

sudo systemctl status firewalld

نمونه خروجی

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

برای بارگذاری دوباره تنظیمات ابزار FirewallD، فرمان زیر را تایپ کنید.

sudo firewall-cmd --reload

تتظیمات FirewallD

ابزار FirewallD به‌وسیله فایل‌های XML تنظیم می‌شود. البته تا زمانی که به تنظیم فوق‌العاده‌ای نیاز نداشته باشید، احتیاجی به تغییر آنها ندارید و به جای آنها باید از firewall-cmd استفاده کنید.

فایل‌های تنظیمات در دو دایرکتوری قرار می‌گیرند.

  • /usr/lib/FirewallD دربرگیرنده تنظیماتی مانند نواحی پیش‌فرض و سرویس‌های معمول است. حتماً از بروزرسانی آ‌نها خودداری کنید؛ چرا که این فایل‌ها در هر بار بروزرسانی بسته‌ firewalld تغییر خواهند کرد.
  • /etc/firewalld دربرگیرنده فایل‌های تنظیمات سیستم است. این فایل‌ها به صورت تنظیمات پیش‌فرض نوشته می‌شوند.

مجموعه تنظیمات

ابزار Firewalld از دو مجموعه یا سری تنظیمات استفاده می‌کند؛ تنظیمات لحظه‌ای (Runtime) و همیشگی (Permanent). تنظیمات لحظه‌ای بعد از شروع به کار دوباره FirewallD حفظ نمی‌شوند. این در حالی است که تغییرات همیشگی برای یک سیستم در حال اجرا نخواهند بود.

به صورت پیش‌فرض، فرمان‌های firewall-cmd به تنظیمات لحظه‌ای اِعمال می‌شوند. امّا در صورتی که از گزینه –permanent در فرمان استفاده کنید، تنظیمات به صورت ثابت انجام می‌گردند. برای اضافه و فعال کردن یک قاعده همیشگی، می‌توانید از یکی از این دو روش استفاده کنید.

۱) اضافه‌کردن قاعده به هر دو سری تنظیمات لحظه‌ای و همیشگی

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http

۲) اضافه‌کردن قاعده به سری تنظیمات همیشگی و راه‌اندازی دوباره ابزار FirewallD

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

نکته

فرمان reload تمام تنظیمات جاری و لحظه‌ای را حذف  و تنظیمات همیشگی را اِعمال می‌کند. البته به دلیل دینامیک‌بودن مدیریت firewalld، وضعیت‌ها و ارتباطات کنونی با خلل روبرو نمی‌شوند.

نواحی فایروال

ناحیه‌ها یا زون‌ها یک سروی قواعد از پیش‌ تعیین شده برای سطوح مختلف اطمینان هستند و برای برخی نقاط یا سناریوهای خاص استفاده می‌شوند نواحی مختلف به سرویس‌ها و انواع مختلف ترافیک‌ها اجازه ورود می‌دهند و در مقابل، هر چیز ورودی دیگر را می‌گیرند. بعد از فعال‌سازی ابزار FirewallD برای اولین بار، ناحیه پیش‌فرض “Public” خواهد بود.

همچنین زون‌ها را می‌توان به رابط‌های کاربری مختلف شبکه اِعمال کرد. به عنوان مثال، در صورتی که دو رابط کاربری جداگانه برای شبکه داخلی و اینترنت وجود داشته باشد، می‌توانید به پروتکل DHCP در شبکه داخلی اجازه ورود بدهید، ولی در ناحیه خارجی تنها HTTP و SSH مجوّز داشته باشند. هر رابط کاربری که برایش یک ناحیه خاص تعیین نشده باشد، به ناحیه پیش‌فرض خواهد پیوست.

برای مشاهده ناحیه پیش‌فرض داریم:

sudo firewall-cmd --get-default-zone

برای تغییر ناحیه پیش‌فرض، از فرمان زیر استفاده می‌شود.

sudo firewall-cmd --set-default-zone=internal

برای دیدن نواحی مورد استفاده رابط یا رابط‌های کاربری شبکه:

sudo firewall-cmd --get-active-zones

نمونه خروجی

public
interfaces: eth0

برای دریافت تمام تنظیمات موجود برای یک زون خاص، فرمان زیر را تایپ کنید.

sudo firewall-cmd --zone=public --list-all

نمونه خروجی

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:

و برای دریافت تمام تنظیمات موجود برای تمام نواحی:

sudo firewall-cmd --list-all-zones

نمونه خروجی

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:

کار با سرویس‌ها

ابزار FirewallD می‌تواند بر اساس قواعد از پیش‌ تعریف شده برای سرویس‌های شبکه خاص، اجازه ورود ترافیک را بدهد. شما می‌توانید خودتان قواعد سفارشی سرویس‌ها را بسازنید و آنها به هر کدام از نواحی اِعمال کنید. فایل‌های تنظمیات برای سرویس‌های پیش‌فرض در /usr/lib/firewalld/services  و فایل تنظیمات سرویس‌های که توسط کاربر تعریف شده‌اند، در آدرس /etc/firewalld/services قرار گرفته‌اند.

برای مشاهده سرویس‌های در دسترس پیش‌فرض از فرمان زیر استفاده کنید.

sudo firewall-cmd --get-services

مثالی برای فعال و غیرفعال‌کردن سرویس HTTP

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --remove-service=http --permanent

مجوّز یک پورت یا پروتکل دلخواه

به عنوان مثال، برای دادن مجوّز یا لغو مجوّز ترافیک به پورت 12345 داریم:

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

ارجاع پورت

مثال زیر، ارجاع ترافیک پورت 80 را به پورت 12345 در همان سرور نشان می‌دهد.

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

برای هدایت ترافیک یک پورت به یک سرور متفاوت، به روش زیر عمل می‌شود.

۱) فعال‌کردن حالت پوشش‌گذاری یا masquerade در یک ناحیه دلخواه

sudo firewall-cmd --zone=public --add-masquerade

۲) اضافه‌کردن قاعده ارجاع. در این مثال، ترافیک پورت محلی 80 به پورت 8080 در یک سرور ریموت در آدرس IP برابر 198.51.100.0 هدایت می‌شود.

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.51.100.0

برای حذف قاعده می‌توانید –add را با –remove جایگزین کنید. به عنوان نمونه:

sudo firewall-cmd --zone=public --remove-masquerade

ایجاد یک سری قواعد یا Ruleset با ابزار FirewallD

به عنوان یک مثال، در اینجا از ابزار FirewallD برای اضافه‌کردن قواعد پایه به سرور استفاده می‌کنیم.

ناحیه dmz را به عنوان ناحیه پیش‌فرض به eth0 اضافه کنید. این ناحیه به عنوان بهترین گزینه برای شروع کار با اپلیکیشن FirewallD  محسوب می‌شود؛ چرا که تنها به پروتکل‌های SSH و ICMP اجازه ورود می‌دهد.

sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0

اضافه کردن قاعده همیشگی سرویس برای HTTP و HTTPS برای ناحیه dmz

sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent

حالا باید ابزار FirewallD را دوباره راه‌اندازی کنید تا تغییرات اِعمال شوند.

sudo firewall-cmd --reload

اگر فرمان firewall-cmd –zone=dmz –list-all را اجرا کنید، احتمالاً با خروجی زیر مواجه می‌شوید.

dmz (default)
interfaces: eth0
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

این خروجی به ما می‌گوید که ناحیه 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

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.0.2.0 accept'

مسدود کردن ترافیک IPv4 از طریق TCP از هاست 192.0.2.0 به پورت 22

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject'

اجازه ترافیک IPv4 از طریق TCP از هاست 192.0.2.0 به پورت 80  و ارجاع آن به پورت 6532

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'

ارجاع تمام ترافیک IPv4 در پورت 80 به پورت 8080 در هاست 198.51.100.0 (پوشش‌گذاری یا masquerade باید در ناحیه فعال شود).

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'

برای مشاهده تمام قواعد Rich Rules در ناحیه public داریم:

sudo firewall-cmd --zone=public --list-rich-rules

رابط کاربری مستقیم iptables

برای کاربران حرفه‌ای iptables، ابزار FirewallD یک رابط کاربری مستقیم ارائه کرده که اجرای فرمان‌های خام iptables را فراهم می‌کند. این قواعد به صورت همیشگی نخواهند بود؛ مگر اینکه با گزینه –permanent همراه شوند.

برای مشاهده تمام زنجیره‌ها یا قواعد اضافه‌شده به FirewallD از فرمان‌های زیر استفاده کنید.

firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules

البته موضوع قالب‌های iptables  در ابزار FirewallD فراتر از بحث آموزشی در این مطلب است و شاید بخواهید از منابع زیر نیز برای اطلاعات بیشتر کمک بگیرید.

سایت رسمی FirewallD

راهنمای امنیتی RHEL 7

راهنمای FirewallD در فدورا