Iptables

تاریخچه

Iptables توسط تیم netfilter طراحی شد. در ابتدا به علت ساختار زنجیره‌ای طراحی آن، به نام ipchain شهرت یافت اما بعدها نام iptables بر آن گذاشته شد. این دیوار آتش (Firewall) در ابتدا تنها می‌توانست سیاست‌های بسیار محدودی فقط روی بسته‌های ورودی اعمال کند اما به مرور زمان قسمت‌های ماژول مانندی به آن اضافه شد.

مفاهیم پایه

در متون مربوط به IPTables مفاهیمی وجود دارد که در ادامه توضیح داده شده‌اند. در بسیاری از موارد، این اصطلاحات به جای یکدیگر به‌کار می‌روند که ممکن است باعث بدفهمی مطالب شود.
Netfilter
چارچوبی حاوی مجموعه‌ای از قلاب‌ها است که در هستهٔ لینوکس قرار دارد و به منظور مسدود کردن و دستکاری بسته‌ها به کار می‌رود. شناخته‌شده‌ترین ابزاری که از Netfilter استفاده می‌کند، دیواره آتش است که بسته‌ها را فیلتر می‌کند. ابزارهای دیگری نیز مانند NAT، پیگیری حالت‌دار و صف‌بندی بسته از آن استفاده می‌کنند. همچنین نام پروژه‌ای که مجموعه‌ای از ابزارهای دیواره آتش را برای لینوکس فراهم کرد، Netfilter بوده‌است. اکثر اجزایی که در این پروژه تهیه شدند ماژول‌های قابل بارگذاری در هسته هستند اما مجموعه‌ای از ابزارهای فضای کاربر و کتابخانه‌هایی نیز تهیه شدند.
IPFilter
مسدودکردن یا عبوردادن انتخابی بسته‌ها در حین عبور از یک رابط کاربری را انجام می‌دهد. معیار محدود کردن بسته‌ها بر اساس سرآیندهای لایهٔ 3 (IPv4، IPv6) و لایهٔ 4 (TCP, UDP, ICMP4) است. معیاری که بیش از همه کاربرد دارد، آدرس مبدأ و مقصد، پورت و پروتکل مبدأ و مقصد است. IPFilter یکی از انواع دیواره‌های آتش است که ابتدا برای OpenBSD توسعه یافت، اما اکنون در سیستم‌های عامل دیگر نیز وجود دارد. در ادامه به ذکر برخی از مزایای IPFilter می‌پردازیم.
   کنترل: هنگامی‌که سیستم عامل، لینوکس است و شبکه‌های داخلی به یک شبکهٔ خارجی مانند اینترنت متصل است، می‌توان به انواع خاصی از ترافیک اجازهٔ عبور داد و انواع خاصی از آن را مسدود نمود. برای مثال، سرآیند بسته‌ها حاوی آدرس مقصد است، بنابراین می‌توان از رفتن بسته‌ها به بخش خاصی از شبکهٔ خارجی جلوگیری نمود. به عنوان مثالی دیگر در صفحه‌های وب، تبلیغات و آگهی‌هایی از doubleclick.net وجود دارند و مرورگر زمان زیادی را صرف بارگذاری آن‌ها می‌کند، می‌توان به IPFilter گفت هیچ بسته‌ای از doubleclick.net دریافت نکند.
 امنیت: لینوکس تنها رابط بین دنیای آشفته اینترنت و شبکهٔ منظم داخلی است؛ بنابراین باید بر روی ترافیک وارده به شبکهٔ داخلی محدودیت‌هایی اعمال کرد. ممکن است مهم نباشد که چه چیزی از شبکه خارج شود اما در مورد بسته‌های وارده باید نگران بود. به عنوان مثال ممکن است نخواهید که کسی از طریق Telnet با سرویس‌دهنده ارتباط برقرار کند. ممکن است بخواهید تنها از اینترنت استفاده کنید و یک سرویس‌دهنده نباشید؛ بنابراین جلوی هرگونه اتصالی را می‌گیرد. تمامی این کارها با داشتن IPFilter امکان‌پذیر است.
 مراقبت: گاهی اوقات سیستمی در شبکهٔ محلی که به‌طور نامناسبی پیکربندی شده است، تعداد زیادی بسته را به خارج از شبکه ارسال می‌کند. در این‌جا مناسب است IPFilter را طوری تنظیم کرد که وقوع هر رویداد غیرطبیعی را گزارش دهد.
