FIREWALLD.DIRECT(5) firewalld.direct FIREWALLD.DIRECT(5)

firewalld.direct - پرونده پیکربندی مستقیم firewalld

/etc/firewalld/direct.xml

رابط مستقیم (direct interface) منسوخ شده است. این قابلیت در نسخه‌های آینده حذف خواهد شد و سیاست‌ها جایگزین آن شده‌اند؛ نگاه کنید به firewalld.policies(5).

پیکربندی مستقیم، دسترسی مستقیم‌تری به فایروال فراهم می‌کند. این ویژگی مستلزم آن است که کاربر با مفاهیم پایه‌ای ip(6)tables و ebtables آشنا باشد، مانند table (filter/mangle/nat/...)، chain (INPUT/OUTPUT/FORWARD/...)، commands (-A/-D/-I/...)، parameters (-p/-s/-d/-j/...) و targets (ACCEPT/DROP/REJECT/...). پیکربندی مستقیم فقط باید به عنوان آخرین راهکار و زمانی که امکان استفاده از firewalld.zone(5) وجود ندارد به کار گرفته شود. همچنین نگاه کنید به Direct Options در firewall-cmd(1).

یک پرونده پیکربندی مستقیم firewalld حاوی اطلاعاتی درباره زنجیره‌ها (chains)، قواعد (rules) و عبور مستقیم (passthrough) دائمی است.

ساختار پرونده پیکربندی مستقیم به صورت زیر است:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  [ <chain ipv="ipv4|ipv6|eb" table="table" chain="chain"/> ]
  [ <rule ipv="ipv4|ipv6|eb" table="table" chain="chain" priority="priority"> args </rule> ]
  [ <passthrough ipv="ipv4|ipv6|eb"> args </passthrough> ]
</direct>

تگ‌های اجباری شروع و پایان direct، پیکربندی مستقیم را مشخص می‌کنند. این تگ تنها یک بار در هر پرونده پیکربندی مستقیم می‌تواند استفاده شود. این تگ هیچ مشخصه‌ای (attribute) ندارد.

یک تگ عنصری خالی اختیاری است و می‌تواند چندین بار استفاده شود. از این تگ می‌توان برای تعریف نام زنجیره‌های اضافی استفاده کرد. هر مدخل chain دقیقاً دارای سه مشخصه است:

ipv="ipv4|ipv6|eb"

خانواده پروتکل IP که زنجیره در آن ایجاد خواهد شد. این مقدار می‌تواند یکی از مقادیر ipv4، ipv6 یا eb باشد.

table="table"

نام جدولی که زنجیره در آن ایجاد خواهد شد. این جدول می‌تواند یکی از جدول‌های قابل استفاده برای iptables، ip6tables یا ebtables باشد. برای مقادیر مجاز، بخش TABLES را در صفحات راهنمای iptables، ip6tables یا ebtables ببینید.

chain="chain"

نام زنجیره‌ای که قرار است ایجاد شود. لطفاً اطمینان حاصل کنید که زنجیره دیگری با همین نام از قبل وجود نداشته باشد.

لطفاً به یاد داشته باشید که برای متصل کردن این زنجیره به یک زنجیره دیگر، یک قاعده یا قاعده عبور مستقیم با گزینه --jump یا --goto اضافه کنید.

یک تگ عنصری اختیاری است و می‌تواند چندین بار استفاده شود. از این تگ می‌توان برای افزودن قواعد به یک زنجیره توکار (built-in) یا زنجیره اضافه‌شده استفاده کرد. هر مدخل rule دقیقاً دارای چهار مشخصه است:

ipv="ipv4|ipv6|eb"

خانواده پروتکل IP که قاعده به آن اضافه خواهد شد. این مقدار می‌تواند یکی از مقادیر ipv4، ipv6 یا eb باشد.

table="table"

نام جدولی که قاعده به آن اضافه خواهد شد. این جدول می‌تواند یکی از جدول‌های قابل استفاده برای iptables، ip6tables یا ebtables باشد. برای مقادیر مجاز، بخش TABLES را در صفحات راهنمای iptables، ip6tables یا ebtables ببینید.

