Product SiteDocumentation Site

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

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

14.2.1. عملکرد Netfilter

netfilter از چهار جدول متمایز برای ذخیره‌سازی قوانین مرتبط با سه نوع عملیات روی بسته‌ها استفاده می‌کند:
  • ... برای قوانین فیلترینگ بکار می‌رود (دریافت، امتناع یا رد یک بسته)؛
  • nat برای ترجمه نشانی‌های مبدا، مقصد و درگاه‌های مرتبط با بسته بکار می‌رود؛
  • mangle برای سایر تغییرات اعمال شده در بسته‌های IP بکار می‌رود (از جمله فیلد Type of Service و گزینه‌های دیگر)؛
  • raw امکان سایر تغییرات دستی روی بسته‌ها قبل از اینکه به سیستم رهگیری ارتباط برسند را فراهم می‌کند.
  • security is used for Mandatory Access Control networking rules, implemented by Linux Security Modules such as SELinux.
هر جدول شامل فهرستی از قوانین بنام زنجیره است. فایروال با استفاده از زنجیره‌های استاندارد بسته‌هایی را که در شرایط خاصی قرار می‌گیرند مدیریت می‌کند. مدیر سیستم می‌تواند زنجیره‌های دیگری را ایجاد کند، که تنها در صورت ارجاع از یک زنجیره استاندارد (به صورت مستقیم یا غیرمستقیم) مورد استفاده قرار می‌گیرند.
جدول filter دارای سه زنجیره استاندارد است:
  • INPUT: به بسته‌هایی مربوط می‌شود که مقصدشان خود فایروال باشد؛
  • OUTPUT: به بسته‌های ارسال شده از طرف فایروال مربوط می‌شود؛
  • FORWARD: به بسته‌هایی مربوط می‌شود که از میان فایروال می‌گذرند (بسته‌هایی که مبدا یا مقصد فایروال نباشند).
جدول nat نیز دارای سه زنجیره استاندارد است:
  • PREROUTING: برای تغییر بسته‌ها به محض رسیدن به فایروال؛
  • POSTROUTING: برای تغییر بسته‌ها زمانی که آماده ارسال از فایروال باشند؛
  • INPUT: to modify packets destined for local sockets;
  • OUTPUT: برای تغییر بسته‌هایی که از خود فایروال تولید شده‌اند.
چگونگی نامگذاری زنجیره‌های netfilter

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

هر زنجیره فهرستی از قوانین است؛ هر قانون مجموعه‌ای از شرایط و اقدامات لازم در صورت برآورده شدن شرط مربوطه است. هنگام پردازش یک بسته، فایروال اقدام به پویش زنجیره مرتبط با آن می‌کند که هر قانون پس از دیگری فراخوانده می‌شود؛ زمانی که شرایط یک قانون برآورده شود، فرآیند به اقدام مربوط به آن “پرش” (گزینه -j در دستورات) کرده تا پردازش ادامه یابد. متداول‌ترین عملکردها به صورت استاندارد هستند که اقدامات اختصاصی مربوط به خود را دارا هستند. استفاده یکی از این اقدامات استاندارد منجر به مختل شدن پردازش زنجیره می‌شود، چرا که سرنوشت بسته از این لحظه رقم خورده است (بجز استثنایی که در ادامه می‌آید):
  • ACCEPT: اجازه ادامه مسیر به بسته را می‌دهد؛
  • REJECT: بسته را همراه با یک خطای ICMP رد می‌کند (گزینه --reject-with type برای iptables امکان انتخاب نوع خطا را فراهم می‌کند)؛
  • DROP: منجر به حذف (نادیده گرفتن) بسته می‌شود؛
  • LOG: همراه با یک پیام و توضیحات بسته و استفاده از syslogd آن را گزارش می‌کند؛ به یاد داشته باشید که این اقدام پردازش را مختل نمی‌کند و اجرای زنجیره ادامه می‌یابد، به همین دلیل است که عملیات گزارش از بسته‌های شامل قانون LOG و REJECT/DROP امتناع می‌کند؛
  • NFLOG: log a message via the loaded logging backend (usually nfnetlink_log), which can be better adapted and more efficient than syslogd for handling large numbers of messages; note that this action, like LOG, also returns processing to the next rule in the calling chain;
  • 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. دستورات

The -N chain option creates a new chain. The -X chain deletes an empty and unused chain. The -A chain rule adds a rule at the end of the given chain. The -I chain rule_num rule option inserts a rule before the rule number rule_num. The -D chain rule_num (or -D chain rule) option deletes a rule in a chain; the first syntax identifies the rule to be deleted by its number, while the latter identifies it by its contents. The -F chain option flushes a chain (deletes all its rules); if no chain is mentioned, all the rules in the table are deleted. The -L chain option lists the rules in the chain; if no chain is mentioned, all chains are listed. Finally, the -P chain action option defines the default action, or “policy”, for a given chain; note that only standard chains can have such a policy.

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)، بهتر است به مستندات آن‌ها مراجعه کرده تا روش فراخوانی اسکریپت پس از بالا آمدن رابط را پیدا کنید.