بلاگ/معرفی ابزار FirewallD در لینوکس CentOS
به‌روز شده

معرفی ابزار FirewallD در لینوکس CentOS

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

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

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

ابزار FirewallD به صورت پیش‌فرض در سیستم‌عامل لینوکس CentOS 7 وجود دارد، امّا به صورت غیرفعال است. کنترل آن همانند سایر بخش‌های systemd خواهد بود. برای شروع سرویس و فعال‌کردن FirewallD  در هنگام شروع به کار سیستم داریم:
php
sudo systemctl start firewalldsudo systemctl enable firewalld
همچنین برای توقف و غیرفعال‌کردن این سرویس از فرمان‌های زیر استفاده می‌شود.
php
sudo systemctl stop firewalldsudo systemctl disable firewalld
وضعیت فایروال را بررسی کنید. خروجی باید نشان دهد که این سرویس در حال اجراست یا خیر.
php
sudo firewall-cmd --state
برای مشاهده وضعیت ابزار FirewallD داریم:
php
sudo systemctl status firewalld
نمونه خروجی
php
firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)Active: active (running) since Thu 2019-08-08 15:11:24 IST; 23h agoDocs: man:firewalld(1)Main PID: 2577 (firewalld)CGroup: /system.slice/firewalld.service└─2577 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
برای بارگذاری دوباره تنظیمات ابزار FirewallD، فرمان زیر را تایپ کنید.
php
sudo firewall-cmd --reload

تتظیمات 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 --permanentsudo firewall-cmd --zone=public --add-service=http
۲) اضافه‌کردن قاعده به سری تنظیمات همیشگی و راه‌اندازی دوباره ابزار FirewallD
php
sudo firewall-cmd --zone=public --add-service=http --permanentsudo firewall-cmd --reload
نکته فرمان reload تمام تنظیمات جاری و لحظه‌ای را حذف  و تنظیمات همیشگی را اِعمال می‌کند. البته به دلیل دینامیک‌بودن مدیریت firewalld، وضعیت‌ها و ارتباطات کنونی با خلل روبرو نمی‌شوند.

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

ناحیه‌ها یا زون‌ها یک سروی قواعد از پیش‌ تعیین شده برای سطوح مختلف اطمینان هستند و برای برخی نقاط یا سناریوهای خاص استفاده می‌شوند نواحی مختلف به سرویس‌ها و انواع مختلف ترافیک‌ها اجازه ورود می‌دهند و در مقابل، هر چیز ورودی دیگر را می‌گیرند. بعد از فعال‌سازی ابزار FirewallD برای اولین بار، ناحیه پیش‌فرض “Public” خواهد بود. همچنین زون‌ها را می‌توان به رابط‌های کاربری مختلف شبکه اِعمال کرد. به عنوان مثال، در صورتی که دو رابط کاربری جداگانه برای شبکه داخلی و اینترنت وجود داشته باشد، می‌توانید به پروتکل DHCP در شبکه داخلی اجازه ورود بدهید، ولی در ناحیه خارجی تنها HTTP و SSH مجوّز داشته باشند. هر رابط کاربری که برایش یک ناحیه خاص تعیین نشده باشد، به ناحیه پیش‌فرض خواهد پیوست. برای مشاهده ناحیه پیش‌فرض داریم:
php
sudo firewall-cmd --get-default-zone
برای تغییر ناحیه پیش‌فرض، از فرمان زیر استفاده می‌شود.
php
sudo firewall-cmd --set-default-zone=internal
برای دیدن نواحی مورد استفاده رابط یا رابط‌های کاربری شبکه:
php
sudo firewall-cmd --get-active-zones
نمونه خروجی
php
publicinterfaces: eth0
برای دریافت تمام تنظیمات موجود برای یک زون خاص، فرمان زیر را تایپ کنید.
php
sudo firewall-cmd --zone=public --list-all
نمونه خروجی
php
public (active)target: defaulticmp-block-inversion: nointerfaces: eth0sources:services: ssh dhcpv6-client httpports: 12345/tcpprotocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:
و برای دریافت تمام تنظیمات موجود برای تمام نواحی:
php
sudo firewall-cmd --list-all-zones
نمونه خروجی
php
trustedtarget: ACCEPTicmp-block-inversion: nointerfaces:sources:services:ports:protocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:...worktarget: defaulticmp-block-inversion: nointerfaces:sources:services: ssh dhcpv6-clientports:protocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:

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

