firewall

معرفی فایروال های لینوکس firewalld و iptables

معرفی iptables و firewalld:

سرویس های firewalld  و  iptables  هر دو فایروال های پیش فرض سیستم عامل ها و توزیع های مبتنی بر RedHat  میباشند و هر دو از بستر netfilter  استفاده میکنند. iptables نسخه ای سنتی و قدیمی تر از firewalld می باشد که در نسخه RHEL7 یا firewalld  جایگزین گردید. اما هر دو همچنان گستردگی استفاده خود را در دنیای لینوکس حفظ کرده اند.

هر دو ابزار با پشتیبانی IPv4 و IPv6  و پروتکل های TCP و UDP این امکان را فراهم میکنند تا امنیت سرور ها را در شبکه تا حد ممکن افزایش داده و از دسترسی های ناخواسته به سرور از طریق شبکه جلوگیری نمود.

نکته: در RHEL8 که اخیرا عرضه شده است، firewalld از بستر nftables به جای netfilter  استفاده میکند.

در ادامه مستند به نصب هر دو سرویس ، معرفی و پیکربندی هرکدام خواهیم پرداخت.

iptables:

همانطور که پیش تر اشاره شد، iptables بر اساس netfilter  پیاده سازی شده است و تا قبل از  RHEL7 به عنوان فایروال پیش فرض استفاده می شده است. ساختار iptables  بر اساس سه قسمت زیر است:

  • Tables
  • Chains
  • Rules

Tables:

جداول iptables برای برای دسته بندی گروهی از chain ها که هر کدامل شامل یک یا چند rule  میباشند مورد استفاده قرار میگیرند.جداول پیش فرض شامل 5 جدول به شرح زیر هستند:

  • filter: جدول پیشرفض مورد استفاده iptables است که برای فیلتر کردن پکت های ورودی و خروجی مورد استفاده قرار میگیرد.
  • nat: جدولی است که به منظور اعمال تنظیمات NAT مورد استفاده قرار میگیرد.
  • raw: در حالت عادی کرنل پکت ها را بر اساس State آنها ( یا جزئی از یک کانشن جدید هستند یا جزئی از یک کانکشن جاری و باز) بررسی میکند. این جدول این امکان را فراهم میکند تا با پکت ها قبل از این که کرنل بر اساس state  آنها اقدامی انجام دهد کارکرد.
  • mangle: از طریق این جدول میتوان تغییراتی را در header پکت ها ایجاد نمود. به عنوان مثال تغییر مقدار TTL در پکت های دریافتی. این عمل تحت عنوان packet mark نیز شناخته می شود.
  • security: برای مدیریت دسترسی از طریق متد MAC یا mandatory access control  می باشد.

Chains:

هر جدول شامل تعدادی chain هستند که هر کدام گروهی از rule  ها را در خود نگه میدارند. که میتوانند سیستمی باشند یا توسط کاربر ساخته شود.

سه chain  اصلی عبارتند از :

  • INPUT: برای مدیریت rule های مربوط به پکت های ورودی به سیستم به کار میرود.
  • OUTPUT: برای مدیریت rule های مربوط به پکت های خروجی از سیستم به کار میرود.
  • FORWARD: برای مدیریت پکت هایی که از طریق route در سیستم forward می شوند به کار میرود.

Rules:

مجموعه ای از قوانین هستند که درون chain  ها نگه داری می شوند و شامل matches و targets است. بدین معنی که بخشی از rule  ها بیانگر شروطی  و بخشی دیگر بیانگر عملی است که در صورت صادق شدن آن شروط باید انجام شود.

هنگامی که پکتی بررسی می شود، از ابتدای این لیست به ترتیب rule  ها بررسی می شوند تاmatch  اتفاق افتد. در صورتی که پکتی با قوانین موجود در لیست همخوانی داشته باشد، بر اساس قواعد target با آن برخورد می شود.

به عنوان مثال:

اگر پکتی از آدرس 192.168.200.150 و از طریق پورت 5050 پروتکل TCP وارد شد آنگاه آن را drop  کن.

در مثال بالا بخش اگر همان match و بخش آنگاه همان target  خواهد بود.

Matches:

شرایطی است که برای پکت ها در نظر گرفته می شود. در صورتی که این شرایط برای پکت همخوانی داشته باشد، iptables پکت را بررسی و قواعد target را بر آن اعمال میکند.

برخی از match ها به شرح زیر می باشند.

  • Source (-s): بیان گر مبدا پکت است که میتواند IP، رنج IP یا hostname باشد.
  • destination (-d): بیانگر مقصد پکت است می تواند ، رنج IP یا hostname باشد.
  • protocol (-p): بیانگر پروتکل پکت ورودی می باشد. مانند TCP یا UDP در صورتی که پروتکلی مشخص نشود، به صورت پیش فرض کلیه پروتکل های یا all در نظر گرفته می شود.
  • –in-interface (-i): بیانگر اینترفیسی است که پکت از آن دریافت می شود.
  • –out-interface (-o): بیانگر اینترفیسی است که پکت از آن خارج می شود.