ترجمهٔ آدرس شبکه (NAT)
هر کامپیوتری در ارتباط با دیگرکامپیوترها و سرویس‌دهندگان وب نیاز به یک آدرس IP دارد. با گسترش اینترنت و رشد استفاده خانگی و شبکه‌های کاری به نظر می‌رسد تعداد آدرس‌های IP موجود کافی نباشد. یک راه حل ساده، طراحی مجدد قالب آدرس IP است که امکان داشتن تعداد آدرس‌های بیشتری را می‌دهد، اما چندین سال طول می‌کشد تا این راه حل پیاده‌سازی شود و نیازمند اصلاح کل زیرساخت اینترنت است. در این‌جا NAT مشکل را حل می‌کند. NAT به یک دستگاه منفرد مثلاً یک مسیریاب این امکان را می‌دهد که به عنوان رابط بین اینترنت و یک شبکهٔ محلی مشخص عمل کند. در این صورت یک IP منفرد می‌تواند برای یک مجموعهٔ کامپیوتر استفاده شود. کمبود تعداد آدرس‌های IP تنها دلیل استفاده ازNAT نیست. فواید دیگری چون برقراری امنیت و مدیریت بهتر نیز از مزایای استفاده از NAT است. مفهوم NAT بسیار ساده و به این معنا است که یک دستگاه (مثل کامپیوتر یا مسیریاب) به عنوان دروازهٔ ورود به اینترنت عمل می‌کند و با این کار آدرس‌های ایستگاه‌های کاری را به آدرس دستگاهی که NAT روی آن فعال است ترجمه می‌کند، به بیان دیگرNAT روی دستگاهی که به اینترنت متصل است فعال می‌شود و ایستگاه‌های کاری و به‌طور کلی شبکه را از دید اینترنت پنهان می‌کند. از سوی دیگر اینترنت شبکه را به‌صورت یک دستگاه ساده می‌بیند که به اینترنت متصل می‌باشد. NAT روی شبکه تغییر ایجاد نمی‌کند و نیازی به تنظیمات دوباره روی ایستگاه‌های کاری نیست. فقط ایستگاه‌های کاری می‌بایست آدرس دروازهٔ خروجی از شبکه را که همان آدرس دستگاهی است که NAT روی آن فعال شده‌است را بدانند.

بررسی اجمالی

هستهٔ لینوکس از سری۱٫۱ داری IPFilter بوده‌است. برای تنظیم قوانین فیلترکردن بسته‌ها از ابزاری به نام ipfwadm استفاده می‌شد. در لینوکس ۲٫۲ ابزاری به نام IPChains معرفی شد و سرانجام برای لینوکس ۲٫۴ ابزار IPTables معرفی شد. در حقیقت IPTables ابزاری است که با هسته سخن می‌گوید و به آن می‌گوید که چه بسته‌هایی را فیلتر کند. علاوه بر فیلتر کردن بسته‌ها، برای ایجاد و دستکاری قوانین ماژول‌های NAT نیز استفاده می‌شود، زیرا NAT نیز از طریق مجموعه قوانین IPFilter پیکربندی می‌شود. اغلب نام IPTables برای کل زیرساخت دیواره آتش که شامل Netfilter، پیگیری اتصال و NAT است، استفاده می‌شود. ویژگی‌های اصلی IPTables عبارتند از:
 فهرست‌کردن کلیهٔ مجموعهٔ قوانین فیلتر بسته
 افزودن/ کم کردن/ اصلاح قوانین در مجموعهٔ قوانین فیلتر بسته
 فهرست/ صفر کردن شمارنده‌های هر قانون در مجموعهٔ قوانین فیلتر بسته
