انتشار فیلتر بسته nftables 0.9.1

پس از یک سال توسعه ارایه شده انتشار فیلتر بسته nftables 0.9.1، به عنوان جایگزینی برای iptables، ip6table، arptables و ebtable با یکپارچه سازی رابط های فیلتر بسته برای IPv4، IPv6، ARP و پل های شبکه توسعه می یابد. بسته nftables شامل اجزای فیلتر بسته است که در فضای کاربر اجرا می شود، در حالی که کار در سطح هسته توسط زیرسیستم nf_tables ارائه می شود که از زمان انتشار 3.13 بخشی از هسته لینوکس بوده است.

سطح هسته تنها یک رابط عمومی مستقل از پروتکل را فراهم می کند که عملکردهای اساسی را برای استخراج داده ها از بسته ها، انجام عملیات داده و کنترل جریان ارائه می دهد.
خود منطق فیلتر و کنترل کننده های پروتکل خاص به بایت کد در فضای کاربر کامپایل می شوند، پس از آن این بایت کد با استفاده از رابط Netlink در هسته بارگذاری می شود و در یک ماشین مجازی ویژه که یادآور BPF (فیلترهای بسته برکلی) است اجرا می شود. این رویکرد به شما این امکان را می دهد که اندازه کدهای فیلترینگ در حال اجرا در سطح هسته را به میزان قابل توجهی کاهش دهید و تمام عملکردهای تجزیه قوانین و منطق کار با پروتکل ها را به فضای کاربر منتقل کنید.