Targets:

بیانگر اقدامی است که برای پکت در نظر گرفته می شود. target  با –j یا  –jump در انتهای دستور مشخص می شود. و چهار نوع دارد:

  • :Accept اجازه دسترسی یا عبور پکت را میدهد.
  • Drop: اجازه دسترسی به پکت یا عبور آن را نمیدهد و جوابی نیز به درخواست کننده نمی دهد.
  • Queue: پکت های دریافتی را صف بندی میکند.
  • Return: اگر rule دارای target برابر با return باشد، بررسی rule  های آن chain برای پکت متوقف می شود و پکت بر اساس رول های chain بالا دستی بررسی می شود ولی در صورتی که این rule در یکی از chain های اصلی وجود داشته باشد، پالیسی پیشرفض برای آن اعمال خواهد شد.

در صورتی که قصد اضافه کردن rule به chain  خاصی را داشته باشیم، از option با مقدار A- یا  append– و در صورتی که قصد حذف آن را داشته باشیم از option با مقدار D- یا delete– استفاده میکنیم.

دستورات iptables:

حال بعد از آشنایی با iptables، به بررسی چند دستور جهت آشنایی بیشتر با نحوه حذف و اضافه نمودن rule ها می پردازیم.

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

iptables -L

list rules

در صورتی که صرفا لیست rule  های یک chain  به خصوص مد نظر باشد نیز در انتهای دستور اسم chain را به صورت زیر وارد میکنیم.

iptables –L INPUT

list a chain

ایجاد Default policy:

در صورتی که پکتی با rule  های هیچ یک از chain  ها همخوانی نداشته باشد، نیاز است تا اقدامی به صورت پیش فرض برای آن در نظر گرفته شود. به عنوان نمونه اگر پکتی با هیچ rule خاصی همخوانی نداشت، آن را drop کنیم.دستور زیر سیاست پیش فرض را  قبول یا accept قرار خواهد داد.

iptables -t filter -P INPUT ACCEPT

و دستور زیر سیاست پیش فرض را بر رد درخواست با drop  قرار خواهد داد.

iptables -t filter -P INPUT DROP

ایجاد و حذف و جایگزین کردن  فیلتر:

در مثال های زیر با اضافه نمودن چند فیلتر به ساختار دستوری iptables  در حذف و اضافه کردن rule  ها خواهیم پرداخت.

 

  • مثال1: تمامی ترافیک های ورودی از یک ادرس را به سرور مسدود نمائیم. از آنجا که پروتکلی در دستور زیر مشخص نشده است، کل ترافیک ورودی از 192.168.200.200 به مقصد 192.168.200.201 مسدود خواهد شد.

 

 

iptables -A INPUT -s 192.168.200.200 -d 192.168.200.201 -j DROP
  • مثال2:  ترافیک SSH با دستور زیر فیلتر خواهد شد
iptables -A INPUT -s 192.168.200.200 -d 192.168.200.201 -p tcp --dport 22 -j DROP
  • مثال3: ترافیک ورودی و خروجی TCP بر روی پورت 22 برای اینترفیس en33  مورد قبول واقع می شود
iptables -A INPUT -p tcp -i ens33 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -o ens33 --sport 22 -j ACCEPT
  • مثال4: همانند مثال بالا با این تفاوت که چند پورت به صورت رنج معرفی گردیده است.
iptables -A INPUT -p tcp -i ens33 --dport 22:26  -j ACCEPT

در تمامی مثال های بالا rule هایی به chain های جدول filter  اضافه گردید. حال اگر قصد حذف rule وارد شده را داشته باشیم از همان دستور اما با option  برابر با D- استفاده می نمائیم.

iptables -D INPUT -s 192.168.200.200 -d 192.168.200.201 -j DROP

در صورتی که قصد داشته باشیم تمامی rule  های یک chain را حذف نمائیم از دستور زیر استفاه میکنیم.  در مثال زیر forward chain ازجدول filter تخلیه خواهد شد.

iptables  -F FORWARD

در صورتی که قصد داشته باشیم تمامی rule  های یک table  را پاک نمائیم از دستور زیر استفاده خواهد شد.

iptables  -t filter -F

نکته:

باید توجه داشت که ترتیب rule  های هر chain  مهم است. به عنوان نمونه در صورتی که خط اول INPUT برای پذیرش تمامی ترافیک ها و خط آخر برای عدم قبول ترافیک ICMP تنظیم شده باشد، ترافیک ورودی فقط با rule  اول match خواهد شد. لذا این ترتیب بندی ها میبایست در نظر گرفته شود.

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

