نحوه مدیریت و استفاده از FirewallD در CentOS7

FirewallD یک راهکار مدیریت دیوار آتش برای اکثر توزیع های لینوکس است که به عنوان یک رابط کاربری برای iptables عمل می کند.

در این آموزش، نحوه استفاده از دستورات مدیریتی firewall-cmd را به شما آموزش خواهیم داد.

آشنایی با مفاهیم اولیه FirewallD

قبل از بررسی دستورات، لازم است با برخی مفاهیم اولیه آشنا شویم:

منطقه – Zones

سرویس firewalld مجموعه ای از قوانین به نام zones را مدیریت میکند. این مناطق بصورت کلی تعیین می کنند که چه ترافیکی می بایست بر اساس سطح اعمتادی که شما به شبکه های متصل به سیستم خود دارید رد و بدل شوند. کارت های شبکه به مناطق مورد نظر شما متصل می شوند تا رفتار ترافیکی توسط دیوار آتش کنترل شود.

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

بدون در نظر گرفتن اینکه چقدر محیط شبکه شما پویا است، دانستن و آشنا شدن با این ایده هایی که برای طراحی firewalld در نظر گرفته شده است امری ضروری است. به ترتیب در شبکه های پیشفرض تعریف شده از “کمترین میزان اعتماد” تا “بیشترین میزان اعتماد” مناطق زیر تعریف شده اند:

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

منطقه block: مانند مورد فوق با این تفاوت که اتصال های ورودی با پیام icmp-host-prohibited یا icmp6-adm-prohibited رد (reject) می شوند.

منطقه public: به عنوان شبکه عمومی و نا مطمئن. شما به سیستم های کامپیوتری موجود اعتمادی ندارید و صرفا ممکن است اجازه اتصال های ورودی را بر اساس مورد به مورد بدهید.

منطقه external: شبکه های خارجی در مواقعی که شما از فایروال به عنوان gateway خود استفاده می کنید. در اصل بصورت NAT masquerading به سمت شبکه داخلی شما متصل شده است و به همین منظور شبکه داخلی شما خصوصی اما در دسترس خواهد بود.

منطقه internal: سمت دیگر external است، برای بخش داخلی gateway شما است. سیستم های موجود تقریبا قابل اعتماد هستند و برخی سرویس ها نیز در دسترس هستند.

منطقه dmz: جهت استفاده برای سیستم هایی که در DMZ (سیستم هایی در شبکه که به هسته اصلی شبکه شما دسترسی ندارند) وجود دارد. صرفا برخی اتصال های ورودی مجاز هستند.

منطقه work: برای سیستم های کاری در نظر گرفته شده اند، در حالی که شما به سیستم های اطراف خود اطمینان دارید و برخی سرویس ها نیز فعال هستند.

منطقه home: شبکه خانگی، در اصل شبکه ای که شما به اجزای آن اطمینان دارید و سرویس های بیشتری در دسترس هستند.

منطقه trusted: به تمامی سیستم های موجود در شبکه اطمینان دارید. باز ترین نوع منطقه موجود که می بایست با بررسی دقیق انتخاب شود.

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

دوام قوانین

در firewalld، قوانین تعریف شده می توانند به دو صورت “فوری” یا “دائمی” تعریف شوند. چنانچه یک rule اضافه شود و یا تغییر یابد، بصورت فوری رفتار فایروال تغییر می کند اما پس از ریستارت شدن سیستم قوانین قدیمی مجددا فعال می شوند و تغییرات از بین خواهند رفت.

اغلب دستورات firewall-cmd می توانند گزینه permanent– را به همراه داشته باشند. این گزینه مشخص می کند که پس از ریستارت شدن سیستم قانون تعریف شده مجددا فراخوانی شده و حذف نشود. این بدین معناست که شما می توانید قوانین را بصورت همزمان تست کنید و در صورتی که مشکلی برای شما پیش آمد با یک ریستارت قانون تعریف شده را حذف کنید. همچنین استفاده از تگ permamnet– به شما کمک می کند تا تعداد زیادی قوانین را تعریف کنید که پس از ریستارت سیستم اعمال شوند.

نصب و فعالسازی فایروال بر روی سیستم در زمان بوت شدن

نرم افزار firewalld بصورت پیشفرص بر روی برخی از توریع های لینوکس اعم از CentOS 7 وجود دارد. با این حال با استفاده از دستور زیر می توانید آن را نصب کنید:

$ sudo yum install firewalld

پس از نصب می توانید با استفاده از دستور زیر آن را در زمان بوت سیستم نیز فعال کنید. در یاد داشته باشید که با این دستور این سرویس در زمان بوت فعال می شود. بهترین روش این است که شما ابتدا تمامی قوانین موجود را تست کنید تا در صورت بروز اشکال در قوانین با مشکلات احتمالی روبرو نشوید.

$ sudo systemctl enable firewalld
$ sudo reboot

پس از ریستارت شدن سیستم، فایروال می بایست فعال شده، کارتهای شبکه در zone مربوطه قرار گرفته (و یا به تنظیمات پیشرفض برگردد) و سپس قوانین تعریف شده پردازش شوند.