به دلیل این که IPTables به امتیازات خاصی برای اجرا نیاز دارد، باید حتماً توسط کاربر root اجرا شود. در اکثر سیستم‌های لینوکس IPTables در شاخهٔ usr/sbin/iptables نصب می‌شود و با اجرای دستور man iptables می‌توان به مستندات مربوط به آن دسترسی پیدا کرد. پروژهٔ netfilter/IPTables در سال ۱۹۹۸ میلادی توسط Rusty Russell که توسعه‌دهندهٔ IPChains نیز بود شروع شد. با پیشرفت پروژه، تیم Netfilter شکل گرفت. نرم‌افزار توسعه داده شده توسط آن‌ها تحت لیسانس GNU/GPL است. چارچوب Xtables به مدیر سیستم امکان تعریف جدول‌هایی را می‌دهد که شامل زنجیره‌هایی از قوانین هستند. هر قانون مشخص می‌کند که با بسته چگونه برخورد شود. هر جدول با نوع خاصی از پردازش بسته، سروکار دارد. بسته‌ها با پیمایش زنجیره‌ها پردازش می‌شوند. یک قانون در یک زنجیره می‌تواند یک بسته را به زنجیره دیگری بفرستد و این روند تا هر جایی می‌تواند ادامه داشته باشد. هر بسته ورودی یا خروجی از شبکه حداقل یک زنجیره را می‌پیماید. منبع بسته مشخص می‌کند که در ابتدا چه زنجیره‌ای را بپیماید. جداول توکار سیاست‌هایی دارند. برای مثال بسته‌ای که به انتهای زنجیره برسد، حذف می‌شود. مدیر سیستم می‌تواند به تعداد دلخواه زنجیره ایجاد کند. برای این زنجیره‌ها سیاست تعریف نشده است و اگر بسته‌ای به انتهای این‌گونه زنجیره‌ها برسد، دوباره به زنجیره‌ای که آن را فراخوانی کرده‌است، بازمی‌گردد. هر قانون در یک زنجیره با انواع بسته‌های خاصی انطباق می‌یابد. همچنین قانون ممکن است یک هدف داشته باشد. وقتی بسته‌ای یک زنجیره را می‌پیماید، هر قانون، آن را بررسی می‌کند. اگر قانون با بسته انطباق پیدا نکند، بسته به قانون بعدی فرستاده می‌شود و اگر قانون با بسته انطباق یابد، طبق آنچه در هدف مشخص شده با بسته برخورد می‌شود. بسته به پیمایش پیوسته در زنجیره ادامه می‌دهد تا (۱) یک قانون با آن بسته انطباق یابد که در این صورت در مورد سرنوشت نهایی بسته تصمیم گرفته می‌شود (مثلاً بسته قبول یا حذف می‌شود) یا (۲) یک قانون، هدف بازگشت را فراخوانی کند و بسته به زنجیرهٔ فراخواننده بازگردد یا (۳) بسته به انتهای زنجیره برسد.

عبارات و اصطلاحات IP Tables

