فایروال چیه و به چه دردی می خوره؟
برای اینکه ماهیت این سرویس رو درک کنید با یه مثال توضیحش می دیم. اگه سرورتون رو یک خونه در نظر بگیریم، لازمه که ورودی و خروجی هاشو مدیریت کنیم و اجازه ندیم از هرکسی از هر جایی که دوست داشت بیاد و بره. اینم در نظر داشته باشید که خونه شما ۶۵۵۳۵ ورودی و خروجی داره (تمام سیستم ها ۶۵۵۳۵ پورت دارن). وضیفه فایروال مدیریت پورت های سیستم هستش. شما با استفاده از این سرویس می تونید مشخص کنید که چه پورت هایی باز و چه پورت هایی بسته باشن و اگر هم قرار پورتی باز باشه، می تونید مشخص کنید که فقط برای آدرس خاصی باز باشه.
فایروال چه انواعی داره؟
به طور کلی فایروال ها در دو دسته سخت افزاری و نرم افزاری قرار دارن. از نظر منطقی هر دو یک کار رو انجام می دن اما در جاهای خیلی حساس که قراره فایروالشون خیلی درگیر باشه، از فایروال سخت افزاری استفاده می کنن و بار مدیریت دسترسی ها رو از روی سرور بر می دارن.
فایروال در لینوکس
در لینوکس ما یک سرویس پایه به نام netfilter داریم که در سطح کرنل کار مدیریت پورت های سیستم رو روی استک شبکه (Network Stack). کار با این ابزار به این سادگی ها نیست و دردسر های زیادی داره. به همین دلیل برنامه های نوشته شده که به عنوان رابط بین کاربر و این ماژول عمل می کنن. مهم ترین و پر کاربردترین فایروال های لینوکسی این زیر اومدن.
در ادامه این مقاله هر کدوم رو به صورت جدا بررسی می کنیم.
نکته: هیچ کدوم از این فایروال ها مخصوص توزیع خاصی نیستن و بر روی تمام توزیع های لینوکس کار می کنن.
۱.توضیح IpTables
۲. توضیح FirewallD
۳.توضیح UFW
توضیح اینکه IpTables چیه و چجوری کار می کنه؟
پیر تمام فایروال های لینوکسی همین ابزار هستش. بر پایه netfilter کار می کنه و بسیار قدرتمنده. به طور کلی شرکت های سرویس دهنده در سطح بزرگ از این ابزار استفاده می کنن چون انعطاف و قدرتی رو که این ابزار به کاربر می ده رو هیچ ابزار دیگه ای نمیده. لازمه اینو بدونید که با این ابزار کارهای زیادی می شه انجام داد و فقط محدود به مدیریت دسترسی های شبکه سیستم نیستش. کار باهاش ساده نیست اما اگه ساختارش رو یاد بگیرید می تونید خیلی خوب باهاش ارتباط برقرار کنید. این زیر معماری IpTables رو بررسی می کنیم:
به طور کلی خوبه بدونید که IpTables یک سری Table داره و تو هرTables یک سری Chain داره که تو هر Chain یه سری Rule داره. حالا اینایی که گفتیم یعنی چی؟
توضیح Table: یک جدول هستش که با توجه به کاری که شما می خاین انجام بدین قوانین رو دسته بندی می کنه. به طور پیش فرض این جدول ۴ زنجیر داره (Chain) که به شکل زیر هستن:
۱. توضیح Filter: تمام پکت های ورودی و خروجی سیستم باید از این جدول عبور کنن که مشخص بشه اجازه ورود یا خروج دارن یا نه. تو این مقاله ما فقط با همین بخش کار داریم.
۲. توضیح NAT: برای مشخص کردن مسیر ها و قوانین در یک شبکه NAT استفاده می شه.
۳.توضیح Mangle: اگه می خاین هدر پکت های سیستم رو تغییر بدین باید تو این جدول قوانینتون رو تعریف کنید.
۴. توضیح Raw: این جدول واسه اینه که یک سری پکت ها رو ازا هر قانونی خارج کنید (مصونیت قضایی داشته باشن).
توضیح Chain: زنجیر درواقع یک تعدادی قانون هستن که در جای مشترکی قرار اعمال بشن (مثل Input، output، Forward و …). تو این مقاله ما فقط با زنجیر های Input و output کار داریم.
توضیح Rule: بعد از اینکه پکت به سیستم می رسه و مشخص می شه باید تو کدوم جدول بره و بعد از چه زنجیری استفاده بشه، باید مشخص بشه که چه کاری باید باهاش کرد. قانون مشخص می کنه که با یه پکت باید چه کاری انجام بدیم. یه طور کلی یه قانون می تونه چهار کار با یه پکت بکنه:
۱. توضیح Accept: در این حالت فایروال قبول می کنه که پکت وارد سیستم بشه.
۲.توضیح Drop: بدون برگردوندن هیچ خطایی، پکت وارد سیستم نمی شه.
۳.توضیح Return: پکت بر می گرده به زنجیری که ازش اومده (باید قانون مناسبش رو یه جای دیگه پیدا کنه).
۴.توضیح Reject: پکت رد می شه و یه خطا به جایی که ازش اومده ارسال می شه.
کار با IpTables
برای شروع کار با این ابزار لازمه که روی سیستم نصبش کنید. در چند سال اخیر، IpTables به طور پیش فرض روی تمام توزیع های لینوکس نصب هستش.
قوانین IpTables در هر بار ریبوت سیستم پاک می شن. برای دایمی کردن قوانین فایروال بسته زیر رو نصب
کنید (جلوتر با هم می خونیم که چجوری می شه این کار رو کرد).
# apt install iptables-persistent
برای دیدن تمام قوانین موجود روی فایروال می تونید از دستور زیر استفاده کنید.
# iptables -L -v
فرمت کلی قوانین در IpTables به شکل زیر هستش:
# iptables [option] <chain> -i <interface> -p <protocol> -s <source address> --dport <port number.> -j <target>
توضیح اینکه Option چیه؟ مشخص می کنیم که می خایم این قانون رو چی کار کنیم.
شماره ۱: append -A-- قانون رو به انتهار زنجیر اضافه می کنه.
شماره ۲: -I --insert قانون رو در یک جای مشخصی از زنجیر اضافه می کنه.
شماره۳: -L --list تمام قوانین زنجیر رو نشون می ده.
شماره ۳: delete -D-- یک قانون مشخص رو حذف می کنه.
شماره ۴: flush -F-- تمام قوانین زنجیر رو حذف می کنه.
توضیح Chain ؟ این رو کامل بالا توضیح دادیم (امیدوارم فراموش نکرده باشین).
توضیح Interface ؟ اینجا مشخص می کنید که ترافیک کدوم کارت شبکه رو می خاین فیلتر کنید.
توضیحProtocol ؟ پروتوکلی که شامل این قانون می شه رو مشخص می کنید.
توضیحSource Address ؟ آی پی مبدا رو مشخص می کنید
توضیح Port Number ؟ شماره پورت مورد نظرتون
توضیح Target ؟ همون ۴ کار کلی هستش که قانون می تونه انجام بده (Accept، Drop، Return و Reject)
به عنوان یه مثال ساده و بسیار کاربردی، به شکل زیر می تونید پورت ۲۲ رو که برای سرویس ssh استفاده می شه رو روی سیستم باز کنید (توجه داشته باشید که می تونید بجای ACCEPT هر کدوم از چهار Target رو قرار بدیم).
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
به همین صورت می تونید هر پورتی رو که لازم دارید روی سیستم باز کنید(توجه داشته باشید که پورت رو در مسیر ورودی باز کردیم) و در این حالت از هر آدرسی می تونن این پورت رو ببینن.
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT # iptables -A INPUT -p tcp --dport 161 -j ACCEPT # iptables -A INPUT -p tcp --dport 23 -j ACCEPT
برای تمام قوانین فایروال می تونید از دستور زیر استفاده کنید. همونطور که می بینید، همه ی قوانینی که نوشتیم در جدولی که مشخص کردیم قرار دارن.
# iptables -L -v
نکته: وقتی یه درخواست وارد IpTables می شه، قوانین از بالا به پایین روش خونده میشن تا یکی از اونها با اون درخواست match بشه. پس اینو در نظر داشته باشید که اگه مثلا تو قانون اول ssh رو کلا بسته باشید و در قانون دوم ssh رو برای یه آی پی خاص باز گزاشته باشید، هیچ کسی نمی تونه به این سیستم ssh بزنه چون تمام درخواست ها با قانون اول match میشن و به قانون دوم نمی رسن.
برای دایمی کردن قوانین IpTables باید در ابتدا اونها رو در فایر زیر ذخیره کنید. با استفاده از دستور زیر این کار رو انجام می دیم.
# iptables-save > /etc/iptables/rules.v4
به شکل زیر مشخص می کنیم که در زمانی که کارت شبکه سیستم بالا میاد این قوانین رو روی فایروال بنویسه.
نکته: روش های زیادی برای این کار وجود دارد اما میشه گفت این کار یکی از حرفه ای ترین ها هستش.
# vi /etc/network/if-prep-up.d/firewall
متن زیر رو در این فایل وارد کنید(به شکل اسکریپت).
#!/bin/bash Iptables-restore < /etc/iptables/rules.v4
کار با FirewallD یا همون Dynamic Firewall:
این ابزار به عنوان یه جایگزین برای IpTables اومد ولی واقعیت این هستش که با وجود قدرتمند بودن و سادگی کار باهاش به هیچ وجه نمیشه گفت که یه جایگزین کامل برای IpTables هست. اما همونطور که گفتیم،این ابزار بسیار قدرتمند و کار راه اندازه که در ادامه کار باهاش رو می بینیم.
برای شروع کار با FirewallD اول لازمه که روی سیستمتون نصبش کنید.
# apt install firewalld
مثل هر سرویس دیگه اول لازمه که این برنامرو فعال کنید.
#systemctl enable firewalld
به شکل زیر سرویسشو استارت کنید.
#systemctl start firewalld
برای دیدن وضعیت این سرویس می تونید به شکل زیر عمل کنید.
# systemctl status firewalld
برای دیدن وضعیت قوانین فایروال می تونید به شکل زیر عمل کنید
#firewall-cmd --state
برای اضافه کردن یه پورت جدید، می تونید به شکل زیر عمل کنید.
نکته: در FirewallD قوانین در دسته های مختلفی قرار دارن که به اونها zone می گیم. این zone ها در واقع میزاد اعتمادی که شما به یه شبکه دارید رو مشخص می کنن. مثلا قوانینی که روی شبکه اینترنت یه کافه وضع می کنید باید خیلی سخت گیرانه تر از قوانین شبکه خونتون باشن. این کار رو FirewallD با zone هاش انجام میده.
# firewall-cmd --add-port=23/tcp --zone=public --permanent
توجه داشته باشید که اگه از سویچ permanent-- استفاده نکنید، قانون شما بر روی فایروال دایمی نمیشه.
به شکل زیر هم می تونید یه پورت رو باز کنید. در اینجا ما پورت کاربردی ۲۲ رو به صورت دایمی باز کردیم.
# firewall-cmd --add-port=22/tcp --permanent
خود FirewallD این قابلیت رو هم به شما می ده که پورت ها رو بر اساس سرویس اضافه کنید (خودش پورت های لازم برای درست کار کردن سرویس ها مهم رو میدونه).
# firewall-cmd --add-service=http --zone=public --permanent
بعد از نوشتن یه قانون، برای اینکه در همون لحظه اعمال بشه باید دستور زیر رو بزنید.
در غیر این صورت باید یک بار سیستم رو ریبوت کنید.
# firewall-cmd --reload
به شکل زیر می تونید تمام سرویس های این سیستم که یه پورتی باز دارن رو ببینید.
#firewall-cmd --list-services
به شکل زیر می تونید یه سرویس رو از روی فایروال حذف کنید.
توجه داشته باشید که شما فقط پورت هایی رو که فایروال برای این سرویس باز گزاشته رو می بندید.
# firewall-cmd --remove-service=http --zone=public --permanent
به شکل زیر هم می تونید یه پورت باز رو ببندید (مثلا اینجا ما پورت ۲۳ رو که برای سرویس ftp هستش رو بستیم).
#firewall-cmd - -remove-port=23/tcp - -zone=public - -permanent
مثل هر تغییر دیگه، لازمه یه بار فایروال رو ریلود (reload) کنید که تغییرات در همین لحظه روی سیستم اعمال بشن.
# firewall-cmd --reload
همونطور که می بینید، دیگه پورت مربوط به سرویس http (۸۰) روی سیستم باز نیست.
#firewall-cmd --list-services
به شکل زیر می تونید تمام اطلاعات مربوط به فایروال سیستم رو ببینید.
# firewall-cmd --list-all
کار با UFW:
نام UFW مخفف Uncompiled Fire Wall هستش و مختص توزیع Ubuntu نیستش. این یه اشتباه بسیار رایجه که بعضی ها فکر می کنن این فایروال فقط برای سیستم های debianهه. این فایروال به عنوان یه رابط برای IpTables عمل می کنه و می شه خیلی کارا رو باهاش به سادگی انجام داد.
برای شروع کار با فایروال UFW لازمه که اول روی سیستم نصبش کنید.
# apt install ufw
مثل هر سرویس دیگه، اول لازمه که فعالش کنید.
#systemctl enable ufw
به شکل زیر باید استارتش کنید.
# systemctl start ufw
در صورت نیاز، می تونید به شکل زیر وضعیت این سرویس رو ببینید.
#systemctl status ufw
یکی از کارهای مرسوم اینه که اول کل ترافیک ورودی سیستم رو باهاش ببندیم. به شکل زیر می تونید این کار رو انجام بدید.
# ufw default deny incoming
با استفاده از دستور زیر می تونید ترافیک خروجی سیستم رو باز کنید.
# ufw default allow outgoing
برای باز کردن پورت های لازم یه سرویس می تونید به شکل زیر عمل کنید.
در اینجا ما پورت ۲۲ که مربوط به سرویس ssh هستش رو باز کردیم.
#ufw allow ssh
اگر لازم باشه می تونید بدون توجه به سرویس خاصی یه پورت رو به صورت جدا روی سیستم باز کنید.
# ufw allow 23
برای اعمال قوانینی که وضع کردید لازمه که دستور زیر رو وارد کنید. به این صورت در همین لحظه قوانین روی سیستم اعمال می شن (توجه داشته باشید که از اونجایی که ما به این سرور ssh زدیم، به ما هشدار میده که ممکنه این ارتباز به خاطر قوانین فایروال قطع بشه).
# ufw enable
به شکل زیر می تونید دسترسی به یه پورت رو برای یه آی پی و یا به رنج آی پی محدود کنید (از هر آی پی دیگه ای به این پورت درخواست بیاد رد میشه).
# ufw allow from 192.168.1.0/24 to any port https
به شکل زیر می تونید تمام قوانین فایروال سیستم رو به صورت خطی ببینید.
# ufw status numbered
به شکل زیر می تونید یک قانون خاص روی فایروال رو حذف کنید.
# ufw delete 5
همونطور که می بینید، دیگه پورت ۲۳ روی فایروال باز نیست.
# ufw status numbered
برای ریست کردن فایروال می تونید از دستور زیر استفاده کنید
# ufw reset