مقدمه‌ای بر Firewalld

 

 

 

در بعضی موقعیت‌ها استفاده از firewalld بر روی سیستم‌های systemd از مدیریت و پیکربندی iptableها راحت تر است. برای بیشتر بخش‌ها دیگر به یادگیری و به خاطر سپردن پرش‌ها، قبول کردن‌ها و رد کردن‌ها نمی‌باشید. قوانین راه‌اندازی firewalld بسیار ساده‌تر و در دسترس تر می‌باشند. اما همزمان این مورد باعث نمی‌شود که به قدرت و امکانات iptables دسترسی نداشته باشید.

firewalld از یک کامندلاین با نام firewall-cmd  برای پیکربندی و تغییر قوانین استفاده می‌کند. قبل از اینکه firewalld را پیکربندی کنیم نیاز است که مطمئن شویم سرویس درحال اجراست، با استفاده از دستور systemctl شما سرویس firewalld را راه‌اندازی، متوقف، شروع، پایان یا راه‌اندازی مجدد می‌نمایید. متاسفانه برای تمامی استفاده‌های ذکر شده هیچ خروجی متفاوتی توسط systemctl نمایش داده نمی‌شود که بتوان میان آن‌ها تمایز قائل شد. پس نیاز است که بعد از هربار استفاده از این دستور از وضعیت firewalld آگاه شوید.

Systemctl و Firewalld

فعال‌سازی Firewalld

برای اینکه مطمئن شوید firewalld بصورت اتوماتیک با سرور راه‌اندازی شده از دستور زیر استفاده نمایید.

systemctl enable firewalld

شروع firewalld

بعد از اینکه firewalld فعال شد، نیاز است که برای بار اول آن را راه‌اندازی(شروع یا استارت) نماییدو برای این کار نیاز است که از دستور زیر استفاده نمایید:

systemctl start firewalld

توقف firewalld

زمانی که به اصلاح قوانین یا رفع اشکال اتصالات(کانکشن‌ها) می‌پردازید لازم است که firewalld را متوقف کنید، برای منظور می‌توانید از دستور زیر استفاده نمایید.

systemctl stop firewalld

راه‌اندازی مجدد firewalld

اگر به هر دلیلی مجبور شدید تا firewalld را راه اندازی مجدد نمایید می‌توانید از دستور زیر در systemctl  استفاده نمایید:

systemctl restart firewalld

وضعیت firewalld

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

systemctl status firewalld

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

[root@centos-7 ~]# 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 Tue 2019-01-22 22:50:32 EST; 1h 0min ago
Main PID: 808 (firewalld)
CGroup: /system.slice/firewalld.service
└─808 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

مدیرت firewalld و پیکربندی آن

حال که با دستورات ابتدایی اجرایی firewalld آشنا شدیم و firewalld خود را راه‌اندازی نمودیم‌ میتوانیم به مبحث مدیریت و پیکربندی firewalld بپردازیم بعنوان مثال یک پورت را باز کینم، به سرویس‌ها اجازه فعالیت دهیم، IPها را در لیست سفید قرار دهیم و کارهایی از این قبیل. در تمامی این مثال‌ها ما از پرچم یا فلگ –permanent استفاده می‌کنیم این مهم به این معنی است که قانون وضع شده شما ذخیره می‌گردد حتی بعد از راه اندازی مجدد Firewalld یا ریبوت کردن سرور. بعد از اضافه کردن قوانین جدید لازم است که شما firewall خود را راه اندازی مجدد نمایید تا قوانین جدید اجرا شوند.

اضافه کردن پورت برای UDP یا TCP

برای اضافه کردن یا باز کردن یک پورت در UDP یا TCP نیاز است تا به صورت جداگانه آن دستورات را برای هر نوع پروتکل اجرا نمایید:

firewall-cmd --permanent --add-port=22/TCP

firewall-cmd --permanent --add-port=53/UDP

حذف کردن پورت برای UDP یا TCP

دستور زیر که برای حذف یا بستن یک پورت در پروتکل‌های ذکر شده کاربرد دارد بسیار شبیه به دستورات بالاست با تفاوتی اندک:

firewall-cmd --permanent --remove-port=444/tcp

اضافه کردن سرویس

سرویس‌ها به صورت پیشفرض از پورت‌هایی که در بخش /etc/services پیکربندی شده استفاده می‌نمایند، اما اگر نیاز دارید تا از پورتی خارج از پورت‌های پیش‌فرض برای سرویس‌های خود استفاده نمایید باید آن پورت را باز کنید برای این منظور می‌توانید از دستور زیر استفاده نمایید:

firewall-cmd --permanent --add-service=ssh

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

حذف کردن یک سرویس

با دستور زیر می‌توانید یک سرویس و پورت گشوده شده برای آن را پاک کنید/ ببندید:

firewall-cmd --permanent --remove-service=mysql

اضافه کردن یک IP به لیست سفید

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

firewall-cmd --permanent --add-source=192.168.1.100

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

firewall-cmd --permanent --add-source=192.168.1.0/24

 

حذف کردن یک IP از لیست سفید

برای حذف کردن یک IP یا یک رنج IP می‌توانید از –remove-source مانند مثال زیر استفاده کنید:

firewall-cmd --permanent --remove-source=192.168.1.100

بلاک کردن یک IP

به صورت عمومی firewall-cmd برای اجازه دسترسی و بلاک کردن دسترسی استفاده می‌شود و یکی از بیشترین استفاده‌ها نیز بلاک کردن دسترسی یک IP است برای این منظور ما نیاز به rich rule داریم که بسیار شبیه به قوانینی است که برای iptable استفاده می‌کنیم:

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject"