در ادامه این بخش، تعدادی از عبارات و اصطلاحاتی که بیشترین کاربرد را دارند و برای درک مطالب بعدی لازم هستند، شرح داده می‌شوند.
انطباق:
این کلمه با دو معنی مختلف به‌کار می‌رود. معنی اول: یک انطباق منفرد که به یک قانون می‌گوید که یک سرآیند باید محتوی چه اطلاعاتی باشد. مثلاً انطباق—source به ما می‌گوید که آدرس منبع باید یک میزبان خاص یا محدوده خاصی از شبکه باشد. هر قانون از یک یا چندین انطباق تشکیل شده‌است. معنی دوم: اگر کل یک قانون در مورد یک بسته صدق کند می‌گوییم بسته با قانون انطباق یافته‌است. چند نمونه از پرکاربردترین انطباق‌ها در ادامه آورده شده‌اند:
 (--source (-s: یک آدرس IP مبدأ یا شبکه را انطباق می‌دهد.
 (--destination (-d: یک آدرس IP مقصد یا شبکه را انطباق می‌دهد.
 (--protocol (-p: روی یک IP انطباق انجام می‌دهد.
 (--in-interface (-i: یک رابط ورودی ایجاد می‌کند.
 interface: یک رابط خروجی ایجاد می‌کند.
 --state: روی مجموعه‌ای از حالات اتصال انطباق می‌دهد.
 --string: روی رشته‌ای از بایت‌های داده لایهٔ کاربردی، انطباق انجام می‌دهد.
قانون (Rule):
مجموعه‌ای از یک یا چندین انطباق به همراه یک هدف است که در اکثر پیاده‌سازی‌های IPTables، یک قانون مجموعه‌ای از چندین انطباق است. در بعضی از پیاده‌سازی‌ها می‌توانیم چندین هدف برای هر قانون داشته باشیم.
مجموعهٔ قوانین:
مجموعه‌ای از قوانین در پیاده‌سازی IPTables می‌باشد. مجموعهٔ قوانین در یک فایل پیکربندی نوشته می‌شوند.
پرش:
دستورالعمل JUMP مانند یک هدف است و دقیقاً مانند آن نوشته می‌شود. با این تفاوت که به جای نوشتن نام هدف، نام یک زنجیرهٔ دیگر نوشته می‌شود. اگر قانون انطباق داشت، بسته به زنجیرهٔ بعدی فرستاده می‌شود و در آن پردازش می‌شود.
Mangling:
دستکاری و تغییر فرم بسته را به اصطلاح Mangling می‌نامند. برای نمونه، هسته لینوکس می‌تواند فیلدهایی از بسته را دستکاری و تغییر دهد.
هدف:
به‌طور کلی هر قانون موجود در مجموعهٔ قوانین یک مجموعهٔ هدف دارد. اگر کل قانون به‌طور کامل انطباق پیدا کند، تعریف هدف مشخص می‌کند که باید با بسته چه کرد. مثلاً می‌گوید که باید آن را قبول، حذف یا آدرس IP آن را ترجمه کرد. یک قانون ممکن است پرش یا هدف داشته باشد یا نداشته باشد. در ادامه چند هدف پرکاربرد آورده شده است:
 ACCEPT: به یک بسته اجازه می‌دهد که به راه خود ادامه دهد.
 DROP: یک بسته را حذف می‌کند و هیچ پردازش دیگری روی آن انجام نمی‌شود.
 LOG: یک بسته را در syslog ثبت می‌کند.
 REJECT: یک بسته را حذف می‌کند و هم‌زمان یک پاسخ مناسب، ارسال می‌کند.
 RETURN: باعث ادامه پردازش یک بسته در زنجیرهٔ فراخواننده می‌شود.
جدول (Table):
جداول مجموعه‌ای از زنجیرها هستند. زنجیرهایی را که در یک دسته قرار می‌گیرند، درون یک جدول تعریف می‌کنند. این طبقه‌بندی‌ها باعث سهولت کار کاربران و بالا رفتن سرعت می‌شوند. هر جدول هدف خاصی دارد و در IPTables، چهار جدول وجود دارد: جداول Filter, Nat, Raw و Mangle. حال به بررسی این جداول می‌پردازیم:
جدول Filter: تمام قوانین و زنجیرهایی که به نوعی کار حذف یا عبور بسته را انجام می‌دهند در این جدول قرار می‌گیرند. برای نمونه، قانون حذف بسته‌ها از آدرس ۹۲٫۴۰٫۱۰٫۰۵ در این جدول است. زنجیرهای Input, Forward و Output در این جدول قرار دارند.
جدول NAT: شامل تمام قوانین و زنجیرهایی است که کار ترجمه یا تغییر آدرس(IP بسته‌ها) را بر عهده دارند. برای نمونه، قانون تغییر آدرس ۲۳٫۱۰٫۱۰٫۹ به آدرس ۸۰٫۹۰٫۹۰٫۰۰ در این جدول قرار می‌گیرد. زنجیرهای Prerouting و postrouting در این جدول قرار دارند.
جدول Mangle: قانون‌ها و زنجیرهای پیشرفته مربوط به تغییر و دستکاری سرآیند(Header) بسته‌ها در این جدول طبقه‌بندی می‌شوند. تفاوت جدول NAT و Mangle در این است که در NAT فقط آدرس‌ها تغییر یا دستکاری می‌شوند، اما در Mangle فیلدهای دیگر سرآیند بسته‌ها دستکاری می‌شوند. زنجیرهای Prerouting, Input و Output در این جدول قرار دارند.
پیگیری اتصال:
یکی از مهم‌ترین ویژگی‌های Netfilter پیگیری اتصال است. پیگیری اتصال این امکان را به هسته می‌دهد که کلیه اتصال‌های شبکه یا جلسه‌ها را پیگیری کند و بدین‌وسیله کلیه بسته‌هایی که با هم یک اتصال را تشکیل می‌دهند، به هم مرتبط کند. NAT به این اطلاعات برای ترجمهٔ بسته‌های مرتبط به هم نیاز دارد و IPTables می‌تواند از این اطلاعات استفاده کند و مانند یک دیواره آتش حالت‌دار عمل کند. پیگیری اتصال، هر بسته را به حالت‌های مختلف به شرح زیر طبقه‌بندی می‌کند:
 جدید: اولین بستهٔ یک اتصال جدید.
 برقرارشده: بسته‌ای که قسمتی از اتصالی است که وجود دارد.
 وابسته: بسته‌ای که یک اتصال جدید را شروع کرده‌است و این اتصال به یک اتصال موجود مرتبط است.
 نامعتبر: قسمتی از هیچ اتصال شناخته‌شده‌ای نیست.
 عدم ردیابی: حالت خاصی است که توسط مدیر به یک بسته نسبت داده می‌شود تا پیگیری اتصال را برای یک بسته خاص انجام ندهد.
زنجیره (Chain):
یک زنجیره یک مجموعهٔ قانون است که بر روی بسته‌هایی که زنجیره را می‌پیمایند، اعمال می‌شود. هر زنجیره یک هدف خاص دارد. هر جدول یک مجموعهٔ زنجیره توکار دارد اما کاربر نیز می‌تواند زنجیره‌هایی را تعریف کند.
شکل۱. ساختار IPTables
مهم‌ترین زنجیره‌های توکار عبارتند از INPUT, OUTPUT و FORWARD
 INPUT: این زنجیره توسط بسته‌هایی پیمایش می‌شود که به شبکهٔ محلی وارد می‌شوند. البته بعد از این‌که در هسته عمل مسیریابی آن‌ها انجام شود.
 OUTPUT: برای بسته‌هایی است که در سیستم لینوکس تولید می‌شوند.
 FORWARD: وقتی دیواره آتش برای متصل‌کردن یک شبکه به شبکهٔ دیگر استفاده می‌شود، بسته‌ها باید در دیواره آتش مسیریابی شوند که در این مورد این زنجیره به‌کار می‌رود.
دو زنجیرهٔ دیگر عبارتند از PREROUTING و POSTROUTING که اصلاح سرآیند بسته‌ها را قبل و بعد از عمل مسیریابی توسط هسته، انجام می‌دهند.