آنچه در این مقاله میخوانید
نگاهی عمیق به معماری Iptables و Netfilter
۱۸ فروردین ۱۴۰۴
فایروالها ابزارهای مهمی هستند که میتوان آنها را برای محافظت از سرورها و زیرساختهای شما پیکربندی کرد. در اکوسیستم لینوکس، iptables
یکی از فایروالهای پرکاربرد است که با چارچوب فیلترگذاری بسته netfilter
در هسته سیستمعامل کار میکند. ایجاد سیاستهای امنیتی مطمئن برای فایروال میتواند چالش برانگیز باشد، زیرا این فرآیند شامل دستوراتی با ساختار پیچیده و اجزای متعددی است که به هم مرتبط هستند.
در این راهنما، به بررسی معماری iptables پرداخته شده است تا درک آن برای کاربرانی که قصد دارند سیاستهای فایروال خود را تنظیم کنند آسان تر شود. در این مقاله نحوه تعامل iptables
با netfilter
بررسی شده و توضیح داده شده است که چگونه اجزای مختلف این سیستم کنار هم یک مکانیزم فیلتر گذاری جامع را فراهم میکنند.
در ادامه خواهید خواند:
- IPTables و Netfilter چیست؟
- هوکهای Netfilter
- جدولها و زنجیرههای IPTables
- کدام جدولها در دسترس هستند؟
- روابط بین زنجیرهها و جدولها
- قوانین IPTables
- پرش به زنجیرههای تعریفشده توسط کاربر
- IPTables و رهگیری اتصالات
- جمع بندی
IPTables و Netfilter چیست؟
برای سالها، iptables
یکی از رایجترین نرمافزار فایروال در لینوکس بود. در برخی از توزیعهای لینوکسی، این ابزار با ابزار جدیدتری به نام netfilter
جایگزین شده است. اما همچنان iptables
به عنوان یک مبنا در ساخت قوانین فایروال مورد استفاده قرار میگیرد. این فایروال با هوکهای فیلترگذاری بسته (packet filtering hooks) در پشته شبکه (networking stack) کرنل لینوکس تعامل دارد. این هوکهای کرنل تحت عنوان چارچوب netfilter
شناخته میشود.
هر بستهای که از لایه شبکه عبور میکند (ورودی یا خروجی) این هوکها را فعال میکند و به برنامهها اجازه میدهد که در نقاط کلیدی با ترافیک شبکه تعامل داشته باشند. ماژول های کرنل مرتبط با iptables
در این هوکها ثبت شده و بررسی میکنند که آیا ترافیک عبوری با شریط تعیین شده در قوانین فایروال مطابقت دارد یا خیر.