با استفاده از دستور زیر می توانید وضعیت فایروال را بررسی کنید:

$ sudo firewall-cmd --state
output
running

این بدین معناست که فایروال فعال است و تنظیمات پیشرفض فعال است.

آشنایی با قوانین فعلی فایروال

قبل از شروع تغییرات ابتدا باید با شرایط و قوانین فعلی تعریف شده بر روی سرویس آشنا شوید.

مشاهده تنظیمات پیشرفض

برای مشاهده منطقه انتخاب شده فعلی دستور زیر را بزنید:

$ firewall-cmd --get-default-zone
output
public

از آنجایی که ما برای firewalld هنوز دستوراتی نزده ایم و بصورت پیشفرض است و هیچ یک از کارتهای شبکه ما به منطقه دیگری متصل کنید، تنها منطقه فعال همان مورد فوق است که کارتهای شبکه ما را کنترل می کند. جهت تایید میتوانید از دستور زیر استفاده کنید:

$ firewall-cmd --get-active-zones
output
public
interfaces: eth0 eth1

همانطور که میبینیم سرور ما دو کارت شبکه دارد که هر دو بصورت پیشفرض بر روی منطقه public تنظیم شده است.

چطور متوجه شویم که چه قوانینی برای منطقه عمومی تعریف شده است؟ با استفاده از دستور زیر میتوانید تمامی سرویس های فعال بر روی public zone را مشاهده کنیم:

$ sudo firewall-cmd --list-all
output
public (default, active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

همانطور که با استفاده از دستور قبلی هم دیدیم، هر دو کارت شبکه eth0 و eth1 به این zone متصل هستند. هرچند با این دستور میتوانیم ببینیم که سرویس DHCP Client و سرویس SSH بر روی این zone تعریف شده است.

مشاهده مناطق (zone) های دیگر

حالا ما اطلاعات کافی در مورد تنظیمات پیشفرض داریم، با استفاده از دستور زیر میتوانیم اطلاعات دیگر در خصوص zone های دیگر نیز به دست آوریم.

برای مشاهده لیست zone های موجود دستور زیر را بزنید:

$ firewall-cmd --get-zones
output
block dmz drop external home internal public trusted work

ما می توانیم تنظیمات انجام شده برای یک zone خاص را با اضافه کردن دستور =zone– به همراه list-all– مشاهده کنیم:

$ sudo firewall-cmd --zone=home --list-all
output
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

شما می توانید تمامی مناطق تعریف شده را با استفاده از list-all-zones– مشاهده کنید.

$ sudo firewall-cmd --list-all-zones | less

انتخاب یک منطقه – Zone برای کارت شبکه شما:

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

تغییر Zone بر روی کارت های شبکه

شما با استفاده از پارامتر =zone– به همراه =change-interface– می توانید تنظیمات را انجام دهید. همچنین برای دسترسی مدیریتی باید از sudo نیز استفاده کنید.

با استفاده از دستور زیر ما کارت شبکه eth0 را بر روی منطقه home تعریف می کنیم.

$ sudo firewall-cmd --zone=home --change-interface=eth0
output
success

نکته

توجه داشته باشید که با تغییر zone ممکن است یک سرویس فعال از کار بی افتد، برای مثال در صورت انتقال به شبکه home سرویس SSH در آن فعال است و شما قادر به ادامه کار هستند اما برخی منطقه ها بصورت پیشفرض SSH برای آنها فعال نیست و در صورت جابجایی به آن مناطق دسترسی شما به سرور قطع خواهد شد و قادر به اتصال مجدد به سرور نخواهید بود.

با استفاده از دستور زیر می توانید موفقیت آمیز بودن دستور فوق را بررسی کنید:

$ firewall-cmd --get-active-zones
output
home
interfaces: eth0
public
interfaces: eth1

تنظیم منطقه پیشفرض:

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

شما می توانید منطقه پیشفرض را با پارامتر =set-default-zone– تنظیم کنید. این دستور بلافاصله تمامی کارتهای شبکه را که منطقه ای برای آن تعریف نشده است را به شرح مورد نظر شما تغییر می دهد:

$ sudo firewall-cmd --set-default-zone=home
output
success

انتخاب قوانین برای برنامه های شما

بهترین روش برای تعریف قوانین فایروال تعریف آنها به عنوان نرم افزار است. راه کار آن به شرح ذیل است:

اضافه کردن یک سرویس برای منطقه های شما:

راحت ترین روش اضافه کردن سرویس و یا پورت مورد نظر شما برای مناطقی است که از آن استفاده می کنید، مجددا با دستور get-services– سرویس های فعال را دریافت کنید:

$ firewall-cmd --get-services
output
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 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

نکته

شما می توانید اطلاعات بیشتری در خصوص هر سرویس با مشاهده فایلهای xml. آن به دست آورید که در مسیر /usr/lib/firewalld/services قرار دارد. برای مثال سرویس SSH شامل موارد ذیل است:

 /usr/lib/firewalld/services/ssh.xml 
 
<?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>