همانطور که میدانید فایروال لینوکس iptables نام دارد که در سطح کرنل کار کرده و وظیفه کنترل ورودی – خروجی های سرور را بر عهده می گیرد. از آنجایی که کار با iptables نیاز به دانش بالایی دارد یک سرویس با نام firewalld در توزیع های مبتنی بر ردهت بوجود آمده که میتواند مدیریت دستورهای iptables را آسان نماید. در این آموزش ما قصد داریم به معرفی firewalld و نحوه کار با آن بپردازیم.
مفاهیم اولیه در firewalld
قبل از اینکه بخواهیم کار با دستور firewall-cmd را آموزش دهیم لازم است به معرفی کوتاه و اجمالی برخی مفاهیمی که سرویس firewalld در اختیار شما قرار میدهد بپردازیم.
Zones
سرویس firewalld مجموعه ای از دستورات iptables را در موجودیت هایی با نامه zone در کنار هم و در سطح کرنل به اجرا در می آورند. این سیاست های مجوزی همان دادن مجوزهای لازم یا گرفتن آن ها از شبکه کامپیوتر یا سرور شما می باشد. بر همین اساس هر zone میتواند با یک اینترفیس شبکه کار کند.
Zoneها معمولا در کامپیوترهای محلی و شخصی بیشتر مفهوم پیدا میکند. چرا که در این سیستم ها معمولا شما از شبکه های مختلفی استفاده میکند در حالی که روی سرور معمولا از یک اینترفیس خاص استفاده میشود و شاید کمتر نیاز به تعریف zoneهای مختلف و یا استفاده از آن ها باشد.
firewalld به صورت پیش فرض دارای تعدادی zone به صورت زیر می باشد:
- drop
- block
- public
- external
- internal
- dmz
- work
- home
- trusted
تفاوت همه این zone در سیاست های پیاده شده به صورت پیش فرض روی هر یک می باشد. بعنوان مثال drop وظیفه مسدود سازی هر نوع ترافیکی را بدون هیچ پاسخی دارد در حالی که block علاوه بر مسدود سازی ترافیک ورودی بسته ها را با پیام های icmp-host-prohibited یا icmp6-host-prohibited پاسخ میدهد. برای سرورهایی که خدمات عمومی ارائه میکنند public میتواند انتخاب مناسب تری باشد.
تنظیم rule ها به صورت دائمی
به صورت پیش فرض وقتی که شما دستور firewall-cmd را اجرا میکند سیاست های اعمال شده به صورت موقت تنظیم میشوند و با بوت مجدد سیستم یا سرویس مورد نظر از بین خواهند رفت. این امر میتواند موجب سردرگمی شما حین کار با سرور شود مگر اینکه سیاستی را بخواهید به طور موقت روی سرور اعمال کنید. شما میتوانید از سوئیچ permanent– استفاده کنید تا rule ها اعمال شده به صورت دائم روی سرور شما فعال شوند.
سایر فایروال های لینوکس:
طریقه نصب و فعال کردن firewalld
firewalld به صورت پیش فرض روی برخی توزیع های لینوکسی نصب شده است. همچنین برخی از نسخه های CentOS نیز آن را به صورت پیش فرض نصب شده دارند. اما اگر شما میخواهید آن را روی CentOS نصب کنید از دستور زیر استفاده نمائید:
1 |
[root@arshatech ~]# yum install firewalld |
این سرویس بعد از نصب و در صورتی که سرور را ریبوت نمائید غیرفعال خواهد شد.
برای اینکه آن را به حالت فعال ببرید از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# systemctl enable firewalld |
حال بعد از ریبوت(بدون ریبوت سرور نیز مشکلی پیش نخواهد آمد) خواهید دید که این سرویس وضعیت فعال خود را حفظ کرده است.
برای دیدن وضعیت فایروال میتوانید از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --state |
1 |
running |
خروجی دریافت شده به این معناست که فایروال روی سیستم فعال و در حال اجراست.
کار کردن با zone پیش فرض
بعد از فعال کردن فایروال شما میتوانید از وضعیت zone پیش فرض سرور خود مطلع شوید. برای اینکه بدانید zone پیش فرض شما چیست دستور زیر را وارد کنید:
1 |
[root@arshatech ~]# firewall-cmd --get-default-zone |
1 |
public |
حال در صورتی که میخواهید بدانید کدام zone برای شما فعال است از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --get-active-zones |
1 2 |
public interfaces: eno16777736 |
همانطور که مشاهده میکنید در مثال بالا zone فعال public نام دارد از روی اینترفیس eno16777736 فعال است.
حال برای اینکه بدانید چه rule هایی روی سرور شما فعال شده است از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --list-all |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public (active) target: default icmp-block-inversion: no interfaces: eno16777736 sources: services: dhcpv6-client ssh http ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: |
همانطور که میبینید در حال حاظر فایروال روی سرویس های ssh و http و dhcp فعال است.
بررسی سایر zoneها
اگر شما میخواهید بدانید چه zoneهایی روی سرور شما وجود دارند میتوانید از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --get-zones |
1 |
block dmz drop external home internal public trusted work |
همچنین اگر میخواهید تفاوت بین zoneها را در عمل بدانید و یا اینکه بدانید هر zone از چه سیاست هایی پیروی میکند میتوانید از سوئیچ =zone– استفاده کنید. بعنوان مثال اگر بخواهید بدانید که home دارای چه تنظیماتیست به صورت زیر عمل کنید:
1 |
[root@arshatech ~]# firewall-cmd --zone=home --list-all |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
home target: default icmp-block-inversion: no interfaces: sources: services: ssh mdns samba-client dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: |
اگر میخواهید به جزئیات همه zone ها یک جا پی ببرید از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --list-all-zones |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
block target: %%REJECT%% icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: dmz target: default icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ... |
تغییر اینترفیس های متصل به یک zone
گاهی شما میخواهید از یک اینترفیس خاص برای یک zone استفاده کنید. برای این کار میتوانید با معرفی zone و اینترفیس مورد نظر این کار را انجام دهید:
1 |
[root@arshatech ~]# firewall-cmd --zone=home --change-interface=eth0 |
1 |
success |
حال با دستور زیر وضعیت zoneهای فعال را بررسی میکنیم:
1 |
[root@arshatech ~]# firewall-cmd --get-active-zones |
1 2 3 4 |
home interfaces: eth0 public interfaces: eno16777736 |
تنظیم یک zone بعنوان پیش فرض
اگر میخواهید zone پیش فرض را تغییر دهید میتوانید با استفاده از دستور زیر این کار را انجام دهید:
1 |
[root@arshatech ~]# firewall-cmd --set-default-zone=home |
1 |
success |
افزودن سرویسی خاص به zone مربوطه
شما میتوانید به صورت زیر به لیستی از سرویس های در دسترس را مشاهده نمائید:
1 |
[root@arshatech ~]# firewall-cmd --get-services |
1 |
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server |
سرویس های در دسترسی در مسیر usr/lib/firewalld/services/ قرار دارند و شما میتوانید فایل های مربوط به هر سرویس را در مسیر مذکور بیابید. به عنوان مثال برای مشاهده محتویات سرویس ssh که توسط فایروال مدیریت میشود به صورت زیر عمل میکنیم:
1 |
[root@arshatech ~]# vim /usr/lib/firewalld/services/ssh.xml |
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> </service> |
اگر میخواهید سرویس مورد نظر خود را اضافه کنید از سوئیج =add-service– استفاده کنید.
1 |
[root@arshatech ~]# firewall-cmd --zone=public --add-service=http |
برای مشاهده سرویس های فعال در zone خاص نیز میتوانید از دستور زیر استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --zone=public --list-services |
1 |
dhcpv6-client ssh http |
اگر میخواهید به فرض مثال سرویس http بعد از ریبوت شدن سرور نیز در فایروال فعال باشد باید از سوئیچ permanent– استفاده کنید:
1 |
[root@arshatech ~]# firewall-cmd --zone=public --permanent --add-service=http |
همچنین شما میتوانید پورت خاصی را برای فایروال تعریف کنید. گاها ممکن است پیش بیاید که پورت خاصی را میخواهید ببندید یا باز کنید. یا مثلا میخواهید پورت ssh را از حالت پیش فرض به پورت دیگری ببرید. در این مواقع دیگر نباید سرویس ssh را به فایروال بدهید. در اینجا باید شماره پورت مورد نظر خود را وارد نمائید:
1 |
[root@arshatech ~]# firewall-cmd --zone=public --add-port=5000/tcp |
1 |
success |
حال میتوانید با دستور زیر همه پورت های تعریف شده برای فایروال را در zone مربوطه مشاهده کنید:
1 |
[root@arshatech ~]# firewall-cmd --zone=public --list-ports |
1 |
5000/tcp |
شما میتوانید رنجی از پورت ها را برای فایروال فعال کنید. برای این کار میتوانید به صورت زیر عمل نمائید:
1 |
[root@arshatech ~]# firewall-cmd --zone=public --permanent --add-port=4990-4999/udp |
1 |
success |
گاهی ممکن است شما بخواهید یک سرویس جدید برای فایروال معرفی کنید. برای این کار ابتدا به مسیر زیر بروید:
1 |
[root@arshatech ~]# cd /etc/firewalld/services/ |
سپس بر فرض مثال یک کپی از سرویس ssh بگیرید:
1 |
[root@arshatech ~]# cp ssh.xml test.xml |
سپس محتوای آن را به صورتی که مایل هستید تغییر دهید:
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>Test Service</short> <description>This is just a test service.</description> <port protocol="tcp" port="8787"/> <port protocol="udp" port="7676"/> </service> |
بعد از اضافه کردن سرویس مورد نظر باید firewalld را ریلود کنید:
1 |
[root@arshatech ~]# firewall-cmd --reload |
1 |
success |
حال در صورتی که لیست سرویس های در دسترس را مشاهده کنید خواهید دید که سرویس test نیز به آن ها اضافه شده است.
1 |
[root@arshatech ~]# firewall-cmd --get-services |
ایجاد یک zone اختصاصی
شما میتوانید به راحتی zoneهای دلخواه خود را ایجاد کنید. این کار با استفاده از دستور زیر ممکن خواهد بود:
1 |
[root@arshatech ~]# firewall-cmd --permanent --new-zone=testzone |
1 |
success |
حال در صورت دریافت لیست zoneها خواهید دید که testzone به لیست پیش فرض افزوده شده است:
1 |
[root@arshatech ~]# firewall-cmd --permanent --get-zones |
1 |
block dmz drop external home internal public testzone trusted work |
اما اگر از سوئیچ permanent– استفاده نکنید zone ایجاد شده نمایش داده نمیشود. پس برای اعمال شدن تغییرات باید حتما باید سرویس firewalld را ریلود نمائید:
1 |
[root@arshatech ~]# firewall-cmd --reload |
1 |
success |
پس خواهیم داشت:
1 |
[root@arshatech ~]# firewall-cmd --get-zones |
1 |
block dmz drop external home internal public testzone trusted work |
در ادامه و با دستورات گفته شده شما قادر خواهید بود zone جدید خود را بسازید و سرویس های مورد نظر را اضافه و یا از آن کم کنید. همچنین میتوانید اینترفیس مورد نظر خود را بر روی آن ست کنید و یا zone پیش فرض خود را بر روی zone ایجاد شده قرار دهید و سایر کارهایی که در این آموزش خدمت شما گفته شد.
2 دیدگاه
احمدزاده
بسم الله الرحمن الرحیم
از مطالب مفید شما تشکر می کنم.
به امید موفقیت های روز افزون شما،انشاالله.
ادمین
سلام و عرض ادب
تشکر ،آرزوی موفقیت برای شما داریم.