chain="chain"

نام زنجیره‌ای که قاعده به آن اضافه خواهد شد. این زنجیره می‌تواند یک زنجیره توکار یا زنجیره‌ای باشد که با تگ chain ایجاد شده است. اگر نام زنجیره، یک زنجیره توکار باشد، قاعده به chain_direct اضافه می‌شود، در غیر این صورت از همان نام زنجیره ارائه‌شده استفاده می‌گردد. chain_direct به صورت داخلی برای تمامی زنجیره‌های توکار ایجاد می‌شود تا تضمین کند قواعد اضافه‌شده با قواعد ایجادشده توسط firewalld تداخل پیدا نمی‌کنند.

priority="priority"

اولویت برای ترتیب‌بندی قواعد به کار می‌رود. اولویت ۰ به معنای افزودن قاعده در بالای زنجیره است و با افزایش مقدار اولویت، قاعده در رده‌های پایین‌تر قرار می‌گیرد. قواعدی که اولویت یکسانی دارند در یک سطح قرار می‌گیرند و ترتیب آن‌ها ثابت نیست و ممکن است تغییر کند. اگر می‌خواهید مطمئن شوید که یک قاعده بعد از قاعده دیگری اعمال می‌شود، برای اولی اولویت پایین‌تر و برای بعدی اولویت بالاتر تعیین کنید.

مؤلفه args می‌تواند هر آرگومانی از iptables یا ip6tables باشد که با مشخصه‌های table یا chain تعارض نداشته باشد.

یک تگ عنصری اختیاری است و می‌تواند چندین بار استفاده شود. از این تگ می‌توان برای افزودن قواعد به یک زنجیره توکار یا اضافه‌شده استفاده کرد. هر مدخل passthrough دقیقاً دارای یک مشخصه است:

ipv="ipv4|ipv6|eb"

خانواده پروتکل IP که قاعده عبور مستقیم به آن اضافه خواهد شد. این مقدار می‌تواند یکی از مقادیر ipv4، ipv6 یا eb باشد.

مؤلفه args می‌تواند هر آرگومانی از iptables یا ip6tables باشد.

قاعده عبور مستقیم (passthrough) مستقیماً به زنجیره اضافه می‌شود. هیچ سازوکاری مشابه rule مستقیم در بالا برای آن وجود ندارد. کاربر قاعده عبور مستقیم باید خود اطمینان حاصل کند که هیچ تداخلی با قواعد ایجادشده توسط firewalld رخ نخواهد داد.

بسته به مقدار FirewallBackend (نگاه کنید به firewalld.conf(5)) قواعد مستقیم در برخی سناریوها رفتار متفاوتی خواهند داشت.

به دلیل جزئیات پیاده‌سازی netfilter در داخل کرنل، اگر FirewallBackend=nftables استفاده شود، قواعد مستقیمی که بسته‌ها را ACCEPT می‌کنند، در واقع باعث پذیرش فوری بسته‌ها توسط سیستم نمی‌شوند. این بسته‌ها همچنان مشمول مجموعه قواعد nftables فایروال firewalld هستند. این امر اساساً به این معناست که دو فایروال مستقل وجود دارد و بسته‌ها باید توسط هر دو (iptables و nftables) پذیرفته شوند. علاوه بر این، این سناریو در داخل خود nftables نیز (باز هم به دلیل netfilter) رخ می‌دهد اگر چندین زنجیره به یک هوک متصل شده باشند - ماجرا صرفاً به سادگی تقابل iptables و nftables نیست.

چندین راهکار برای حل مشکل ACCEPT وجود دارد:

1.قواعد غنی (Rich Rules)

اگر بتوان از یک قاعده غنی استفاده کرد، همواره باید بر قواعد مستقیم ترجیح داده شوند. قواعد غنی به FirewallBackend فعال تبدیل خواهند شد. نگاه کنید به firewalld.richlanguage(5).

2.پذیرش کلی (Blanket Accept)