برای بلاک کردن یک رنج IP نیز همانند بالا می‌توانیم از دستور CIDR زیر استفاده کنیم:

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"

اضافه کردن یک IP به لیست سفید در یک پورت مشخص

برای این عمل نیاز به اعمال قوانین بیشتر یا rich rule بیشتر می‌باشد، برای این منظور باید به iptable برگردیم و از قوانین خود استفاده نماییم و در پایان از accept استفاده می‌کینم تا IP به لیست سفید افزوده گردد نه اینکه reject شود.

firewall-cmd --permanent --add-rich-rule='rule family="ipv4"
source address="192.168.1.100" port protocol="tcp" port="3306" accept'

حذف یک Rich Rule

برای حذف یک rich rule از آپشن —remove-rich-rule استفاده می‌نماییم هرچند که در این فرایند باید مشخص نمایید که چه قانونی قرار است حذف گردد، توصیه ما کپی کردن و پیست کردن کامل آن قانون است تا انکه آن را تایپ نمایید زیر ممکن است آن را کامل به یاد نیاورید و دچار مشکل شوید:

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4"
source address="192.168.1.100" port protocol="tcp" port="3306" accept'

ذخیره قوانین Firewall

بعد از اینکه تمامی قوانین مورد نظر خود را اضافه نمودید و تصمیمی گرفتید که آنها را اجرایی کنید نیاز است که فایروال خود را بار دیگر راه‌اندازی نمایید برای این منظور باید دستور زیر را با firewall-cmdاجرا نمایید.

firewall-cmd --reload

مشاهده قوانین firewall

بعد از اینکه فایروال را راه‌اندازی مجدد نمایید بهتر است که مطمئن شویم تمامی قوانین مورد نظر ما در جای خودشان قرار گرفتته‌اند برای این منظور می‌توان از دستور زیر استفاده نمود:

firewall-cmd --list-all

مثال زیر یک نمونه از خروجی آپشن –list-all می‌باشد، در مثال زیر می‌توانید پورت‌ها، rich ruleها و سرویس‌های باز را مشاهده نمایید.

[root@centos-7 ~]# firewall-cmd --list-all
public (default, active)
interfaces: enp1s0
sources: 192.168.1.0/24
services: dhcpv6-client dns http https mysql nfs samba smtp ssh
ports: 443/tcp 80/tcp 5900-5902/tcp 83/tcp 444/tcp 3260/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.1.0/24" forward-port port="5423" protocol="tcp" to-port="80"

پیکربندی Firewalld به صورت تصویری

اگرچه مطلب نوشته شده تمرکزش بیشتر بر روی اجرای دستورات و استفاده از firewall-cmd بود اما راه دیگر ایجاد قوانین و اجرای دستورات استفاده از رابط گرافیکی firewalld می‌باشد که می‌توانید آن را در قسمت Applications > Sundry در CentOS 7 و RedHat 7.x پیدا کنید. برای نصب این رابط گرافیکی می‌توانید از دستور زیر استفاده نمایید:

sudo yum install firewall-config

 

FIREWALLD

با استفاده از بخش utility می‌توانید rich rule های متفاوت و پیچیده‌ای را ایجاد نمایید، که این کار با استفاده از کامندلاین بسیار پیچیده تر است. باید توجه داشته باشید که حتی در رابط گرافیکی نیز برای ایجاد قوانین نیاز است از آپشن permanent استفاده شود.

 

firewalld permanent option

قوانین مستقیم Firewalld

قوانین مستقیم نوعی از قوانین هستند که به صورت مخصوصی از دیگر قوانین جدا شده‌اند، برای این هستند که به صورت مستقیم با firewall ارتباط برقرار شود این قوانین را می‌توانید در فایلی به آدرس /etc/firewalld/direct.xml  ویرایش نمایید. هرچند این قوانین نیز مانند دیگر قوانین نیاز است که فایروال برای اجرای این قوانین راه اندای دوباره گردد. این قوانین مانند rich  ruleها یا قوانین iptables  می‌باشند فقط در یک فایل XML نوشته شده‌اند. رابط کاربری قوانین مستقیم بیشتر توسط سرویس‌‍ها و اپلیکیشن‌ها برای اضافه کردن قوانین مخصوصی استفاده می‌گردد. در مثال زیر تعدای IP را می‌بینید که برخلاف لیست سیاه می‌باشند و به فایروال می‌گوید که با بررسی IPها و مچ شدن با آن‌ها کانکشن را قطع نماید، باید توجه داشت که شما می‌توانید برای اضافه کردن قوانین مستقیم از firewall-cmd استفاده نمایید اما باید در انتهای دستور از –direct استفاده نمایید.

<?xml version="1.0" encoding="utf-8"?>
<direct>
<chain ipv="ipv4" table="raw" chain="blacklist"/>
<rule ipv="ipv4" table="raw" chain="PREROUTING" priority="0">-s 192.168.1.0/24 -j blacklist</rule>
<rule ipv="ipv4" table="raw" chain="PREROUTING" priority="1">-s 192.168.5.0/24 -j blacklist</rule>
<rule ipv="ipv4" table="raw" chain="blacklist" priority="0">-m
limit --limit 1/min -j LOG --log-prefix "blacklisted: "</rule>
<rule ipv="ipv4" table="raw" chain="blacklist" priority="1">-j DROP</rule>
</direct>