به زبان ساده، iptables یک برنامه فایروال برای سیستم عامل لینوکس است و ترافیک ورودی و خروجی سرور را با استفاده از جداول (tables) مانیتور میکند. این جدولها دارای مجموعهای از قوانین (rules) به نام زنجیر (chain) هستند که بسته های داده (packets) ورودی و خروجی را فیلتر میکنند.
زمانی که یک packet مطابق با یک rule باشد، به آن یک target (هدف) داده میشود که تارگت مربوطه میتواند یک chain دیگر یا یکی از سه مقادیر ویژه زیر باشد:
- ACCEPT : به packet اجازه عبور میدهد.
- DROP : به packet اجازه عبور نمی دهد.
- RETURN : گردش packet در chain فعلی را متوقف کرده و آن را به chain قبلی هدایت میکند.
در این مقاله، به بررسی Iptables در لینوکس و یکی از جدولهای پیشفرض آن به نام filter پرداخته میشود که شامل سه chain زیر است:
- INPUT : پکتهای ورودی سرور را کنترل میکند.
- FORWARD : پکتهای ورودی که باید به جایی دیگر فوروارد شوند را فیلتر میکند.
- OUTPUT : پکتهای خروجی سرور را فیلتر میکند.
تصویر(1)
پیش از شروع، اطمینان حاصل نمایید که از طریق ssh دسترسی root یا sudo به سروری با سیستم عامل اوبونتو 16.04 یا بالاتر دارید.
جهت برقراری اتصال میتوانید از برنامه PuTTY در ویندوز یا terminal shell در لینوکس و macOS استفاده نمایید.
نحوه نصب و استفاده از فایروال Iptables در لینوکس
توضیحات این بخش به 3 مرحله تقسیم شده است. در مرحله اول نصب فایروال در Ubuntu بررسی میشود. در مرحله دوم، نحوه تعریف rule ها و در مرحله آخر نیز توضیحات لازم در خصوص دائمی کردن تغییرات ارائه خواهد شد.
مرحله 1 - نصب Iptables
در اکثر توزیع های لینوکسی فایروال iptables به صورت پیشفرض نصب است. با این حال چنانچه در نسخه ubuntu یا debian شما، این فایروال به صورت پیشفرض نصب نمی باشد، مراحل زیر را انجام دهید:
- از طریق ssh به سرور متصل شوید.
- دستورات زیر را به ترتیب اجرا نمایید:
sudo apt-get update
sudo apt-get install iptables
- وضعیت پیکربندی فعلی Iptables در لینوکس خود را با دستور زیر بررسی کنید:
sudo iptables -L -v
در اینجا آپشن L- جهت لیست کردن تمامی rule ها و از v- برای نمایش اطلاعات با جزئیات بیشتر استفاده میشود. در زیر یک نمونه خروجی را مشاهده میکنید:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
هم اکنون فایروال نصب شده است و همانطور که مشاهده میکنید تمامی chain ها با مقدار ACCEPT تنظیم شده اند و هیچگونه rule یا قانونی نیز تنظیم نشده است. این وضعیت ایمن نیست زیرا عملیات فیلترینگ انجام نمی شود و هر پکتی میتواند وارد شود.
در مرحله بعدی به بررسی نحوه تعریف rule پرداخته خواهد شد.
مرحله 2 - نحوه تعریف Chain rules
تعریف یک rule به معنی اضافه کردن آن به انتهای chain میباشد. جهت انجام این کار، نیاز است که از آپشن A- (حرف اول کلمه Append) بعد از دستور iptables استفاده نمایید. همانند زیر:
sudo iptables -A
این آپشن به Iptables در لینوکس اطلاع میدهد که شما در حال اضافه کردن rule های جدید به chain هستید.
سپس میتوانید دستور را با آپشنهای دیگر ترکیب نمایید، برخی از این آپشن ها به شرح ذیل میباشد:
i- : کوتاه شده کلمه interface است و رابط شبکه ای که قصد فیلتر آن را دارید مشخص میکند. به عنوان مثال میتوان از eth0 ،lo ،ppp0 و... نام برد.
p- : کوتاه شده کلمه protocol است و پروتکل شبکه ای که در آن فرایند فیلترینگ صورت میگیرد را مشخص میکند. مقدار آن میتواند tcp ،udp ، udplite ،icmp ،sctp ،icmpv6 و امثالهم باشد.
متناوبا، میتوانید از کلمه all برای انتخاب تمامی پروتکل ها استفاده نمایید.
s- : کوتاه شده کلمه source میباشد و به آدرسی که از آن ترافیک دریافت شده است، اشاره میکند. مقدار آن میتواند hostname یا آدرس آی پی باشد.
dp- : مخفف کلمه destination port است و شماره پورت مقصد یک پروتکل را مشخص میکند. به عنوان مثال پورت 22 مربوط به SSH و پورت 443 برای https میباشد.
j- : برای مشخص کردن target یا هدف است. همانطور که بالاتر توضیح داده شد، target میتواند دارای مقادیر ACCEPT، DROP یا RETURN باشد.
هر زمان که قصد دارید rule جدیدی تعریف نمایید نیاز است target را مشخص کنید.
اگر قصد دارید از تمامی آپشنهای فوق استفاده کنید، لازم است به ترتیب زیر وارد شوند:
sudo iptables -A <chain> -i <interface> -p <protocol (tcp/udp) > -s <source> --dport <port no.> -j <target>
زمانی که با نحوه استفاده از دستور آشنا شدید، میتوانید اقدام به کانفیگ فایروال Iptables در لینوکس جهت افزایش امنیت سرور نمایید.
در ادامه جهت ارائه توضیحات آموزشی از زنجیر INPUT استفاده خواهد شد.
فعالسازی ترافیک در لوکال هاست
جهت فعالسازی ترافیک در لوکال هاست، دستور زیر را اجرا نمایید:
sudo iptables -A INPUT -i lo -j ACCEPT
در این مقاله از رابط شبکه lo یا loopback استفاده میگردد. این رابط برای تمامی ارتباطات در لوکال هاست به کار گرفته میشود.
دستور فوق اطمینان حاصل میکند که اتصال و تعامل بین دیتابیس و وب اپلیکیشن روی یک سرور بدون مشکل برقرار باشد.
فعالسازی اتصال با پورتهای HTTP، SSH و SSL
در این مرحله باید پورتهای 80، 443 و 22 که به ترتیب مربوط به http ،https و ssh است فعال شوند. بدین منظور، نیاز خواهد بود که پروتکل (-p) و پورت (–dport) مربوطه را مشخص نمایید.
دستورات زیر را به اجرا کنید.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
هم اکنون نیاز است اضافه شدن rule ها به iptables را با دستور زیر بررسی نمایید.
sudo iptables -L -v
تصویر(2)
خروجی فوق به این معنا است که تمام کانکشنهای پروتکل TCP، از پورتهای مربوطه پذیرفته میشود.
فیلتر کردن پکت ها بر اساس source
Iptables در لینوکس به شما اجازه میدهد که پکت ها را بر اساس آدرس آی پی یا یک رنج آی پی فیلتر نمایید. نیاز است که مقدار مربوطه را بعد از آپشن -s مشخص کنید. به عنوان مثال جهت پذیرش پکت ها از آدرس آی پی 192.168.1.3، نیاز است دستور زیر را وارد شود:
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
همچنین شما میتوانید پکت های دریافتی از یک آدرس آی پی خاص را drop یا رد نمایید. جهت انجام این کار نیاز است تارگت با مقدار DROP تنظیم گردد.
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
اگر بخواهید پکت دریافتی از یک رنج آی پی را رد کنید، نیاز است که از آپشن -m و ماژول iprange استفاده نمایید. سپس، با –src-range رنج آدرس آی پی مشخص گردد. توجه داشته باشید که رنج آی پی باید با کاراکتر hyphen و بدون فضای خالی، مشابه دستور زیر اجرا شود.
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
مسدود کردن سایر ترافیکها
بعد از تعریف قوانین -dport، استفاده از تارگت DROP برای سایر ترافیکها ضروری است. این مورد از دسترسی کانکشنهای غیر مجاز به سرور از طریق پورتهای باز دیگر جلوگیری میکند. جهت انجام این مورد، کافی است که دستور زیر را تایپ نمایید:
sudo iptables -A INPUT -j DROP
پس از اجرای دستور، کانکشنهای خارج از پورتهای تعریف شده drop یا رد میشوند.
حذف قوانین (rules)
اگر قصد دارید تمامی قوانین را حذف و از نو شروع کنید، میتوانید از آپشن -F که حرف اول کلمه flush است استفاده نمایید.
sudo iptables -F
این دستور تمام rule های فعلی را پاک میکند اما چنانچه بخواهید یک rule خاص را حذف نمایید باید از آپشن -D استفاده کنید. در ابتدا نیاز است تمامی rule های موجود را با وارد کردن دستور زیر مشاهده نمایید:
sudo iptables -L --line-numbers
لیستی از rule ها را به همراه شماره، مشاهده خواهید کرد:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 192.168.0.4 anywhere
2 ACCEPT tcp -- anywhere anywhere tcp dpt:https
3 ACCEPT tcp -- anywhere anywhere tcp dpt:http
4 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
جهت حذف یک rule، نیاز است chain مربوطه و شماره آن rule در لیست را درج نمایید. به عنوان مثال جهت حذف rule شماره 3 از لیست فوق که مربوط به زنجیر INPUT میباشد، لازم است دستور زیر وارد شود:
sudo iptables -D INPUT 3
مرحله 3 - دائمی کردن تغییرات
rule های ایجاد شده در حافظه سیستم ذخیره میگردند و این بدان معنا است که باید مجددا پس از reboot تعریف شوند. به منظور دائمی کردن تغییرات، شما میتوانید از دستور زیر استفاده نمایید:
sudo /sbin/iptables-save
دستور فوق rule های فعلی را در فایل پیکربندی سیستم ذخیره میکند. این فایل جهت کانفیگ مجدد جدولهای فایروال پس از هر بار reboot سرور، استفاده میشود. توجه داشته باشید که پس از ایجاد هرگونه تغییر در rule ها، باید این دستور را اجرا نمایید. به عنوان مثال، جهت غیرفعالسازی Iptables در لینوکس، نیاز است دو دستور زیر را اجرا کنید:
sudo iptables -F
sudo /sbin/iptables-save
خروجی به شکل زیر خواهد بود:
تصویر(3)
نتیجه گیری
Iptables در لینوکس یک فایروال قدرتمند است که جهت افزایش امنیت سرورها استفاده میشود. از ویژگیهای عالی آن میتوان به امکان تعریف rule های متعدد بر اساس اولویت نام برد. در این مقاله، به بررسی نحوه نصب و استفاده از فایروال Iptables در لینوکس و همچنین تعریف مجموعه ای از rule ها به منظور فیلتر کردن پکتهای ورودی و خروجی پرداخته شد.