Product SiteDocumentation Site

14.2. فایروال یا فیلترینگ بسته

فایروال یک دروازه فیلترینگ شبکه است که تنها برای بسته‌های ارسالی از میان آن کاربرد دارد. بنابراین، در صورتی که عبور از فایروال تنها مسیر موجود برای این بسته‌ها باشد موثر خواهد بود.
نبود یک پیکربندی استاندارد (و شعار “فرآیند، نه محصول”) نبود یک راهکار جامع را توضیح می‌دهد. اگرچه، ابزارهایی وجود دارند که پیکربندی فایروال netfilter با یک نمایش گرافیکی از قوانین فیلترینگ ساده می‌کنند. fwbuilder بدون شک یکی از بهترین آن‌ها است.
کرنل لینوکس شامل فایروال netfilter می‌باشد. این نرم‌افزار می‌تواند از فضای کاربری توسط دستورات iptables و ip6tables کنترل شود. تفاوت این دو دستور در نحوه عملکرد آن‌ها روی شبکه‌های IPv4 و IPv6 است. از آنجا که این دو پروتکل شبکه برای سالیان طولانی کار خواهند کرد، نیاز است که از هر دو ابزار به صورت موازی استفاده کنیم.

14.2.1. عملکرد Netfilter

netfilter از چهار جدول متمایز برای ذخیره‌سازی قوانین مرتبط با سه نوع عملیات روی بسته‌ها استفاده می‌کند:
  • ... برای قوانین فیلترینگ بکار می‌رود (دریافت، امتناع یا رد یک بسته)؛
  • nat برای ترجمه نشانی‌های مبدا، مقصد و درگاه‌های مرتبط با بسته بکار می‌رود؛
  • mangle برای سایر تغییرات اعمال شده در بسته‌های IP بکار می‌رود (از جمله فیلد Type of Service و گزینه‌های دیگر)؛
  • raw امکان سایر تغییرات دستی روی بسته‌ها قبل از اینکه به سیستم رهگیری ارتباط برسند را فراهم می‌کند.
هر جدول شامل فهرستی از قوانین بنام زنجیره است. فایروال با استفاده از زنجیره‌های استاندارد بسته‌هایی را که در شرایط خاصی قرار می‌گیرند مدیریت می‌کند. مدیر سیستم می‌تواند زنجیره‌های دیگری را ایجاد کند، که تنها در صورت ارجاع از یک زنجیره استاندارد (به صورت مستقیم یا غیرمستقیم) مورد استفاده قرار می‌گیرند.
جدول filter دارای سه زنجیره استاندارد است:
  • INPUT: به بسته‌هایی مربوط می‌شود که مقصدشان خود فایروال باشد؛
  • OUTPUT: به بسته‌های ارسال شده از طرف فایروال مربوط می‌شود؛
  • FORWARD: به بسته‌هایی مربوط می‌شود که از میان فایروال می‌گذرند (بسته‌هایی که مبدا یا مقصد فایروال نباشند).
جدول nat نیز دارای سه زنجیره استاندارد است:
  • PREROUTING: برای تغییر بسته‌ها به محض رسیدن به فایروال؛
  • POSTROUTING: برای تغییر بسته‌ها زمانی که آماده ارسال از فایروال باشند؛
  • OUTPUT: برای تغییر بسته‌هایی که از خود فایروال تولید شده‌اند.
چگونگی نامگذاری زنجیره‌های netfilter

شكل 14.1. چگونگی نامگذاری زنجیره‌های netfilter