هوکهای Netfilter
پنج هوک netfilter
وجود دارد که برنامهها میتوانند در آنها ثبت شوند. هنگامی که بستهها در پشته شبکه حرکت میکنند، ماژولهای کرنل که در این هوکها ثبت شدهاند، فعال میشوند. هوکهایی که یک بسته فعال میکند، بستگی به این دارد که بسته ورودی یا خروجی باشد، مقصد آن کجاست و آیا در نقطهای قبلی رد (dropped) یا رد شده (rejected) است یا خیر.
هوکهای زیر، نقاط مشخصشده در پشته شبکه را نشان میدهند:
NF_IP_PRE_ROUTING
: این هوک برای هر ترافیک ورودی بلافاصله پس از ورود به پشته شبکه فعال میشود. پردازش این هوک قبل از انجام هرگونه تصمیمگیری مسیریابی درباره مقصد بسته انجام میشود.NF_IP_LOCAL_IN
: این هوک زمانی فعال میشود که یک بسته ورودی پس از مسیریابی مشخص شود که مقصد آن سیستم محلی است.NF_IP_FORWARD
: این هوک زمانی فعال میشود که یک بسته ورودی پس از مسیریابی مشخص شود که باید به یک میزبان دیگر ارسال شود.NF_IP_LOCAL_OUT
: این هوک برای هر ترافیک خروجی که بهصورت محلی تولید شده است، بلافاصله پس از ورود به پشته شبکه فعال میشود.NF_IP_POST_ROUTING
: این هوک برای هر ترافیک خروجی یا ترافیکی که قرار است ارسال شود، بعد از فرآیند مسیریابی و درست قبل از ارسال در شبکه فعال میشود.
ماژولهای کرنل که نیاز دارند در این هوکها ثبت شوند، باید یک عدد اولویت نیز ارائه دهند تا ترتیب اجرای آنها در هنگام فعال شدن هوک مشخص شود. این قابلیت باعث میشود که چندین ماژول مختلف (یا چندین نمونه از یک ماژول) بتوانند به یک هوک متصل شوند و ترتیب پردازش آنها به صورت مشخص و کنترلشده تعیین شود. هر ماژول پس از پردازش، یک تصمیم به چارچوب netfilter
ارائه میدهد که مشخص میکند با بسته چه باید کرد.
جدولها و زنجیرههای IPTables
فایروال iptables
از جداول برای سازماندهی قوانین خود استفاده میکند. این جداول، قوانین را بر اساس نوع تصمیماتی که قرار است گرفته شود، طبقهبندی میکنند. به عنوان مثال، اگر یک قانون مربوط به ترجمه آدرس شبکه (NAT) باشد، در جدول nat
قرار میگیرد. اگر قانونی تعیین کند که آیا یک بسته اجازه دارد به مقصد خود برسد یا نه، احتمالاً در جدول filter
اضافه میشود.
در هر جدول iptables
، قوانین بهصورت جداگانه در زنجیرههای مختلف (chains) سازماندهی میشوند. در حالی که جداول بر اساس هدف کلی قوانین تعریف میشوند، زنجیرههای داخلی به هوکهای netfilter
متصل هستند و مشخص میکنند که قوانین چه زمانی ارزیابی شوند.
نامهای زنجیرههای داخلی با نام هوکهای netfilter
که به آنها مرتبط هستند، مطابقت دارند:
PREROUTING
: فعالشده توسط هوکNF_IP_PRE_ROUTING
INPUT
: فعالشده توسط هوکNF_IP_LOCAL_IN
FORWARD
: فعالشده توسط هوکNF_IP_FORWARD
OUTPUT
: فعالشده توسط هوکNF_IP_LOCAL_OUT
POSTROUTING
: فعالشده توسط هوکNF_IP_POST_ROUTING
زنجیرهها به مدیر سیستم این امکان را میدهند که تعیین کند یک قانون در کدام بخش از مسیر پردازش بستهها بررسی شود. از آنجا که هر جدول شامل چندین زنجیره است، میتواند در نقاط مختلفی از پردازش بستهها تأثیر بگذارد. از آنجایی که برخی تصمیمات فقط در نقاط خاصی از پشته شبکه (network stack) منطقی هستند، هر جدول در تمام هوکهای کرنل زنجیرهای ثبت نمیکند.
کرنل netfilter
فقط پنج هوک دارد، بنابراین چندین جدول ممکن است زنجیرههایی را در یک هوک ثبت کنند. برای مثال، سه جدول دارای زنجیره PREROUTING
هستند. هنگامی که این زنجیرهها در هوک NF_IP_PRE_ROUTING
ثبت میشوند، اولویت آنها مشخص میکند که ترتیب پردازش زنجیرههای PREROUTING
چگونه باشد. تمام قوانین موجود در زنجیرهای با بالاترین اولویت بهترتیب پردازش میشوند و سپس نوبت به زنجیره بعدی میرسد. در ادامه، ترتیب اجرای این زنجیرهها را بررسی خواهیم کرد.
کدام جدولها در دسترس هستند؟
بیایید کمی عقب برویم و نگاهی به جداول مختلف iptables
بیندازیم. این جداول، مجموعهای مجزا از قوانین را ارئه میدهند که بر اساس حوزه عملکردشان سازماندهی شدهاند و برای ارزیابی بستههای شبکه به کار میروند.
جدول فیلتر (Filter Table)
جدول filter
یکی از پرکاربردترین جداول در iptables
است. این جدول برای تصمیم گیری دباره عبور یا مسدودسازی بستهها استفاده میشود. در اصطلاحات فایروال، این فرآیند به عنوان فیلتر کردن بستهها شناخته میشود. این جدول بخش اصلی عملکرد یک فایروال را ارائه میدهد و معمولا همان چیزی است که افراد هنگام بحث درباره فایروالها به آن فکر میکنند.
جدول NAT
جدول nat
برای پیاده سازی قوانین ترجمه آدرس شبکه استفاده میشود. زمانی که بستهها وارد استک شبکه میشوند، قوانین این جدول تعیین میکنند که آیا آدرس مبدا یا مقصد بسته باید تغییر کند یا خیر. این تغییرات میتوانند مسیر بسته و ترافیک پاسخ آن را تحت تاثیر قرار دهند. از جدول NAT اغلب برای هدایت بستهها به شبکههایی که در دسترسی مستقیم به آنها امکانپذیر نیست استفاده میشود.
جدول Mangle
جدول mangle
برای تغییر هدرهای IP بستهها به روشهای مختلف به کار میرود. برای مثال، میتوان مقدار TTL (زمان حیات بسته) را تغییر داد، به این صورت که تعداد پرشهای مجاز بسته در شبکه افزایش یا کاهش یابد. همچنین، سایر هدرهای IP نیز میتوانند به روشهای مشابه اصلاح شوند.
این جدول همچنین میتواند یک “علامت داخلی کرنل” روی بسته قرار دهد تا در جداول دیگر یا ابزارهای شبکهای برای پردازش بیشتر استفاده شود. این علامت تغییری در خود بسته ایجاد نمیکند، بلکه فقط در نمایش کرنل از بسته ثبت میشود.
جدول Raw
فایروال iptables
یک فایروال حالتمند (stateful) است، به این معنی که بستهها را بر اساس ارتباطشان با بستههای قبلی ارزیابی میکند. ویژگیهای رهگیری اتصال (connection tracking) که بر پایه netfilter
ساخته شدهاند، به iptables
این امکان را میدهند که بستهها را به عنوان بخشی از یک ارتباط یا جلسه در نظر بگیرد، نه به عنوان یک جریان جداگانه از بستههای بیارتباط. معمولاً منطق رهگیری اتصال خیلی زود پس از رسیدن بسته به رابط شبکه اعمال میشود.
جدول raw
یک عملکرد بسیار محدود و مشخص دارد. تنها هدف آن فراهم کردن مکانیزمی برای علامتگذاری بستهها بهمنظور خارج کردن آنها از فرآیند رهگیری اتصال است.
جدول Security
جدول security
برای تنظیم مارکرهای امنیتی SELinux روی بستهها استفاده میشود. این مارکرها تعیین میکنند که SELinux یا سایر سیستمهایی که قابلیت تفسیر این مارکرها را دارند، چگونه بستهها را پردازش کنند. این مارکرهای امنیتی میتوانند روی هر بسته یا کل یک ارتباط اعمال شوند.

