ابزار Firewalld یک فرمول مدیریتی فایروال برای بسیاری از توزیع‌های لینوکس شامل اوبونتو، دبیان، CentOS، RHEL و فدورا محسوب می‌شود. عملکرد این ابزار بر اساس سیستم فیلترینگ IP کرنل لینوکس است. همچنین ابزار Firewalld به صورت مستقل از پروتکل عمل می‌کند. به این معنا که از پروتکل‌های IPv4، IPv6، ethernet bridge ها و IP set ها پشتیبانی می‌کند.

مفاهیم پایه ابزار Firewalld

ابزار Firewalld به جای زنجیره و قوانین iptable ها، از مفهوم نواحی و سرویس‌ها استفاده می‌کند. نواحی یا Zone ها مجموعه‌ای از قوانین هستند که ترافیک‌های قابل‌قبول در شبکه را مشخص می‌کنند. این ترافیک بر اساس میزان اعتمادی که به کامپیوترهای شبکه دارید، تعیین می‌شود. رابط های کاربری شبکه یک ناحیه برای یک رفتار خاص تعریف می‌کنند. فایروال باید به این رفتار خاص اجازه فعالیت بدهد.

مدیریت ابزار FirewallD از طریق فرمان firewall-cmd امکان‌پذیر است. از طریق این فرمان می‌توانید به مدیریت تنظیمات آنی و همیشگی این ابزار بپردازید.

نواحی Firewalld

تعداد ۹ ناحیه از پیش تعریف‌شده در ابزار Firewalld وجود دارد. این نواحی سطح اعتماد به صورت صعودی مرتب می‌شوند. در ادامه، توضیح مختصری در مورد هر کدام از این نواحی ارائه می‌کنیم.

Drop: این ناحیه دارای کمترین سطح اعتماد است و برای چشم‌پوشی از تمام ترافیک‌های ورودی به کار می‌رود. در این حالت، هیچ‌گونه پیامی مبنی بر قدردانی به فرستنده ارسال نمی‌شود.

Block: این ناحیه بسیار شبیه به Drop است. ترافیک ورودی پس زده می‌شود و در همین حال، فرستنده یک پیام دریافت می‌کند.

Public: ناحیه دارای مجوز ترافیک ورودی از برخی شبکه‌های پابلیک خاص.

External: این ناحیه زمانی استفاده می‌شود که سیستم شما به عنوان یک درگاه یا روتر عمل می‌کند.

Internal: مجموعه‌ای از قوانین که در کامپیوترهای یک شبکه داخلی خصوصی اِعمال می‌شود.

DMZ: این ناحیه یک مجموعه ایزوله از کامپیوترهای شبکه داخلی شماست که ممکن است از طریق سایر منابع داخلی قابل‌دسترسی نباشد.

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

Home: بسیاری از کامپیوترها در این ناحیه به یکدیگر اعتماد دارند. سطح اعتماد در اینجا بالاتر از ناحیه Work است.

Trusted: این ناحیه دارای بالاترین سطح اعتماد است. تمام کامپیوترها در شبکه مورد اعتماد هستند.

گام ۱) نصب ابزار Firewalld

Firewalld به صورت پیش‌فرض در بسیاری از سیستم‌عامل‌ها نصب می‌شود. ولی شاید برخی سیستم‌های سبک و جمع‌وجور آن را نصب نکنند. در هر صورت، نصب این ابزار از طریق فرمان زیر ممکن خواهد بود.


sudo yum install firewalld        # CentOS/RHEL 8/7/6

sudo dnf install firewalld        # Fedora and CentOS/RHEL 8

sudo apt install firewalld        # Ubuntu and Debian

پس از نصب ابزار  firewall، باید آن را راه‌اندازی کنید. همچنین باید آن را به گونه‌ای تنظیم کنید که پس از هر بار راه‌اندازی سیستم، فعال شود.


sudo systemctl start firewalld

sudo systemctl enable firewalld

برای بررسی وضعیت firewalld، از فرمان زیر کمک بگیرید.


systemctl status firewalld

و یا:


firewall-cmd –state

گام ۲) کار با نواحی و سرویس‌ها

در firewalld به صورت پیش‌فرض از ناحیه Public استفاده می‌شود. تمام رابط‌های کاربری شبکه با ناحیه public تنظیم شده‌اند. برای تهیه لیست نواحی پیش‌فرض، داریم:


firewall-cmd --get-default-zone

خروجی


public

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


firewall-cmd --get-active-zones

شما بایستی خروجی زیر را مشاهده کنید.


public

interfaces: eth0 eth1

برای اینکه لیست تمام نواحی در دسترس را ببینید، فرمان زیر را اجرا نمایید.


firewall-cmd --get-zones

خروجی چیزی شبیه به زیر خواهد بود.


block dmz drop external home internal public trusted work

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


firewall-cmd --list-all

شما باید خروجی‌ای مطابق زیر دریافت کنید.


public (active)

target: default

icmp-block-inversion: no

interfaces: eth0 eth1

sources:

services: cockpit dhcpv6-client ssh

ports:

protocols:

masquerade: no

forward-ports:

source-ports:

icmp-blocks:

rich rules:

برای اینکه ناحیه پیش‌فرض را از public به work تغییر دهیم، داریم:


firewall-cmd --set-default-zone=work

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


firewall-cmd --get-default-zone

خروجی


work

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


firewall-cmd --get-services

در این حالت، خروجی زیر را دریافت می‌کنید.


RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

گام ۳) تأییدیه ورودی در ابزار Firewalld

شما بر اساس سرویس‌های از پیش‌ تعریف‌شده در firewalld می‌توانید ترافیک ورودی را کنترل کنید. به عنوان مثال، برای دادن مجوّز به  تمام ترافیک ورودی سرویس http در ناحیه public، فرمان زیر را تایپ نمایید.


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

خروجی


success

برای تأیید ترافیک ورودی سرویس FTP در ناحیه public نیز از فرمان زیر استفاده می‌کنیم.


firewall-cmd --zone=public --add-service=ftp

خروجی


success

فرمان بالا سرویس‌های http و ftp را به صورت موقت اضافه می‌کند. به این معنا که پس از هر بار راه‌اندازی، دوباره باید این تنظیم را انجام دهید. در نتیجه، برای تنظیم همیشگی این سرویس‌ها باید از گزینه –permanent در فرمان استفاده کنید.


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

firewall-cmd --permanent --zone=public --add-service=ftp

حالا با استفاده از فرمان زیر، تغییرات صورت‌گرفته را به کار بگیرید.


firewall-cmd --reload

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


firewall-cmd --permanent --zone=public --list-services

شما باید خروجی‌ای مطابق زیر ببینید.


cockpit dhcpv6-client ftp http ssh

همچنین می‌توانید با استفاده از فرمان زیر، اطلاعات جزئی ناحیه public را بررسی نمایید.


firewall-cmd --info-zone public

خروجی


public (active)

target: default

icmp-block-inversion: no

interfaces: eth0 eth1

sources:

services: cockpit dhcpv6-client ftp http ssh

ports:

protocols:

masquerade: no

forward-ports:

source-ports:

icmp-blocks:

rich rules:

اگر بخواهید هر کدام از سرویس‌های بالا را در ابزار firewalld حذف و یا متوقف کنید، گزینه –remove-service در اختیار شماست.


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

firewall-cmd --permanent --zone=public --remove-service=ftp

در مرحله بعد، برای اِعمال تغییرات، فرمان زیر را اجرا کنید.


firewall-cmd --reload

گام ۴) تأیید پورت‌ها در Firewalld

امکان تأیید ترافیک ورودی به ابزار firewalld بر اساس پورت نیز وجود دارد. به عنوان مثال، اگر بخواهید به ترافیک ورودی از پورت‌های 8080 و 443 مجوّز بدهید، باید فرمان زیر را تایپ کنید.


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

firewall-cmd --permanent --zone=public --add-port=8080/tcp

سپس، برای ذخیره‌شدن تغییرات، فرمان زیر اجرا می‌شود.


firewall-cmd –reload

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


firewall-cmd --permanent --zone=public --list-ports

خروجی


443/tcp 8080/tcp

به همین ترتیب، حذف و توقف پورت‌های بالا در ابزار firewalld با استفاده از فرمان –remove-port انجام می‌شود.


firewall-cmd --permanent --zone=public --remove-port=443/tcp

firewall-cmd --permanent --zone=public --remove-port=8080/tcp

اکنون فرمان زیر را اجرا کنید تا تغییرات ذخیره شوند.


firewall-cmd --reload

گام ۵) فرآیند Port Forwarding در Firewalld

Port forwarding پروسه‌ای است که در آن  درخواست‌ها از IP یا پورت گرفته می‌شود و به یک IP یا پورت متفاوت منعکس می‌گردد. این تکنیک به سیستم‌های ریموت اجازه می‌دهد که در یک شبکه خصوصی، به یک سرویس خاص متصل شوند.

قبل از انجام تنظیمات port forwarding، باید ویژگی masquerade را در ناحیه دلخواهتان فعال کنید. این کار با استفاده از گزینه –add-masquerade ممکن خواهد بود.


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

سپس برای فوروارد کردن پورت 80 به پورت 8080 در همان سرور، از فرمان زیر استفاده کنید.


firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080

اگر بخواهید ترافیک پورت محلی 80 را به پورت 8080 در یک سرور ریموت با استفاده از آی‌پی 192.168.1.200 فوروارد کنید، باید فرمان زیر را اجرا کنید.


firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200

حالا فرمان زیر را اجرا کنید تا تغییرات اِعمال شوند.


firewall-cmd --reload

اگر میخواهید، قوانین بالا را لغو کنید، مطابق زیر، گزینه –add را با –remove جایگزین کنید.


firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200

firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080

جمع‌بندی

در مطلب آموزشی بالا، شما با مفاهیم پایه ابزار Firewalld آشنا شدید. همچنین نحوه به‌کارگیری این ابزار را در سیستم‌عامل لینوکس مشاهده کردید. امیدواریم که این مطلب مور استفاده شما قرار گرفته باشد و بتوانید ترافیک‌های غیرضروری را با استفاده از firewalld حذف کنید.