ابزار FirewallD یک پوسته کنترلی برای iptables است که برای ایجاد قوانین ثابت ترافیک شبکه استفاده میشود. این ابزار که آن را میتوان هم از طریق خط فرمان و هم از طریق رابط کاربری گرافیکی به کار گرفت، در منابع بسیاری از توزیعهای لینوکس در دسترس قرار میگیرد. کار با ابزار FirewallD نسبت به استفاده مستقیم از iptables، دارای دو تفاوت اساسی است.
- ابزار FirewallD به جای زنجیره و قوانین، از نواحی (zones) و سرویسها استفاده میکند.
- مدیریت مجموعه قوانین به صورت دینامیکی و پویاست. به این معنا که بدون خلل در وضعیت و اتصال کنونی، اجازه بروزرسانی را میدهد.
نکته: FirewallD یک پوسته برای iptables است که موجب سادهتر شدن مدیریت قوانین آن میشود. بنابراین، جایگزینی برای iptables محسوب نمیشود. البته هنوز هم میتوان از فرمانهای iptables در ابزار 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 فراتر از بحث آموزشی در این مطلب است و شاید بخواهید از منابع زیر نیز برای اطلاعات بیشتر کمک بگیرید.