iptables -L --line-numbers

rules line numbers

تا به اینجای کارrule اضافه شده در انتهای chain اضافه یا append  می شدند. در صورتی که قصد داشته باشیم rule در جای خاصی از جدول اضافه شود به جای –A از –I یا –insert استفاده مینمائیم. مانند دستور زیر

iptables -I INPUT 2 -s 192.168..199 -d 192.168.200.201 -p tcp --dport 22 -j DROP

insert rule

تفاوت این دستور با دستورات بالا در این است که علاوه بر استفاده از option   -I مبنی بر insert در جدول، بعد از اسم chain نیز با مشخص کردن شماره خط،  همانند شکل بالاrule  اضافه شده را در خط دوم  اضافه نمودیم.

حال که شماره rule ها در chain را در اختیار داریم، میتوانیم همانند دستور زیر، rule  های مورد نظر را به id یا شماره آنها حذف نمود.

iptables -D INPUT 2

delete by id

در نهایت اگر قصد داشته باشیم rule خاصی را replace  نماییم میتوانیم از option –R یا –replace استفاده وکنیم.

با دستور زیر rule  دوم از تصویر بالا را با rule  مورد نظر جایگزین می نمائیم.

iptables -R INPUT 2 -s 192.168.200.199 -d 192.168.200.201 -p tcp --dport 22 -j DROP

firewalld:

سرویس firewalld همانطور که پیشتر اشاره شد از نسخه RHEL7 جایگزین iptables   شد اما تا قبل از نسخه 8 از یک بستر استفاده میکردند. در firewalld از ابزاری به نام firewall-cmd برای ایجاد، جایگزینی و حذف rule  ها استفاده می شود. قبل از معرفی این ابزار برخی از مفاهیم firewalld را مورد بررسی قرار میدهیم.

Zones:

firewalld rule  ها را در مجموعه هایی به نام zone  مدیریت میکند. در واقع Zone  ها لیستی از rule  ها هستند که رفتار firewalld با ترافیک دریافتی اینترفیس ها از طریق آنها مشخص می شود.

Zone  های پیش فرض در firewalld به شرح زیر می باشند:

  • drop: کمترین میزان اعتماد در این zone وجود دارد. در این zone تمامی ترافیک های دریافتی بدون ارسال هیچ پاسخی drop خواهند شد و فقط ترافیک های خروجی مجاز خواهند بود.
  • block: همانند drop می باشد اما با خشونتی کمتر از آن. در این zone نیز تمامی ترافیک های ورودی drop می شوند اما در پاسخ به درخواست های ورودی، پیغامی مانند icmp-host-prohibited و یا icmp6-adm-prohibited  نیز ارسال می شود.
  • public: به نوعی بیانگر شبکه های عمومی و سطح امنیت و اعتماد کم در آن هاست. ترافیک های ورودی در این zone تماما بسه نمی شوند می میتوان بر اساس نیاز به آنها اجازه دسترسی داد.
  • external: در صورتی که قصد NAT کردن Private IP خود را داشته باشیم از این zone استفاده می نمائیم.
  • internal:  ترافیک های دریافتی در این zone قابل اعتماد تر هستند و برخی سرویس ها در این zone نیز ممکن است در دسترس باشند.
  • dmz: برای ایزوله کردن ترافیک از سایر آدرس هاش شبکه مورد استفاده قرار میگیرد و فقط ترافیک های خاصی امکان اتصال خواهند اشت.
  • work: بیشتر ترافیک های ورودی در این zone قابل اعتماد هستند و تعدادی کمی از سرویس ها نیز در آن فعال و در دسترس هستند.
  • home: برای محیط خانگی کاربرد دارد و تضور بر این است که تمام سیستم های شبکه اعتماد وجود دارد. سطح دسترسی از طریق سرویس های مختلف کمی بیشتر از home می باشد.
  • trusted: به تمام ماشین های داخل شبکه اعتماد کامل وجود دارد و کمترین محدودیت در ترافیک ها را اعمال میکند.

دریافت اطلاعات Zone ها:

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

Rule ها در firewalld یا به صورت آنی (immediate) و یا به صورت دائمی (permanent ) خواهند بود. در صورتی که تغییری در rule خاصی ایجاد شود یا rule جدیدی اضافه شود مادامی که به صورت دائمی ثبت نشوند موقت خواهند بود ودر بوت بعدی وجود نخواهند داشت.

اضافه کردن دائمی rule  و یا ایجاد تغییرات در آن ها با option –permanent صورت میپذیرد.

برای مشاهده لیست zone  ها و zone  پیش فرض از دو دستور زیر استفاده مینمائیم.