روابط بین زنجیرهها و جدولها
اگر سه جدول دارای زنجیره PREROUTING
باشند، به چه ترتیبی ارزیابی میشوند؟
جدول زیر زنجیرههایی را که در هر جدول iptables
موجود هستند نشان میدهد. این جدول را از چپ به راست که بخوانیم، مشخص میشود که کدام زنجیرهها در هر جدول وجود دارند. برای مثال، میتوانیم ببینیم که جدول raw
دارای زنجیرههای PREROUTING
و OUTPUT
است. اگر از بالا به پایین خوانده شود، ترتیب پردازش زنجیرهها را زمانی که هوک netfilter
مربوطه فعال میشود، نمایش میدهد.
چند نکته قابل توجه است. در نمایش زیر، جدول nat
برای وضوح بیشتر به دو بخش تقسیم شده است:
DNAT
(تغییر آدرس مقصد بسته)SNAT
(تغییر آدرس مبدأ بسته)
همچنین، ردیفهایی برای نقاطی که تصمیمگیریهای مسیریابی انجام میشوند و ویژگی رهگیری اتصال فعال میشود، اضافه شدهاند تا نمای کاملی از فرایندها ارائه شود.
جداول ↓ / زنجیرهها → | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(تصمیمگیری مسیریابی) | ✓ | ||||
raw | ✓ | ✓ | |||
(رهگیری اتصال فعال میشود) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(تصمیمگیری مسیریابی) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
هنگامی که یک بسته هوک netfilte
r را فعال میکند، زنجیرههای مرتبط به ترتیب از بالا به پایین پردازش میشوند.
هوکهایی که یک بسته فعال میکند، به موارد زیر بستگی دارد.
- بسته ورودی یا خروجی باشد
- تصمیمات مسیریابی
- اینکه بسته از فیلترهای مشخص شده عبور کند یا نه
در برخی شرایط، یک زنجیره از یک جدول در طول پردازش نادیده گرفته میشود. برای مثال، فقط اولین بسته در یک اتصال با قوانین NAT بررسی میشود. تصمیمات NAT گرفتهشده برای اولین بسته به تمام بستههای بعدی در همان اتصال اعمال میشود و دیگر نیازی به ارزیابی مجدد نیست.
پاسخهای مربوط به اتصال NAT شده به طور خودکار قوانین معکوس NAT را اعمال میکنند تا مسیر بستهها به درستی تنظیم شود.
ترتیب عبور از زنجیرهها
اگر سرور بداند که چگونه یک بسته را مسیریابی کند و قوانین فایروال نیز اجازه عبور بسته را بدهند، مسیرهای زیر بسته به شرایط مختلف طی خواهند شد:
- بستههای ورودی که مقصدشان خود سرور است:
PREROUTING
->INPUT
- بستههای ورودی که باید به یک میزبان دیگر هدایت شوند:
PREROUTING
->FORWARD
->POSTROUTING
- بستههایی که در خود سرور ایجاد شدهاند:
OUTPUT
->POSTROUTING
با ترکیب اطلاعات بالا و ترتیب پردازش ارائهشده در جدول قبل، میتوان نتیجه گرفت:
یک بسته ورودی که مقصد آن سیستم محلی است، ابتدا در زنجیرههای PREROUTING
از جداول raw
, mangle
, nat
بررسی میشود. سپس، در زنجیرههای INPUT
از جداول mangle
, filter
, security
و nat
پردازش شده و در نهایت به سوکت محلی تحویل داده میشود.
قوانین IPTables
قوانین در یک زنجیره خاص از یک جدول خاص قرار میگیرند. زمانی که هر زنجیره فراخوانی میشود، بسته موردنظر بهترتیب با هر قانون در زنجیره بررسی میشود. هر قانون شامل دو بخش است.
- بخش تطبیق (Matching)
- بخش اقدام (Action یا Target)
تطبیق (Matching)
بخش تطبیق در یک قانون، معیارهایی را مشخص میکند که یک بسته باید داشته باشد تا اقدام مرتبط (یا همان Target) اجرا شود.
سیستم تطبیق در iptables
بسیار انعطافپذیر است و میتوان آن را با افزونههای iptables
به میزان زیادی گسترش داد. قوانین را میتوان بر اساس نوع پروتکل، آدرس مقصد یا مبدأ، پورت مقصد یا مبدأ، شبکه مقصد یا مبدأ، رابط ورودی یا خروجی، هدرها، وضعیت اتصال و بسیاری معیارهای دیگر ایجاد کرد. این معیارها را میتوان ترکیب کرد تا مجموعه قوانینی پیچیده برای تشخیص ترافیکهای مختلف ایجاد شود.
اهداف (Targets)
هدف یا Target به اقدامی اشاره دارد که در صورت تطبیق بسته با معیارهای یک قانون، اجرا میشود.
اهداف به دو دسته کلی تقسیم میشوند:
- اهداف خاتمهدهنده (Terminating Targets):
این نوع اهداف یک اقدام انجام میدهند که ارزیابی بسته را در زنجیره متوقف میکند و کنترل را بهnetfilter
hook بازمیگردانند. بسته به مقدار بازگشتی، ممکن است بسته حذف شود یا اجازه ادامه پردازش داده شود. - اهداف غیرخاتمهدهنده (Non-Terminating Targets):
این اهداف یک اقدام را انجام میدهند اما بررسی بسته در زنجیره ادامه پیدا میکند.
هر زنجیره باید در نهایت یک تصمیم خاتمهدهنده برای بسته بگیرد، اما هر تعداد هدف غیرخاتمهدهنده میتواند پیش از آن اجرا شود.
محدودیتها و شرایط استفاده از اهداف
در دسترس بودن اهداف مختلف به عوامل زیر بستگی دارد:
- جدول و نوع زنجیره ممکن است تعیین کند که کدام اهداف قابل استفاده هستند.
- افزونههای فعالشده در قانون نیز میتوانند در امکانپذیری استفاده از اهداف مختلف تأثیر بگذارند.
- عبارات تطبیق (Matching Clauses) که در قانون مشخص شدهاند، میتوانند محدوده اهداف قابل انتخاب را تغییر دهند.
پرش به زنجیرههای تعریفشده توسط کاربر
یک کلاس خاص از تارگتهای غیر پایانی وجود دارد که به آن تارگت پرش گفته میشود. تارگتهای پرش، اقداماتی هستند که باعث میشوند به یک چین دیگر برای ارزیابی بیشتر منتقل شود.
قبلا به چینهای داخلی اشاره شده است که به هوکهای nerfilter
متصل هستند و هنگام وقوع یک رویداد خاص، فعال میشوند. اما iptables
به مدیران سیستم این امکان را میدهد که چینهای مخصوص به خودشان را برای سازماندهی بهتر ایجاد کنند.
قوانین را میتوان در چینهای تعریفشده توسط کاربر به همان روش قرار داد که چینهای داخلی ثبت میشوند. تفاوت اینجا است که این چینها مستقیما توسط یک هوک netfilter
فعال نمیشوند، بلکه تنها از طریق یک پرش از قوانین دیگر قابل دسترس هستند.
چینهای تعریف شده توسط کاربر به عنوان امتداد چین فراخواننده عمل میکنند. به این معنا که اگر در این چینها لیست قوانین تا انتها پردازش شود یا یک قانون دارای تارگت RETURN
باشد، پردازش به چین فراخواننده بازمیگردد. همچنین، پردازش میتواند به چینهای تعریف شده دیگر نیز پرش کند.
این قابلیت باعث سازماندهی بهتر قوانین و فراهم کردن یک چارچوب انعطافپذیرتر برای مدیریت مسیرهای مختلف پردازش بستهها میشود.
IPTables و رهگیری اتصالات
در بخشهای قبلی، سیستم پیگیری اتصال (Connection Tracking) را که بر روی فریمورک netfilter
پیادهسازی شده است، هنگام بررسی جدول raw
و معیارهای تطبیق وضعیت اتصال معرفی کردیم. سیستم پیگیری اتصال به iptables اجازه میدهد که بستههای شبکه را در بستر یک اتصال فعال بررسی کرده و بر اساس آنها تصمیمگیری کند. این قابلیت، امکان اجرای عملیات Stateful را در iptables
فراهم میکند.
پیگیری اتصال خیلی زود پس از ورود بستهها به استک شبکه انجام میشود. تنها زنجیرههای جدول raw
و برخی بررسیهای اولیه، قبل از ارتباط بستهها با یک اتصال، پردازش میشوند.
سیستم هر بسته را با مجموعهای از اتصالات موجود مقایسه میکند. در صورت لزوم، وضعیت اتصال را بهروزرسانی کرده و در صورت نیاز، اتصال جدیدی را به سیستم اضافه میکند. بستههایی که در یکی از زنجیرههای جدول raw
با هدف NOTRACK
علامتگذاری شده باشند، از مراحل پیگیری اتصال عبور نمیکنند.
وضعیتهای موجود در سیستم پیگیری اتصال
اتصالاتی که توسط سیستم پیگیری اتصال مدیریت میشوند، میتوانند در یکی از وضعیتهای زیر قرار بگیرند.
NEW
: بستهای که به یک اتصال موجود مرتبط نیست اما بهعنوان اولین بسته معتبر تشخیص داده میشود، با این برچسب وارد سیستم میشود. این وضعیت هم برای پروتکلهای ارتباطمحور مانند TCP و هم برای پروتکلهای بدون اتصال مانند UDP اعمال میشود.ESTABLISHED
: یک اتصالNEW
زمانی به وضعیتESTABLISHED
تغییر میکند که یک پاسخ معتبر از سمت مقابل دریافت کند. برای TCP، این شامل دریافتSYN/ACK
است و برای UDP و ICMP، زمانی اتفاق میافتد که یک پاسخ با جابجایی آدرس مبدأ و مقصد بسته اصلی دریافت شود.RELATED
: بستههایی که بخشی از یک اتصال موجود نیستند اما به یک اتصال در سیستم مرتبط هستند، با برچسبRELATED
مشخص میشوند. این میتواند شامل اتصالات کمکی مانند اتصال انتقال داده در FTP یا پاسخهای ICMP به درخواستهای اتصال توسط پروتکلهای دیگر باشد.INVALID
: اگر یک بسته با هیچ اتصال فعالی مرتبط نباشد و همچنین برای ایجاد اتصال جدید مناسب نباشد، نتوان آن را شناسایی کرد، یا قابل مسیریابی نباشد، با وضعیتINVALID
علامتگذاری میشود.UNTRACKED
: اگر بستهای در یکی از زنجیرههای جدول raw بهگونهای تنظیم شده باشد که از پیگیری اتصال عبور کند، وضعیت آنUNTRACKED
خواهد بود.SNAT
: این یک وضعیت مجازی است که زمانی اعمال میشود که آدرس مبدأ بسته توسط عملیات NAT تغییر کرده باشد. سیستم پیگیری اتصال از این وضعیت استفاده میکند تا هنگام ارسال پاسخهای مربوطه، آدرس مبدأ را بازنویسی کند.DNAT
: این نیز یک وضعیت مجازی است که زمانی اعمال میشود که آدرس مقصد بسته توسط عملیات NAT تغییر کرده باشد. سیستم پیگیری اتصال از این وضعیت استفاده میکند تا هنگام مسیریابی بستههای پاسخ، آدرس مقصد را اصلاح کند.
وضعیتهای ذخیرهشده در سیستم پیگیری اتصال به مدیران شبکه امکان میدهد که قوانینی را برای نقاط خاصی از چرخه عمر یک اتصال تعریف کنند. این ویژگی، توانایی موردنیاز برای ایجاد قوانین ایمنتر و دقیقتر را فراهم میکند.

جمع بندی
فریمورک فیلتر بسته netfilter
و فایروال iptables
، پایهی اصلی اکثر راهکارهای فایروال در سرورهای لینوکسی هستند. netfilter
با قرارگیری در سطح پایین شبکه، امکان کنترل قدرتمند بستههای داده را فراهم میکند و iptables
از این قابلیتها برای اعمال سیاستهای امنیتی به هستهی سیستمعامل استفاده میکند. با درک نحوهی ارتباط این اجزا، میتوانید امنیت سرورهای خود را بهتر مدیریت کنید.
برای آشنایی بیشتر با نحوهی انتخاب سیاستهای مؤثر iptables
، میتوانید این راهنما را مطالعه کنید. همچنین، این منابع به شما در پیادهسازی قوانین iptables
کمک خواهند کرد.