Що таке NFTables (Netfilter Tables)?

NFTables (Netfilter Tables) — це сучасна підсистема брандмауера для ядра Linux, яка замінила застарілі iptables, ip6tables, arptables та ebtables. Вона була розроблена для підвищення гнучкості, продуктивності та простоти використання в управлінні мережевими пакетами. Ось детальний огляд її основних характеристик та функціональних можливостей:

Основні переваги NFTables

  1. Єдина інфраструктура:

    • Замість використання окремих утиліт для IPv4, IPv6, ARP і Ethernet (як у випадку з iptables, ip6tables, arptables та ebtables), nftables об’єднує всі ці функції в одну команду nft.
    • Це значно спрощує конфігурацію та управління правилами брандмауера.
  2. Мова опису правил:

    • NFTables використовує нову, більш потужну мову для опису правил. Вона дозволяє використовувати складні конструкції, такі як масиви, карти, комбінації дій і фільтрів.
    • Наприклад, можна створювати правила, які об’єднують кілька портів або IP-адрес в одному рядку коду.
  3. Продуктивність:

    • Завдяки використанню JIT-компіляції (Just-In-Time), nftables може значно прискорити обробку правил.
    • Менш складні правила означають менше накладних витрат на обробку мережевих пакетів.
  4. Гнучкість:

    • NFTables дозволяє створювати складніші правила за допомогою таблиць, ланцюгів та об’єднаних дій.
    • Можна легко додавати, змінювати та видаляти правила без необхідності перезавантаження всієї конфігурації.

Основні компоненти NFTables

  1. Таблиці (tables):

    • Вони є контейнерами для ланцюгів. В одній таблиці можна мати ланцюги для фільтрації, NAT, маршрутизації тощо.
    • Наприклад, створення таблиці:
      nft add table inet filter
      
  2. Ланцюги (chains):

    • Вони містять правила, які визначають, як обробляти мережеві пакети. Кожен ланцюг має політику (policy), яка визначає, що робити з пакетами, що не відповідають жодному правилу.
    • Наприклад, створення ланцюга в таблиці:
      nft add chain inet filter input { type filter hook input priority 0 \; }
      
  3. Правила (rules):

    • Вони визначають конкретні дії для пакетів, що відповідають умовам правила. Наприклад, фільтрація за IP-адресою або портом.
    • Додавання правила до ланцюга:
      nft add rule inet filter input ip saddr 192.168.1.1 counter drop
      
  4. Карти (maps):

    • Вони дозволяють асоціювати ключі з значеннями, що може бути корисно для створення складних правил.
    • Наприклад, створення карти:
      nft add map inet filter mymap { type ipv4_addr : verdict \; }
      nft add element inet filter mymap { 192.168.1.1 : drop, 192.168.1.2 : accept }
      

Приклади використання

  1. Базова конфігурація брандмауера:

    nft add table inet filter
    nft add chain inet filter input { type filter hook input priority 0 \; }
    nft add rule inet filter input ct state established,related accept
    nft add rule inet filter input ip saddr 192.168.1.0/24 accept
    nft add rule inet filter input tcp dport 22 accept
    nft add rule inet filter input counter drop
    
  2. Налаштування NAT:

    nft add table ip nat
    nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
    nft add rule ip nat postrouting oifname "eth0" ip saddr 192.168.1.0/24 masquerade
    

Інструменти та утиліти

  • nft: головна утиліта командного рядка для управління nftables. Вона дозволяє створювати, змінювати, видаляти таблиці, ланцюги, правила та карти.
  • libnftnl: бібліотека для низькорівневого доступу до функцій nftables, яку використовує утиліта nft.

Висновок

NFTables пропонує більш сучасний, гнучкий та ефективний підхід до управління мережевими пакетами в порівнянні зі своїми попередниками. Він дозволяє адміністраторам мереж створювати складні та потужні конфігурації брандмауера, забезпечуючи при цьому високу продуктивність та простоту використання.

Використання: nft [ options ] [ cmds… ]

Параметри (загальні):
-h, --help Показати довідку
-v, --version Показати інформацію про версію
-V Показати розширену інформацію про версію

Параметри (обробка вхідних даних набору правил):
-f, --file <ім’я файлу> Прочитати вхідні дані з <ім’я файлу
-D, --define <назва=значення> Визначити змінну, наприклад, --define foo=1.2.3.4
-i, --interactive Читати вхідні дані з інтерактивного CLI
-I, --includepath <каталог> Додати <каталог> до шляхів пошуку файлів, що включаються. За замовчуванням буде /etc
-c, --check Перевіряти правильність команд без застосування змін.
-o, --optimize Оптимізувати набір правил

Параметри (форматування списку правил):
-a, --handle Виводити хендл правила.
-s, --stateless Не виводити інформацію про стан набору правил.
-t, --terse Опускати вміст наборів.
-S, --service Переводити порти на назви служб, як описано у файлі /etc/services.
-N, --reversedns Перетворити IP-адреси на імена.
-u, --guid Виводити UID/GID, як описано у файлах /etc/passwd та /etc/group.
-n, --numeric Виводити повністю числові дані.
-y, --numeric-priority Виводити пріоритет ланцюжка у числовому вигляді.
-p, --numeric-protocol Друкувати протоколи рівня 4 у числовому вигляді.
-T, --numeric-time Друкувати значення часу у числовому вигляді.

Параметри (форматування виводу команди):
-e, --echo Відтворювати те, що було додано, вставлено або замінено.
-j, --json Форматувати вивід у JSON
-d, --debug <level [,level…]> Вказати рівень налагодження (scanner, parser, eval, netlink, mnl, proto-ctx, segtree, all)