هر زنجیره فهرستی از قوانین است؛ هر قانون مجموعه‌ای از شرایط و اقدامات لازم در صورت برآورده شدن شرط مربوطه است. هنگام پردازش یک بسته، فایروال اقدام به پویش زنجیره مرتبط با آن می‌کند که هر قانون پس از دیگری فراخوانده می‌شود؛ زمانی که شرایط یک قانون برآورده شود، فرآیند به اقدام مربوط به آن “پرش” (گزینه -j در دستورات) کرده تا پردازش ادامه یابد. متداول‌ترین عملکردها به صورت استاندارد هستند که اقدامات اختصاصی مربوط به خود را دارا هستند. استفاده یکی از این اقدامات استاندارد منجر به مختل شدن پردازش زنجیره می‌شود، چرا که سرنوشت بسته از این لحظه رقم خورده است (بجز استثنایی که در ادامه می‌آید):
  • ACCEPT: اجازه ادامه مسیر به بسته را می‌دهد؛
  • REJECT: بسته را همراه با یک خطای ICMP رد می‌کند (گزینه --reject-with type برای iptables امکان انتخاب نوع خطا را فراهم می‌کند)؛
  • DROP: منجر به حذف (نادیده گرفتن) بسته می‌شود؛
  • LOG: همراه با یک پیام و توضیحات بسته و استفاده از syslogd آن را گزارش می‌کند؛ به یاد داشته باشید که این اقدام پردازش را مختل نمی‌کند و اجرای زنجیره ادامه می‌یابد، به همین دلیل است که عملیات گزارش از بسته‌های شامل قانون LOG و REJECT/DROP امتناع می‌کند؛
  • ULOG: یک پیام را با استفاده از ulogd گزارش می‌کند، که برای مدیریت تعداد بالای پیام نسبت به syslogd عملکرد بهتری دارد؛ به یاد داشته باشید که این اقدام نیز مانند LOG پردازش را به قانون بعدی موجود در زنجیره می‌سپارد؛
  • chain_name: به زنجیره اشاره شده پرش کرده و قوانین آن را ارزیابی می‌کند؛
  • RETURN: پردازش زنجیره فعلی را متوقف کرده و به زنجیره فراخوان باز می‌گردد؛ در حالتی که زنجیره فعلی از نوع استاندارد باشد، فراخوان دیگری وجود ندارد بنابراین اقدام پیشفرض (که با گزینه -P در iptables مشخص می‌شود) بجای آن اجرا می‌شود؛
  • SNAT (فقط در جدول nat): Source NAT را اعمال می‌کند (گزینه‌های اضافی که تغییرات مورد نظر را شامل می‌شوند)؛
  • DNAT (فقط در جدول nat): Destination NAT را اعمال می‌کند (گزینه‌های اضافی که تغییرات مورد نظر را شامل می‌شوند)؛
  • MASQUERADE (فقط در جدول nat): masquerading را اعمال می‌کند (یک مورد بخصوص از Source NAT
  • REDIRECT (فقط در جدول nat): یک بسته را به درگاه داده شده از خود فایروال هدایت می کند؛ از این گزینه می‌توان برای راه‌اندازی یک پروکسی وب بدون هیچ پیکربندی در سمت برنامه کاربردی استفاده کرد، چرا که برنامه فکر می‌کند به صورت مستقیم به گیرنده متصل شده در حالی که از طریق پروکسی این ارتباط برقرار شده است.
سایر اقدامات، بخصوص آن‌هایی که مرتبط با جدول mangle هستند، خارج از محدوده این متن می‌باشند. صفحات راهنمای iptables(8) و ip6tables(8) فهرستی از این اقدامات را شامل می‌شوند.

14.2.2. شیوه نگارش iptables و ip6tables

دستورات iptables و ip6tables امکان تغییر جدول‌ها، زنجیره‌ها و قوانین را فراهم می‌سازند. گزینه -t table مشخص می‌کند که عملیات روی کدام جدول انجام شود (به صورت پیشفرض، filter).

14.2.2.1. دستورات

گزینه -N chain یک زنجیره جدید ایجاد می‌کند. گزینه -X chain یک زنجیره خالی و بدون استفاده را حذف می‌کند. گزینه -A chain rule یک قانون به انتهای زنجیره اشاره شده اضافه می‌کند. گزینه -I chain rule_num rule یک قانون قبل از قانون شماره rule_num درج می‌کند. گزینه -D chain rule_num یا -D chain rule یک قانون را از زنجیره حذف می‌کند؛ عبارت اول قانون را بر اساس شماره، در حالی که عبارت دوم قانون را بر اساس محتوا شناسایی می‌کند. گزینه -F chain یک زنجیره را پاکسازی (حذف تمام قوانین) می‌کند؛ اگر زنجیره‌ای مشخص نشود، تمام قوانین موجود در جدول حذف می‌شوند. گزینه -L chain فهرستی از قوانین موجود در زنجیره را نمایش می‌دهد. در نهایت، گزینه -P chain action اقدام یا “خط مشی” پیشفرض برای یک زنجیره را مشخص می‌کند؛ به یاد داشته باشید که تنها زنجیره‌های استاندارد می‌توانند چنین خط مشی داشته باشند.

14.2.2.2. قوانین

هر قانون به صورت conditions -j action action_options بیان می‌شود. اگر از چندین شرایط در یک قانون استفاده شود، آنگاه معیار پیوستگی (and منطقی) شرایط خواهد بود، که به اندازه هر یک از شرایط می‌تواند محدودکننده باشد.
شرط -p protocol با فیلد پروتکل از بسته IP منطبق است. متداول‌ترین مقادیر آن عبارتند از tcp، udp، icmp و icmpv6. قرار دادن یک علامت تعجب قبل از شرط منجر به منفی شدن مفهوم آن می‌گردد، که به معنای “هر بسته‌ای با پروتکل مختلف بجز گزینه اشاره شده” خواهد بود. این مکانیزم منفی‌سازی مختص به گزینه ... نیست و می‌تواند در مورد سایر شرایط نیز بکار رود.
شرط -s address یا -s network/mask با نشانی مبدا از بسته منطبق است. به همین ترتیب، شرط -d address یا -d network/mask با نشانی مقصد از بسته منطبق است.
شرط -i interface بسته‌هایی را انتخاب می‌کند که از رایط شبکه اشاره شده دریافت شوند. شرط -o interface بسته‌هایی را انتخاب می‌کند که به رابط شبکه اشاره شده ارسال شوند.
علاوه بر شرایط عمومی اشاره شده، شرایط بخصوصی نیز وجود دارند. برای نمونه، شرط -p tcp می‌تواند مکمل شرایط درگاه TCP باشد، با بندهایی نظیر --source-port port و --destination-port port.
شرط --state state با وضعیت یک بسته در یک ارتباط منطبق است (اینکار نیازمند ماژول کرنل ipt_conntrack برای رهگیری ارتباط است). حالت NEW بسته‌ای با ارتباط جدید را تعریف می‌کند؛ حالت ESTABLISHED منطبق با بسته‌هایی است که به یک ارتباط موجود متعلق باشند و حالت RELATED منطبق با بسته‌هایی است که از یک ارتباط موجود نشات می‌گیرند (که در مورد ارتباط‌های ftp-data در حالت “active” از پروتکل FTP کاربرد دارد).
قسمت قبل به توضیح اقدامات موجود پرداخت، ولی نه گزینه‌های مربوط به آن. برای نمونه، اقدام LOG گزینه‌های زیر را شامل می‌شود:
  • --log-level، با مقدار پیشفرض warning، سطح شدت syslog را مشخص می‌کند؛
  • --log-prefix امکان مشخص کردن یک متن پیشوند برای تفاوت قائل شدن بین پیام‌های گزارش شده را فراهم می‌کند؛
  • --log-tcp-sequence، --log-tcp-options و --log-ip-options داده اضافی برای ادغام شدن درون پیام را مشخص می‌کند: به ترتیب، شماره ترتیبی TCP، گزینه‌های TCP و گزینه‌های IP.
اقدام DNAT گزینه --to-destination address:port را به منظور نشانی IP جدید مقصد و/یا درگاه مشخص می‌کند. به طور مشابه، اقدام SNAT گزینه --to-source address:port را به منظور نشانی IP جدید مبدا و/یا درگاه مشخص می‌کند.
اقدام REDIRECT (که تنها در صورت موجود بودن NAT استفاده می‌شود) گزینه --to-ports port(s) را برای مشخص کردن درگاه یا محدوده درگاهی که بسته‌ها باید به آن هدایت شوند بکار می‌برد.

14.2.3. ایجاد قوانین

ایجاد هر قانون مستلزم فراخوانی یکی از دستورات iptables یا ip6tables است. نوشتن این دستورات به صورت دستی می‌تواند خسته کننده باشد، از این رو فراخوانی آن‌ها معمولا از طریق یک اسکریپت در زمان راه‌اندازی اولیه به صورت خودکار صورت می‌گیرد. این اسکریپت می‌تواند به صورت دستی نوشته شود اما ابزار جالب و پیشرفته‌تری برای اینکار وجود دارد که fwbuilder نامیده می‌شود.
# apt install fwbuilder
اصول آن ساده است. در گام اول، باید مشخص گردد از چه عناصری در ایجاد قوانین استفاده می‌شود:
  • خود فایروال، همراه با رابط‌های شبکه‌اش؛
  • شبکه‌ها، همراه با محدوده‌های IP مشخص؛
  • سرورها؛
  • درگاه‌های متعلق به سرویس‌های موجود در سرورها.
سپس قوانین می‌توانند با عملیات ساده کشیدن و رهاکردن روی اشیاء موجود ایجاد گردند. چندین منوی زمینه‌ای می‌توانند شرایط را تغییر دهند (برای نمونه، منفی کردن یک شرط). در این مرحله است که اقدام مورد نظر باید انتخاب و پیکربندی شود.
تا آنجا که به IPv6 مرتبط است، می‌توان دو مجموعه قانون مختلف برای IPv4 و IPv6 ایجاد کرد یا با ایجاد یکی از آن‌ها و استفاده از fwbuilder نسبت به ترجمه دیگری همراه با نشانی‌های منتسب به اشیاء اقدام کرد.
پنجره اصلی fwbuilder

شكل 14.2. پنجره اصلی fwbuilder

fwbuilder می‌تواند برای تولید اسکریپتی استفاده شود که پیکربندی فایروال مبتنی بر قوانین تعریف شده را در خود داشته باشد. معماری ماژولار آن باعث می‌شود که توانایی ایجاد اسکریپت برای چندین سیستم مختلف وجود داشته باشد (iptables برای لینوکس، ipf برای FreeBSD و pf برای OpenBSD).

14.2.4. اجرای قوانین در هر مرتبه راه‌اندازی

در سایر موارد، روش توصیه شده ثبت اسکریپت پیکربندی در یک عبارت up از فایل /etc/network/interfaces است. در مثال زیر، اسکریپت /usr/local/etc/arrakis.fw ذخیره‌سازی شده است.

مثال 14.1. فایل interfaces که اسکریپت فایروال را فراخوانی می‌کند

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw
تصور بر این است که از ifupdown برای پیکربندی رابط‌های شبکه استفاده می‌کنید. اگر از ابزار دیگری برای اینکار بهره می‌برید (مانند NetworkManager یا systemd-networkd)، بهتر است به مستندات آن‌ها مراجعه کرده تا روش فراخوانی اسکریپت پس از بالا آمدن رابط را پیدا کنید.