کاربران می‌توانند یک قاعده پذیرش صریح به مجموعه قواعد nftables اضافه کنند. این کار می‌تواند با افزودن رابط شبکه یا مبدأ به ناحیه trusted انجام شود.

این راهبرد اغلب توسط ابزارهایی که فیلترسازی اختصاصی خود را انجام می‌دهند (مانند libvirt، podman، docker) به کار گرفته می‌شود.

هشدار: این کار به این معناست که firewalld هیچ فیلترسازی روی این بسته‌ها انجام نخواهد داد. تمامی این عملیات باید از طریق قواعد مستقیم یا قواعد iptables خارج از چارچوب انجام شود.

3.پذیرش انتخابی (Selective Accept)

همچنین می‌توانید فقط سرویس، درگاه، آدرس یا موارد مرتبط را در ناحیه مناسب فعال کنید.

4.بازگشت به بک‌اند iptables (Revert to the iptables backend)

آخرین راهکار، بازگشت به بک‌اند iptables با تنظیم FirewallBackend=iptables است. کاربران باید توجه داشته باشند که توسعه firewalld بر روی بک‌اند nftables متمرکز است.

برای قواعد مستقیمی که بسته‌ها را DROP (دور می‌اندازند)، بسته‌ها بدون توجه به مقدار FirewallBackend بلافاصله دور انداخته می‌شوند. از این رو، هیچ ملاحظه خاصی در این مورد نیاز نیست.

فایروال firewalld رفتار ACCEPT/DROP بالا را با ثبت هوک‌های nftables با تقدم پایین‌تر نسبت به هوک‌های iptables تضمین می‌کند.

در حالت FirewallBackend=iptables قواعد داخلی سطح بالای firewalld قبل از اجرای قواعد مستقیم اعمال می‌شوند. این شامل قواعد مربوط به پذیرش اتصالات موجود نیز می‌شود. در گذشته این مسئله موجب شگفتی کاربران می‌شد. به عنوان مثال، اگر کاربری یک قاعده مستقیم برای مسدودسازی ترافیک روی درگاه مقصد ۲۲ اضافه می‌کرد، نشست‌های SSH موجود به کار خود ادامه می‌دادند، اما اتصال‌های جدید رد می‌شدند.

در حالت FirewallBackend=nftables به قواعد مستقیم عمداً اولویت بالاتری نسبت به تمامی قواعد دیگر firewalld داده شده است. این شامل قواعد پذیرش اتصالات موجود نیز می‌گردد.

قرار دادن شبکه‌های 192.168.1.0/24 و 192.168.5.0/24 در فهرست مسدودسازی (denylist) همراه با ثبت گزارش و دور انداختن زودهنگام بسته‌ها در جدول raw:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <chain ipv="ipv4" table="raw" chain="denylist"/>
  <rule ipv="ipv4" table="raw" chain="PREROUTING" priority="0">-s 192.168.1.0/24 -j denylist</rule>
  <rule ipv="ipv4" table="raw" chain="PREROUTING" priority="1">-s 192.168.5.0/24 -j denylist</rule>
  <rule ipv="ipv4" table="raw" chain="denylist" priority="0">-m limit --limit 1/min -j LOG --log-prefix "denylisted: "</rule>
  <rule ipv="ipv4" table="raw" chain="denylist" priority="1">-j DROP</rule>
</direct>

firewall-applet(1), firewalld(1), firewall-cmd(1), firewall-config(1), firewalld.conf(5), firewalld.direct(5), firewalld.dbus(5), firewalld.icmptype(5), firewall-offline-cmd(1), firewalld.richlanguage(5), firewalld.service(5), firewalld.zone(5), firewalld.zones(5), firewalld.policy(5), firewalld.policies(5), firewalld.ipset(5), firewalld.helper(5)

تارنمای اصلی firewalld:

Thomas Woerner <twoerner@redhat.com>

توسعه‌دهنده

Jiri Popelka <jpopelka@redhat.com>

توسعه‌دهنده

Eric Garver <eric@garver.life>

توسعه‌دهنده
firewalld 2.5.1