سرور مجازی لینوکس : نگاهی ژرف به ساختار و معماری Iptables و Netfilter

اطلاعیه خودکار این مقاله ؛ این پست در ۹ سال پیش نوشته و منتشر شده است و اکنون شاید قوانین و ابزار ها تغییر پیدا کرده باشد. اگر میدانید این نوشته هنوز به کارتان می آید ،به خواندن ادامه دهید.

مقدمه

فایروال ها ابزارهای مهمی هستند که میتوان آنها را برای حفاظت از سرورها و زیرساخت ها در اکوسیستم لینوکس پیگربندی کرد و iptables هم یک فایروال بسیار رایج است که با netfilter در ارتباط است که آنهم چارچوبی است در هسته برای فیلترینگ بسته ها. برای مدیران سستم و کاربرانی که ساختار و معماری این سیستم ها را نمیدانند، ایجاد یک خط مشی مطمئن برای فایروال کاری دلهره آور است. نه فقط به خاطر سینتکس های مشکلش بلکه به خاطر تعداد بالای بخش های مرتبطی که در چارچوب (framework) موجود است.
در این مقاله به بررسی دقیق معماری iptables خواهیم پرداخت تا آن را برای کاربرانی قابل فهم تر سازیم که میخواهند خط مشی فایروال خود را به وجود بیاورند. در این مقاله در مورد چگونگی نحوه تعامل iptables با netfilterخواهیم گفت واینکه چگونه اجزای مختلف با هم جفت و جور میشوند تا سیستم فیلترینگ و mangling (دکوراسیون نام) قابل فهمی در اختیار بگذارند.

Netfilter و IPTables چیست؟

متداولترین نرم افزار فایروال مورد استفاده در لینوکس، iptables است که در تعامل با قلاب های فیلترینگ بسته که در انباره شبکه هسته لینوکس هستند کار میکند. این قلاب های هسته به نام چارچوب netfilter شناخته میشوند.
هر بسته ای که وارد سیستم شبکه میشود (ورودی یا خروجی) در مسیرش درون انباره، این قلاب ها را راه میاندازد که به برنامه ها اجازه میدهد با این قلاب ها رجیستر شوند تا در نقاط کلیدی با این ترافیک ورودی یا خروجی وارد تعامل شوند. ماژول های هسته که با iptables در ارتباط است، در این قلاب ها رجیستر میشوند تا اطمینان حاصل شود که ترافیک با شرایطی که توسط قانون های فایروال های وضع شده است، مطابقت داشته باشد.

قلاب های نت فیلتر

نت فیلتر پنج قلاب دارد که برنامه ها میتوانند با آنها رجیستر شوند. همچنانکه بسته در انباره پیش میرود، ماژول های هسته ای که با این قلاب ها رجیستر شده اند را راه میاندازند. اینکه یک بسته چه قلاب هایی را راه میاندازد، به اینها بستگی دارد: ورودی یا خروجی بودن بسته، مقصد بسته و اینکه آیا بسته در نقطه قبلی reject یا drop شده است.
این قلاب ها نقاط به خوبی تعریف شده گوناگونی را در انباره شبکه نمایندگی میکنند:
NF_IP_PRE_ROUTING :بلافاصله بعد از ورود هر ترافیک ورودی به انباره شبکه، این قلاب راه میافتد. قبل از اینکه هر تصمیم روتینگی در مورد محل ارسال بسته گرفته شود، این قلاب پردازش میشود.
NF_IP_LOCAL_IN :اگر بسته رو به مقصد سیستمی لوکال روت شود، بعدش این قلاب راه میافتد.
NF_IP_FORWARD :اگر بسته به میزبان دیگری روت شود، این قلاب راه میافتد.
NF_IP_LOCAL_OUT :هر ترافیک خروجی که در سیستم محلی ایجاد شده باشد، به محض برخورد با انباره شبکه، این قلاب راه میافتد.
NF_IP_POST_ROUTING :این قلاب توسط هر ترافیک خروجی یا فوروارد شده و پس از انجام روتینگ و درست قبل از اینکه بسته راهی کابل شود به راه میافتد.
آن دسته از ماژول های هسته که میخواهند به این قلاب ها رجیستر شوند باید شماره اولویتی (priority number) فراهم کنند تا به مشخص شدن ترتیب فراخوانی شان هنگام راه افتادن قلاب کمک کند.اینکار برای ماژول های مختلف ابزاری فراهم میکند تا با ترتیبی مشخص به هر کدام از آن قلاب ها متصل شوند. هر ماژول به نوبه خود فراخوانده میشود و بعد از اینکه پردازش مشخص کرد که با بسته چه باید کرد، تصمیمی را به چارچوب netfilterبرمیگرداند.