firewall-cmd get-zones
firewall-cmd --get-default-zone

zone list

در صورتی که قصد داشت هباشیم rule های هر zone  را مشاهده کنیم، میتوانیم از دستور زیر استفاده کنیم.

firewall-cmd --list-all  --zone=block

دستور بالا rule  های block zone  را به صورت زیر نمایش می دهد. در صورتی که اسم zone  مشخص نشود، rule های zone  پیشفرض نمایش داده می شود.

list rules insde a zone

در صورتی که قصد داشته باشیم اینترفیسی را به zone خاصی متصل کنیم، از دستور زیر استفاد می نماییم.

firewall-cmd  --zone=trusted --change-interface=ens33

assigne rule to interface

همانطور که در تصویر قابل مشاهده است، اینترفیس ens33 به trusted zone متصل گردید.

نکته مهم:

در هنگام انتقال اینترفیس ها باید مد نظر داشت که این تغییرات بر روی سرویس درحال کار تاثیر گزار خواهد بود. بدین صورت که اگر اینترفیسی از zone فعلی که دارای ارتباط ssh فعال است به zone دیگری که در آن ssh مسدود است منتقل شود ممکن است ارتباط قطع گردد. لذا در صورتی این تغییرات انجام شود که یا از عملیات مطمئن بوده یا دسترسی به سرور در صورت بروز مشکل فراهم باشد.

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

firewall-cmd --set-default-zone=home

اضافه کردن rule برای سرویس ها:

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

اطلاعات مرتبط با سرویس ها با نام همان سرویس در مسیر /usr/lib/firewalld/services و در فرمت xml قابل مشاهده هستند. برای دریافت لیستی از سرویس ها میتوان از دستور زیر استفاده کرد.

firewall-cmd --get-services

get-services

به عنوان نمونه درصورتی که بخواهیم سرویس ssh  را به public zone اضافه نمیایم به صورت زیر عمل خواهیم کرد.

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

و برای حذف سرویس نیز از remove-service– به صورت زیر استفاده خواهیم کرد.

firewall-cmd --zone=public  --remove-service=ssh

در صورتی که بخواهیم تغییرات به صورت دائمی ثبت شوند نیز میتوان مانند دستور زیر از –permanent  استفاه نمائیم.

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

در صورتی که سرویس مورد نظر در لیست سرویس های firewalld قرار نداشت میتوانیم با استفاده از فرمت xml یکی از سرویس ها سرویس مورد نظر خود را ایجاد نمائیم یا این که پورت مورد استفاده در سرویس مورد نظر را در firewalld و با دستور زیر اضافه نماییم.

با دستور زیر پورت 3550 بر روی پروتکل tcp به public zone  اضافه میگردد.

firewall-cmd --zone=public --add-port=3550/tcp

add port

همچنین در صورتی که بخواهیم رنجی از پورت ها را در این zone  اضافه کنیم نیز میتوانیم به صورت زیر این کار را انجام دهیم.

firewall-cmd --zone=public --add-port=3720-3725/tcp

در firewalld ویژگی دیگری به نام rich rule  وجود دارد که از طریق آن میتوان با جزئیات بیشتر اقدام به محدود کردن ترافیک ها نمود. به عنوان نمونه، هدایت کردن ترافیک یک پورت بر روی پورتی دیگر، ایجاد Whitelist، محدود کردن تعداد درخواست های ورودی و…

نمونه ای از rich rule به صورت زیر می باشد که در آن rule مورد نظر بر روی IPv4 و از مبدا 192.168.200.199 و برای سرویس http  فعال خواهد شد و تعداد درخواست ها در ساعت را برابر با 100  درخواست در ساعت قرار داده و در صورتی که شرایط مطرح شده در rule برقرار شود، آن را در فایل messages ثبت می نماید. در آموزشی مجزا به تشریح rich rule ها خواهم پرداخت.

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.200.199/32 service name=http log level=notice prefix="firewalld rich rule INFO: " limit value="100/h" accept'

نتیجه گیری:

در این مستند، به بررسی مفاهیم و ساختار دو فایروال مطرح و محبوب لینوکسی firewalld و iptables  پرداخته شد و سعی شد پس ایجاد آشنایی با دستورات هر دو سرویس، نحوه ایجاد، حذف و اضافه کردن rule ها و ایجاد یا رفع محدودیت در ترافیک های ورودی و خروجی را به صورت ابتدایی مورد بررسی قرار دهیم. حفظ امنیت سرور و جلوگیری از دسترسی ها و ایجاد ترافیک های ناخواسته در محیط های عملیاتی بسیار مهم و حیاتی می باشند در نتیجه آشنایی با این سرویس ها برای ایجاد امنیت هر چه بیشتربرای system administrator ها امری ضروری خواهد بود.

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