نوآوری های اصلی:

  • پشتیبانی از IPsec، امکان تطبیق آدرس‌های تونل بر اساس بسته، شناسه درخواست IPsec و برچسب SPI (شاخص پارامتر امنیتی). مثلا،

    ... ipsec در ip sadr 192.168.1.0/24
    ... ipsec در spi 1-65536

    همچنین می توان بررسی کرد که آیا یک مسیر از یک تونل IPsec عبور می کند یا خیر. به عنوان مثال، برای مسدود کردن ترافیک نه از طریق IPSec:

    … خروجی فیلتر rt ipsec از دست رفته افت

  • پشتیبانی از IGMP (پروتکل مدیریت گروه اینترنت). برای مثال، می‌توانید از یک قانون برای رد کردن درخواست‌های عضویت گروه IGMP دریافتی استفاده کنید

    nft add rule netdev foo bar igmp type Membership-query counter drop

  • امکان استفاده از متغیرها برای تعریف زنجیره های انتقال (jump/goto). مثلا:

    dest = ber را تعریف کنید
    اضافه کردن قانون آی پی foo bar jump $dest

  • پشتیبانی از ماسک برای شناسایی سیستم عامل ها (اثر انگشت OS) بر اساس مقادیر TTL در هدر. به عنوان مثال، برای علامت گذاری بسته ها بر اساس سیستم عامل فرستنده، می توانید از دستور زیر استفاده کنید:

    ... مجموعه علامت متا osf ttl skip name map { "Linux" : 0x1,
    "ویندوز": 0x2،
    "MacOS": 0x3،
    "ناشناخته" : 0x0 }
    ... نسخه پرش osf ttl "Linux:4.20"

  • امکان تطبیق آدرس ARP فرستنده و آدرس IPv4 سیستم مورد نظر. به عنوان مثال، برای افزایش شمارنده بسته های ARP ارسال شده از آدرس 192.168.2.1، می توانید از قانون استفاده کنید:

    جدول arp x {
    زنجیره y {
    فیلتر اولویت ورودی قلاب فیلتر را تایپ کنید. پذیرش سیاست
    arp sadr ip 192.168.2.1 بسته های شمارنده 1 بایت 46
    }
    }

  • پشتیبانی از ارسال شفاف درخواست ها از طریق یک پروکسی (tproxy). به عنوان مثال، برای تغییر مسیر تماس ها به پورت 80 به پورت پراکسی 8080:

    جدول ip x {
    زنجیره y {
    نوع فیلتر قلاب اولویت prerouting -150; پذیرش سیاست
    tcp dport 80 tproxy to :8080
    }
    }

  • پشتیبانی از علامت‌گذاری سوکت‌ها با قابلیت به دست آوردن علامت تنظیم بیشتر از طریق setsockopt() در حالت SO_MARK. مثلا:

    جدول inet x {
    زنجیره y {
    نوع فیلتر قلاب اولویت prerouting -150; پذیرش سیاست
    علامت سوکت tcp dport 8080 mark set
    }
    }

  • پشتیبانی از تعیین نام متن اولویت برای زنجیره ها. مثلا:

    nft add chain ip x raw { type filter hook prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; }

  • پشتیبانی از تگ های SELinux (Secmark). به عنوان مثال، برای تعریف تگ "sshtag" در زمینه SELinux، می توانید اجرا کنید:

    nft افزودن secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    و سپس از این برچسب در قوانین استفاده کنید:

    nft add rule inet filter input tcp dport 22 meta secmark set “sshtag”

    nft add map inet filter secmapping { type inet_service : secmark; }
    nft افزودن عنصر inet secmapping فیلتر { 22 : "sshtag" }
    nft add rule inet filter input meta secmark set tcp dport map @secmapping

  • امکان تعیین پورت های اختصاص داده شده به پروتکل ها به صورت متنی، همانطور که در فایل /etc/services تعریف شده اند. مثلا:

    nft add rule xy tcp dport "ssh"
    مجموعه قوانین لیست nft -l
    جدول x {
    زنجیره y {
    ...
    tcp dport "ssh"
    }
    }

  • امکان بررسی نوع رابط شبکه. مثلا:

    اضافه کردن قانون inet خام prerouting متا iifkind "vrf" قبول کنید

  • پشتیبانی بهبود یافته برای به روز رسانی پویا محتویات مجموعه ها با مشخص کردن صریح پرچم "دینامیک". به عنوان مثال، برای به روز رسانی مجموعه "s" برای افزودن آدرس منبع و بازنشانی ورودی در صورتی که بسته ای برای 30 ثانیه وجود نداشته باشد:

    جدول x را اضافه کنید
    add set xs { type ipv4_addr; سایز 128; تایم اوت 30 ثانیه; پرچم پویا; }
    افزودن زنجیره xy { نوع فیلتر قلاب ورودی اولویت 0; }
    افزودن قانون xy به روز رسانی @s { ip saddr }

  • امکان تنظیم یک شرط تایم اوت جداگانه. به عنوان مثال، برای لغو مهلت زمانی پیش‌فرض بسته‌هایی که به پورت 8888 می‌رسند، می‌توانید تعیین کنید:

    فیلتر ip جدول {
    ct timeout aggressive-tcp {
    پروتکل tcp;
    l3proto ip;
    Policy = {تأسیس شد: 100، بستن_انتظار: 4، بستن: 4}
    }
    خروجی زنجیره ای {
    ...
    tcp dport 8888 ct timeout set "aggressive-tcp"
    }
    }

  • پشتیبانی NAT برای خانواده inet:

    جدول inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • بهبود گزارش خطای تایپی:

    تست فیلتر زنجیره ای اضافه nft

    خطا: چنین فایل یا فهرستی وجود ندارد. آیا منظورتان از جدول "فیلتر" در آی پی خانوادگی است؟
    اضافه کردن تست فیلتر زنجیره ای
    ^^^^^^^

  • امکان تعیین نام رابط در مجموعه ها:

    تنظیم sc {
    inet_service را تایپ کنید. ifname
    عناصر = { "ssh" . "eth0" }
    }

  • نحو قوانین جدول جریان به روز شده:

    nft جدول x را اضافه کنید
    nft add flowtable x ft { hook ingress priority 0; دستگاه ها = { eth0، wlan0 }; }
    ...
    nft add rule x فوروارد ip protocol { tcp, udp } flow add @ft

  • پشتیبانی از JSON بهبود یافته است.

منبع: opennet.ru

اضافه کردن نظر