ابزار FirewallD می‌تواند بر اساس قواعد از پیش‌ تعریف شده برای سرویس‌های شبکه خاص، اجازه ورود ترافیک را بدهد. شما می‌توانید خودتان قواعد سفارشی سرویس‌ها را بسازنید و آنها به هر کدام از نواحی اِعمال کنید. فایل‌های تنظمیات برای سرویس‌های پیش‌فرض در /usr/lib/firewalld/services  و فایل تنظیمات سرویس‌های که توسط کاربر تعریف شده‌اند، در آدرس /etc/firewalld/services قرار گرفته‌اند. برای مشاهده سرویس‌های در دسترس پیش‌فرض از فرمان زیر استفاده کنید.
php
sudo firewall-cmd --get-services
مثالی برای فعال و غیرفعال‌کردن سرویس HTTP
php
sudo firewall-cmd --zone=public --add-service=http --permanentsudo firewall-cmd --zone=public --remove-service=http --permanent

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

به عنوان مثال، برای دادن مجوّز یا لغو مجوّز ترافیک به پورت 12345 داریم:
php
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanentsudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

ارجاع پورت

مثال زیر، ارجاع ترافیک پورت 80 را به پورت 12345 در همان سرور نشان می‌دهد.
php
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
برای هدایت ترافیک یک پورت به یک سرور متفاوت، به روش زیر عمل می‌شود. ۱) فعال‌کردن حالت پوشش‌گذاری یا masquerade در یک ناحیه دلخواه
php
sudo firewall-cmd --zone=public --add-masquerade
۲) اضافه‌کردن قاعده ارجاع. در این مثال، ترافیک پورت محلی 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
برای حذف قاعده می‌توانید –add را با –remove جایگزین کنید. به عنوان نمونه:
php
sudo firewall-cmd --zone=public --remove-masquerade

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

به عنوان یک مثال، در اینجا از ابزار FirewallD برای اضافه‌کردن قواعد پایه به سرور استفاده می‌کنیم. ناحیه dmz را به عنوان ناحیه پیش‌فرض به eth0 اضافه کنید. این ناحیه به عنوان بهترین گزینه برای شروع کار با اپلیکیشن FirewallD  محسوب می‌شود؛ چرا که تنها به پروتکل‌های SSH و ICMP اجازه ورود می‌دهد.
php
sudo firewall-cmd --set-default-zone=dmzsudo firewall-cmd --zone=dmz --add-interface=eth0

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

php
sudo firewall-cmd --zone=dmz --add-service=http --permanentsudo firewall-cmd --zone=dmz --add-service=https --permanent
حالا باید ابزار FirewallD را دوباره راه‌اندازی کنید تا تغییرات اِعمال شوند.
php
sudo firewall-cmd --reload
اگر فرمان firewall-cmd --zone=dmz --list-all را اجرا کنید، احتمالاً با خروجی زیر مواجه می‌شوید.
php
dmz (default)interfaces: eth0sources:services: http https sshports:masquerade: noforward-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

php
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

php
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

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'

ارجاع تمام ترافیک 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'
برای مشاهده تمام قواعد Rich Rules در ناحیه public داریم:
php
sudo firewall-cmd --zone=public --list-rich-rules

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

برای کاربران حرفه‌ای iptables، ابزار FirewallD یک رابط کاربری مستقیم ارائه کرده که اجرای فرمان‌های خام iptables را فراهم می‌کند. این قواعد به صورت همیشگی نخواهند بود؛ مگر اینکه با گزینه --permanent همراه شوند. برای مشاهده تمام زنجیره‌ها یا قواعد اضافه‌شده به FirewallD از فرمان‌های زیر استفاده کنید.
php
firewall-cmd --direct --get-all-chainsfirewall-cmd --direct --get-all-rules
البته موضوع قالب‌های iptables  در ابزار FirewallD فراتر از بحث آموزشی در این مطلب است و شاید بخواهید از منابع زیر نیز برای اطلاعات بیشتر کمک بگیرید. سایت رسمی FirewallDراهنمای امنیتی RHEL 7راهنمای FirewallD در فدورا