IPTables و زنجیره ها در سرور مجازی لینوکس

فایروال iptables‌ برای سازمان بخشیدن به قوانینش از جدول ها استفاده میکند. این جداول، قوانین را بر اساس نوع تصمیماتی که قبلاً گرفته شده است، طبقه بندی میکنند. مثلاً اگر قانونی با ترجمه آدرس شبکه (NAT) سروکار داشته باشد، در جدول nat قرار خواهد گرفت.اگر برای تصمیم اینکه بسته به مقصد خود برود از قانونی استفاده شود، احتمالاً به جدول filter اضافه خواهد شد.

درون هر جدول iptables، قانون هاتوسط زنجیرهایی (chain) بیشتر سازماندهی میشوند. در حالی که جدول ها با هدف کلیِ قانون ها تعریف میشوند، زنجیرهای درون آن، نماینده قلاب های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 راه میوفتد.

با کمک زنجیرها، مدیر سیستم میتواند کنترل کند که مسیر تحویل یک بسته (یعنی یک قانون) کجا ارزیابی شود. چون هر جدول چندین زنجیر دارد، پس یک جدول در چندین نقطه پردازش اعمال نفوذ میکند. از آنجایی که انواع خاصی از تصمیمات فقط در نقاط خاصی از انباره شبکه معنی میدهند، پس لزوماً هر جدولی هم دارای زنجیری نیست که با هر قلاب هسته رجیستر شود.

در مجموع فقط پنج قلابِ هستهِ netfilter وجود دارد پس زنجیرهایی از جدول های مختلف در هر کدام از قلاب ها رجیستر شده اند. مثلاً سه جدول دارای زنجیرهای PREROUTING هستند. وقنی این زنجیرها در قلاب مربوطه یعنی NF_IP_PRE_ROUTING رجیستر میشوند، اولویتی را مشخص میکنند که دستور میدهد زنجیر PREROUTING هر جدول با چه ترتیبی فراخوانده شوند. هر کدام از قانونهای داخل زنجیری که بالاترین اولویت را دارد، پشت سر هم ارزیابی میشوند و سپس نوبت زنجیر بعدی میشود.

جدول های موجود

حال کمی به عقب برگشته و به جدول های مختلفی که iptables در اختیارمان میگذارد نگاهی خواهیم انداخت که مجموعه قانون های متفاوتی را نمایندگی میکنند که بسته به حوزه وظایف شان در ارزیابی بسته ها سازمان یافته اند.

جدول فیلتر

این جدول یکی از پر استفاده ترین جداول iptables است.جدول فیلتر برای تصمیم گیری در این مورد است که آیا یک بسته به مسیرش به سمت مقصد تعیین شده ادامه دهد یا درخواستش رد شود. در زبان فایروال به این کار بسته های فیلترینگ میگویند. این جدول کاربردهای زیادی در اختیارمان میگذارد. همان کاربردهایی که وقتی صحبت از فایروال است به ذهنمان میایند.

 

جدول ترجمه آدرس های شبکه (NAT)

جدول NAT برای پیاده سازی قانون های ترجمه آدرس شبکه استفاده میشود.به محض ورود بسته به انباره شبکه، قانون های این جدول تعیین میکنند که آیا و چگونه آدرس مبدا و آدرس مقصد بسته تغییر کنند. غالباً برای تعیین مسیر بسته ها به سوی شبکه ها استفاده میشود وقتی که دسترسی مستقیم ممکن نباشد.

جدول Mangle

