damashi
February 15th, 2012, 04:19
iptables یکی از مهمترین ارکان مدیریت سرور است. ابزاری که سن تولدش در دنیای متن باز (Open Source) فاصله زیادی با شروع نهضت متن باز ندارد. Iptables نام ابزاری است که قادر به اجرای هر سیاستی در سطح لایه ترانسفر و تا حدودی لایههای پایینتر و بالاتر شبکه را دارد اما شهرت و محبوبیت اصلی این نرمافزار سطح هسته به انعطاف بی حد و حصر آن در لایه ترانسفر مربوط میشود آنجا که حرف از روتینگ بستهها (Packets) و وضعیت آنها است.
Iptables توسط تیم netfilter طراحی شد. در ابتدا به علت ساختار زنجیرهای طراحی آن، به نام ipchain شهرت یافت (هم اکنون هم در سیستم عامل BSD از این نسخه که حال برای خود انشعابی خاص شده است استفاده میشود) اما بعدها نام iptables بر آن گذاشته شد. این دیوار آتش (Firewall) در ابتدا تنها میتوانست سیاستهای بسیار محدودی فقط روی بستههای ورودی اعمال کند اما به مرور زمان قسمتهای ماژول مانندی به آن اضافه شد.
کار با iptables بر خلاف تصوری که در قدم اول در ذهن هر خوانندهای شکل میگیرد بسیار ساده است. همه چیز در قالب زنجیرههایی شکل میگیرد که به هم پیوسته میشوند. سه زنجیره اصلی عبارتند از INPUT،OUTPUT و FORWARD. این سه زنجیره بر حسب نامشان تمام بستههای ورودی را به دست شما میسپارند تا هر سیاستی که میخواهید بر آنها اعمال کنید.
فرض کنید میخواهید تمام بستههای ICMP را مسدود کنید؛ برای این کار باید به سراغ زنجیره INPUT برویم که تمام بستههای ورودی با تمام Payload وHeader شان به محض ورود به سیستم عامل به آنجا میروند، برویم. همه چیز کاملا ساده است :
Iptables –A INPUT –p icmp –j DROP
سوییچ A تعیین کننده نوع بستههای مورد نظر است سوییچ p نشان دهنده پروتکل بستههای ورودی است که در اینجا بستههای ICMP که همان بستههای PING هستند، انتخاب شده است و در آخر سوییچ j است که مخفف کلمه jump (به معنی پرش) است. خوب حال کمی تخصصیتر به این دستور نگاه میکنیم. در دستور بالا ما ۲ زنجیره (chain) اصلی داریم: یکی به نام DROP و یکی INPUT. همان طور که از نام زنجیره DROP پیدا است، وظیفه آن، از رده خارج کردن بستهها و جلوگیری از رسیدن آنها به فرآیند مورد نظر را دارد. ناگفته پیدا است که میتوانیم بسته ورودی را به انتخاب خودمان به هر زنجیرهای بفرستیم. به عنوان مثال در زیر چند خط دستور می نویسیم که تمام ترافیک پورت ۸۰ را به یک زنجیره از پیش تعریف نشده میبرد و اگر ترافیک از مبدا خاصی بود اجازه ادامه را از آن میگیریم در غیر این صورت بسته به هدف خود میرسد:
iptables –N SUN-ARMY-CHAIN
iptables –A SUN-ARMY-CHAIN –s 192.168.1.20 –j DROP
iptables –A SUN-ARMY-CHAIN –j ACCEPT
iptables –A INPUT -p tcp –source-port 80 –j SUN-ARMY-CHAIN
خوب خط به خط دستورها را میخوانیم :
در دستور اول یک زنجیره به نام SUN-ARMY-CHAIN ایجاد میشود سپس میگوییم هر بسته ورودی اگر از آدرس مبدا (source)ذکر شده ارسال شده باشد، از رده خارج میشود؛ در غیر این صورت تایید شده و به هدف میرسد.
حال شاید برای شما این سوال شود که اگر ما تعدادی شرط داشتیم و بسته ورودی در هیچ کدام از شرطها صدق نکند چه اتفاقی میافتد پاسخ این است که هیچ بسته ورودی وجود ندارد که عضو یکی از سه زنجیره اصلی نباشد.
خوب در مرحله بعد باید بگویم که هر زنجیره یک سیاست کلی دارد که در صورتی که یک بسته در هیچ کدام از شروط صدق نکند سیاست اصلی دربارهٔ آن به اجرا در میآید که به صورت پیش تعریف شده قبول همه بستهها است.
زنجیرههای اصلی
[LEFT] REJECTاین زنجیره بسته را از رده خارج کرده و یک پیام برای صاحب بسته ارسال میکند:.
DROP: این زنجیره هم مانند زنجیره قبل عمل میکند با این تفاوت که پیام برای ارسالکننده ارسال نمیشود.
LOG: این زنجیره بسته ورودی خود را لاگ میکند.
ACCEPT: بسته اجازه عبور پیدا میکند.
Iptables توسط تیم netfilter طراحی شد. در ابتدا به علت ساختار زنجیرهای طراحی آن، به نام ipchain شهرت یافت (هم اکنون هم در سیستم عامل BSD از این نسخه که حال برای خود انشعابی خاص شده است استفاده میشود) اما بعدها نام iptables بر آن گذاشته شد. این دیوار آتش (Firewall) در ابتدا تنها میتوانست سیاستهای بسیار محدودی فقط روی بستههای ورودی اعمال کند اما به مرور زمان قسمتهای ماژول مانندی به آن اضافه شد.
کار با iptables بر خلاف تصوری که در قدم اول در ذهن هر خوانندهای شکل میگیرد بسیار ساده است. همه چیز در قالب زنجیرههایی شکل میگیرد که به هم پیوسته میشوند. سه زنجیره اصلی عبارتند از INPUT،OUTPUT و FORWARD. این سه زنجیره بر حسب نامشان تمام بستههای ورودی را به دست شما میسپارند تا هر سیاستی که میخواهید بر آنها اعمال کنید.
فرض کنید میخواهید تمام بستههای ICMP را مسدود کنید؛ برای این کار باید به سراغ زنجیره INPUT برویم که تمام بستههای ورودی با تمام Payload وHeader شان به محض ورود به سیستم عامل به آنجا میروند، برویم. همه چیز کاملا ساده است :
Iptables –A INPUT –p icmp –j DROP
سوییچ A تعیین کننده نوع بستههای مورد نظر است سوییچ p نشان دهنده پروتکل بستههای ورودی است که در اینجا بستههای ICMP که همان بستههای PING هستند، انتخاب شده است و در آخر سوییچ j است که مخفف کلمه jump (به معنی پرش) است. خوب حال کمی تخصصیتر به این دستور نگاه میکنیم. در دستور بالا ما ۲ زنجیره (chain) اصلی داریم: یکی به نام DROP و یکی INPUT. همان طور که از نام زنجیره DROP پیدا است، وظیفه آن، از رده خارج کردن بستهها و جلوگیری از رسیدن آنها به فرآیند مورد نظر را دارد. ناگفته پیدا است که میتوانیم بسته ورودی را به انتخاب خودمان به هر زنجیرهای بفرستیم. به عنوان مثال در زیر چند خط دستور می نویسیم که تمام ترافیک پورت ۸۰ را به یک زنجیره از پیش تعریف نشده میبرد و اگر ترافیک از مبدا خاصی بود اجازه ادامه را از آن میگیریم در غیر این صورت بسته به هدف خود میرسد:
iptables –N SUN-ARMY-CHAIN
iptables –A SUN-ARMY-CHAIN –s 192.168.1.20 –j DROP
iptables –A SUN-ARMY-CHAIN –j ACCEPT
iptables –A INPUT -p tcp –source-port 80 –j SUN-ARMY-CHAIN
خوب خط به خط دستورها را میخوانیم :
در دستور اول یک زنجیره به نام SUN-ARMY-CHAIN ایجاد میشود سپس میگوییم هر بسته ورودی اگر از آدرس مبدا (source)ذکر شده ارسال شده باشد، از رده خارج میشود؛ در غیر این صورت تایید شده و به هدف میرسد.
حال شاید برای شما این سوال شود که اگر ما تعدادی شرط داشتیم و بسته ورودی در هیچ کدام از شرطها صدق نکند چه اتفاقی میافتد پاسخ این است که هیچ بسته ورودی وجود ندارد که عضو یکی از سه زنجیره اصلی نباشد.
خوب در مرحله بعد باید بگویم که هر زنجیره یک سیاست کلی دارد که در صورتی که یک بسته در هیچ کدام از شروط صدق نکند سیاست اصلی دربارهٔ آن به اجرا در میآید که به صورت پیش تعریف شده قبول همه بستهها است.
زنجیرههای اصلی
[LEFT] REJECTاین زنجیره بسته را از رده خارج کرده و یک پیام برای صاحب بسته ارسال میکند:.
DROP: این زنجیره هم مانند زنجیره قبل عمل میکند با این تفاوت که پیام برای ارسالکننده ارسال نمیشود.
LOG: این زنجیره بسته ورودی خود را لاگ میکند.
ACCEPT: بسته اجازه عبور پیدا میکند.