از این جدول برای تغییر آی پی هِدِر های بسته به طرق مختلف استفاده میشود. مثلاً میتوانید مقدار (TTL (Time To Live بسته را تنظیم کنید: کوتاه کردن یا طولانی کردن تعداد hop های معتبر شبکه که آن بسته میتواند داشته باشد. سایر آی پی هدر ها هم به همین طریق میتوانند تغییر کنند.

همچنین این جدول میتواند یک مارک داخلی هسته روی بسته بگذارد برای پردازش بعدی در جدول های بعدی و توسط سایر ابزارهای شبکه.این مارک تاثیری بر بسته ندارد ولی مارک را به نمایشی از بسته که توسط کرنل ارائه میشود، اضافه میکند.

 

جدول خام (Raw)

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

جدول خام کارکرد خیلی محدودی دارد. تنها هدفش فراهم کردن مکانیسمی است برای نشانه گذاری کردن بسته ها به منظور خارج کردنشان از پیگیری اتصال.

 

جدول امنیت (Security)

برای قرار دادن security context mark های داخلی SELinux روی بسته ها استفاده میشود که مشخص میکند SELinux یا سایر سیستم هایی که میتوانند security context های SELinux را تفسیر کنند، چگونه بسته ها را بکار گیرند. این مارک ها همچنین بر اساس هر بسته یا هر اتصال هم قابل انجام هستند.

چه زنجیرهایی در هر جدول بکار رفته اند؟

در مورد زنجیرها و جدول ها به صورت جداگانه صحبت کردیم. حال ببینیم که چه زنجیرهایی در هر جدول وجود دارد. تمرکزمان در این بحث این است که آشنایی بیشتری در مورد ترتیب ارزیابی زنجیرهایی داشته باشیم که همگی بر روی یک قلاب رجیستر شده اند. اگر سه جدول دارای زنجیرهای PREROUTING باشند، با چه ترتیبی ارزیابی انجام خواهد گرفت؟

در جدول پایین اگر از چپ به راست بخوانید، مشخص شده است که در هر جدول iptable چه زنجیرهایی موجود است. مثلاً میتوان گفت که جدول raw هر دو زنجیر PREROUTING و OUTPUT را دارد. اگر از بالا به پایین بخوانیم، ترتیب فراخوانی هر زنجیر وقتی که قلاب netfilter مربوطه اش راه میافتد را نشان میدهد.

چند چیز را باید به خاطر داشته باشید. در نمایه زیر، جدول nat به عملیات های DNAT (که آدرس مقصد بسته را تغییر میدهند) و عملیات های SNAT (که آدرس مبدا بسته را تغییر میدهند) تفکیک شده است تا ترتیب شان با وضوح بیشتری مشخص شود. همچنین سطرهایی را داخل جدول قرار داده ایم که نقاطیکه تصمیمات مسیردهی گرفته میشوند و اینکه کجاها پیگیری اتصال فعال میشود را نشان میدهد تا تصویری کلی از فرایند به دست آید:

Tables/Chains PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

 

به محض اینکه یک بسته قلاب netfilter را راه میاندازد، زنجیر مربوطه همانگونه که در جدول بالا از بالا به پایین مشخص شده است، پردازش میشود. قلاب هایی (ستون های جدول بالا) که یک بسته راه میاندازد به این موارد بستگی دارد: ورودی یا خروجی بودن بسته، تصمیمات مسیردهی و اینکه آیا بسته از معیارهای فیلترینگ قبول خواهد شد یا نه.
رویدادهای خاصی باعث میشوند که زنجیرِ جدولی حین پردازش از قلم بیافتد. مثلاً فقط اولین بسته در یک اتصال با قوانین NAT ارزیابی میشود. هر تصمیمِ NAT ای که برای اولین بسته گرفته شود، بر روی سایر بسته های آن اتصال هم اعمال خواهد شد و ارزیابی جدیدی صورت نخواهد گرفت. پاسخ ها به اتصال هایی که NAT شده اند، به صورت خودکار قوانین NATمعکوسی دارند تا مسیردهی به درستی انجام شود.

ترتیب پیمایش زنجیر

 

با فرض اینکه سرور میداند چگونه یک بسته را مسیریابی کند و اینکه قوانین فایروال اجازه‌ی این انتقال را می‌دهند، جریان‌های زیر نمایانگر مسیرهایی هستند که در شرایط مختلف پیموده می‌شوند:
• مقصد بسته‌های ورودی، سیستم محلی است: PREROUTING -> INPUT
• مقصد بسته‌های ورودی، یک هاست دیگر است: PREROUTING -> FORWARD -> POSTROUTING
• بسته‌هاییکه بصورت محلی ایجاد شده‌اند: OUTPUT -> POSTROUTING
اگر اطلاعات بالا را با ترتیب‌بندیِ ذکر شده در جدول قبل ترکیب کنیم، می‌توانیم ببینیم که بسته‌ی ورودی که مقصد آن سیستم محلی است، ابتدا در مقابل زنجیره‌های Prerouting در جدول‌های raw، mangle و nat ارزیابی می‌شود. این بسته‌ها سپس زنجیر‌های ورودیِ جدول های mangle، filter، security و nat را می‌پیمایند تا در نهایت به سوکت محلی برسند.

قوانین IPTables

قوانین داخل یک زنجیر‌ بخصوص در یک جدول بخصوص قرار می‌ گیرند. وقتی یک زنجیر فراخوانده می‌ شود، بسته ‌ی مورد نظر در مقابل تک تک قوانین چک می‌شود. هر قانون یک جزء تطبیق (matching) و یک جزء کنش (action) دارد.

تطبیق

بخشِ تطبیق هر قانون، مشخص می‌کند که هر بسته باید دارای چه معیارهایی باشد تا یک کنش (و یا هدف) مربوطه قابل اجرا باشد.

سیستم تطبیق بسیار انعطاف ‌پذیر است و می‌توان آنرا توسط پسوند‌های iptables موجود در سیستم بطرز قابل توجهی گسترش داد. می‌توان قوانین را طوری ایجاد کرد که در کنار بقیه ی ویژگی ها، بر اساس نوع پروتکل، آدرس مبدا و یا مقصد، پورت مبدا و مقصد، شبکه ی مبدا و یا مقصد، رابط ورودی و یا خروجی، هِدرها، و یا وضعیت اتصال نیز تطبیق را انجام دهد.از ترکیب این موارد می‌توان مجموعه‌ قوانین پیچیده ای ایجاد کرد که ترافیک های مختلف را از هم تمایز دهد.

هدف

هدف در واقع کنشی است که زمانی آغاز می‌شود که یک بسته با معیارهای تطبیقِ یک قانون مطابقت داشته باشد.قوانین معمولا به دو گروه تقسیم می شوند:

هدف terminating: این هدف ها مسئول انجام کاری هستند که باعث پایان ارزیابی در داخل زنجیر می شود و کنترل را به قلاب netfilter باز می گرداند. بر اساس مقادیر بازگشت تعیین شده، ممکن است قلاب بسته را رها کند و یا به بسته این اجازه را دهد که به مرحله ی بعدی پردازش وارد شود.
هدف non-terminating: این هدف ها مسئول انجام کارهایی هستند و ارزیابی در داخل زنجیره را ادامه می دهند. با وجود اینکه هر زنجیره در نهایت باید یک تصمیم terminating ( پایان) بگیرد، تعداد نامحدودی از هدف های non-terminating قبل از آن قابل اجرا هستند.
موجود بودن و دسترسی داشتن به هر هدف در قوانین بستگی به زمینه (context) دارند. به عنوان مثال، نوع جدول و زنجیر می‌توانند به هدف ها فرمان در دسترس بودن بدهند. پسوندهای فعال شده داخل هر فرمان و جزء تطبیق نیز می توانند بر دسترسی هدف ها تاثیر بگذارند.
پریدن به زنجیر های تعریف شده توسط کاربر
نیاز است به دسته ی خاصی از هدف های non-terminating اشاره کنیم: هدف پرش. هدف پرش کنشی است که به حرکت ارزیابی از یک زنجیر به زنجیری دیگر برای پردازش بیشتر می انجامد. قبلا بطور مفصل در مورد زنجیر های built-in که به قلاب های netfilter که آنها را فرا می خوانند بشدت گره خورده اند، صحبت کردیم. با این وجود، iptables نیز به مدیران خود این اجازه را می دهد که زنجیرهایی را برای مقاصد سازمانی ایجاد کنند.

قوانین را می توان درست به همان شکل که در داخل زنجیر های built-in قرار داده می شوند، در زنجیرهای تعریف شده توسط کاربر نیز قرار داد. تنها تفاوت در این است که تنها راه دسترسی به زنجیرهای تعریف شده توسط کاربر، پریدن به آنها از یک قانون است ( خود آنها توسط یک قلاب netfilter رجیستر نشده اند).

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

Iptables و ردیابی اتصال

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

به فاصله بسیار کوتاهی پس از ورود بسته ها با انباره ی شبکه، ردیابی اتصال اعمال می شود. قبل از ربط دادن یک بسته به یک اتصال، زنجیرهای جدول raw و تعدادی تست امنیتیِ پایه تنها کارهایی هستند که انجام می شوند.
سیستم هر بسته را در مقابل گروهی از اتصال های موجود چک می کند. در صورت نیاز، سیستم وضعیت اتصال را آپگرید می کند و در صورت نیاز، اتصال جدید به سیستم اضافه می کند. بسته هایی که با هدفِ NOTRACK در یکی از زنجیرهای raw نشانه گزاری شده اند، اقدامات روتین ردیابی اتصال روی آنها انجام نمی شود.

حالت های موجود

اتصال هایی که توسط سیستم ردیابی اتصال ردیابی می شوند، در یکی از حالت های زیر قرار دارند:
جدید (new): وقتی بسته ای که به هیچ یک از اتصال های موجود مربوط نیست و در عین حال به عنوان یک بسته ی اول نامعتبر نیست، وارد می شود، اتصال جدیدی با این لیبل به سیستم اضافه می شود. این اتفاق هم در مورد پروتکل‌ های آگاه به اتصال مانند TCP و هم در مورد پروتکل های بدون اتصال مانند UDP رخ می دهد.
برقرار (established): وقتی که اتصال یک پاسخ معتبر از جهت مخالف دریافت کرد، حالت آن از new به established تغییر می کند.این تغییر برای اتصال های TCP به معنی SYN/ACK و برای UDP و ترافیک ICMP به معنیِ پاسخی است که در آن جای مبدا و مقصد بسته با هم عوض شده اند.
مربوط (related): بسته هایی که بخشی از یک اتصال موجود نیستند اما به یکی از اتصال های داخل سیستم مربوط هستند، برچسب related میگیرند. این می‌تواند یک اتصال کمکی باشد مانند اتصال های انتقال داده ی FTP، و یا پاسخ های ICMP به تلاش برای اتصال توسط دیگر پروتکل ها.
نامعتبر (invalid) : بسته هایی که به هیچ یک از اتصال های موجود مربوط نیستند و برای باز کردن یک اتصال جدید مناسب نیستند، بسته هایی که قابل شناسایی نیستند و یا به دلایل دیگر قابل مسیریابی نیستند، با این برچسب دسته بندی می شوند.
• ردیابی نشده (untracked): بسته هایی که در زنجیره ی جدول raw طوری هدف گذاری شده اند که از ردیابی مستثنی باشند، در این بخش قرار می گیرند.
SNAT: یک حالتِ مجازی وقتی که آدرس مبدا توسط عملیات NAT تغییر داده شده است. این حالت توسط سیستم ردیابی اتصال استفاده می شود تا بداند که در چه بسته های پاسخی باید آدرس مبدا را تغییر دهد.
DNAT: یک حالتِ مجازی وقتی که آدرس مقصد توسط عملیات NAT تغییر داده شده است. این حالت توسط سیستم ردیابی اتصال استفاده می شود تا بداند که در چه بسته های پاسخی باید آدرس مقصد را تغییر دهد.
حالت های ردیابی شده توسط سیستم ردیابی اتصال به مدیران این اجازه را می دهد که قوانینی ایجاد کنند تا نکات خاصی را در طول عمر یک اتصال هدف قرار دهند. از این طریق قابلیتِ مورد نیاز برای قوانین جامع تر و امن تر بدست می آیند.

نتیجه

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

 

منبع

ترجمه شده توسط : بابک طهماسبی (تیم کندوهاست)

لینک کوتاه مطلب :

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*