Швидки підказки стосовно Nftables
ВСТУП
Цей документ знаходиться між брудною методичкою та шпаргалкою. Ми пропонуємо вам прочитати короткий опис деяких цікавих функцій nftables, що допоможе вам полюбити nftables. Для опису архітектури та ідей, що стоять за Nftables, будь ласка, прочитайте анонс першого випуску nftables.
Для отримання додаткової глобальної інформації ви також можете переглянути розмову, яку я виголосив у Ерік Леблонд:«Рецепти ядра», OISF - Nftables.
АРХИТЕКТУРА NFTABLES
Бібліотеки
Потрібні наступні бібліотеки
- libmnl: git://git.netfilter.org/libmnl
- libnftnl: git://git.netfilter.org/libnftnl
Цілком можливо, що ваш дистрибутив уже включає libmnl. Але, якщо ні, то встановити обидві бібліотеки досить просто, оскільки вони встановлюються стандартним чином:
nftables
Спочатку встановіть залежності:
Якщо ви хочете встановити документацію:
kernel
Якщо у вас ще немає дерева git Linux, запустить:
Якщо у вас вже є дерево git Linux, ви можете просто оновити його
Тепер, коли у вас є джерело, ви можете вибрати опції для nftables:
Тепер ви можете створити своє ядро за допомогою звичайних команд.
На debian, для двоядерний машині, ви можете це виконати так:
Або ви можете по черзі використовувати старий метод:
Користувачі Debian також можуть отримати початковий код для ядра з git:
ЗАПУСК
Початкові налаштування
Щоб отримати ланцюг подібний до iptables, використовуйте файл ipv4-filter, наданий у джерелі
Потім ви можете подивитися ланцюг:
Зауважте, що filter це назва таблиці яка має ланцюг output, input. Хоча може бути використана будь-яка інша назва.
Основні правила управління
Щоб скинути (дропнути) вихідні дані до пункту призначення
Лічильники правил необов’язкові для nftables, а для його активації потрібно використовувати ключове слово:
Щоб додати правило стосовно мережі, ви можете вказати мережу:
Щоб скинути пакет який заходе на порт 80, застосуйте наступний синтаксис:
Щоб прийняти запит відлуння ICMP (ping):
Щоб поєднати фільтрацію, ви маєте просто вказати кілька разів синтаксис ip:
Щоб видалити всі правила в ланцюгу:
Щоб видалити одне конкретне правило, вам потрібно виконати nft опцію -a, щоб отримати номер правила:
Потім можна видалити правило 10 за допомогою команди:
Ви також можете очистити таблицю фільтру:
Можливо вставити правило:
Можливо вставити або додати правило у певну позицію. Для цього вам потрібно отримати позначку правила, до якого або після якого додати нове правило.
Це робиться за допомогою опції -a в операції з параметром list:
Тут ми додали правило спираючись на правило з позначкою 8. Для додавання перед правилом із заданою позначкою ви можете використовувати:
Якщо ви хочете співставити лише протокол, ви можете скористатись щось на кшталт:
IPv6
Подібно до IPv4, вам потрібно створити кілька ланцюгів. Для цього ви можете використовувати:
Потім ви можете додати правило:
Перелік правил можна отримати за допомогою:
Щоб прийняти динамічну конфігурацію IPv6 та виявлення сусіда, можна використовувати:
Відстеження підключення
Щоб прийняти всі вхідні пакети встановленого з'єднання: nft ins
Фільтр по інтерфейсу
Щоб прийняти всі пакети, що виходять з інтерфейсу loopback:
і пакети, які надходять на eth2:
Зверніть увагу, що oif насправді є цілим числом, що є індексом інтерфейсу всередині ядра. Користувацька область перетворює задане ім'я в індекс інтерфейсу, коли оцінюється правило nft (перед тим, як надсилати у ядро). Наслідком цього є те, що правило не можна додавати, якщо інтерфейс не існує.
Іншим наслідком є те, що якщо інтерфейс буде видалено та створено заново, індекс не співпадє, оскільки індекс доданих інтерфейсів у ядрі монотонно зростає. Таким чином, oif - це швидкий фільтр, але він може спричинити деякі проблеми при використанні динамічних інтерфейсів.
Можливо зробити фільтр за назвою інтерфейсу, але він має меншу продуктивність, оскільки виконується порівняння рядків замість цілого числа. Щоб зробити фільтр на ім'я інтерфейсу, потрібно використовувати oifname:
Ведення журналів
Ведення журналів активується через ключове слово log. Тепичне правило для ведення журналу і дозволу буде виглядати десь так:
За допомогою nftables можна зробити одним правилом те, що в iptables треба було робити різними строками (NFLOG та ACCEPT).
Якщо префікс prefix - це лише стандартний параметр префікса, параметр групи group містить групу nfnetlink_log, якщо цей режим використовується в якості основи ведення журналів.
Фактично, для ведення журналу в nftables використовується бібліотека ведення журналу Netfilter. Це означає, що ведення журналу залежить від завантаженого модуля ядра.
Доступні модулі ядра:
- xt_LOG: ведення журналу на основі printk, виведення всього в syslog (той самий модуль, що і той, який використовується для iptables LOG target)
- nfnetlink_log: ведення журналу на основі netlink, цє модуль який вимагає встановити ulogd2 для отримання подій (той самий модуль, який використовується для iptables NFLOG target)
Щоб використовувати один з двох модулів, завантажте їх з modprobe.
Потім можна налаштувати ведення журналу на основі per-protocol. Конфігурація доступна в /proc:
Як ми бачимо nfnetlink_log був завантажений зразу і ulogd запрацював. Наприклад, якщо ви хочете використовувати ipt_LOG для IPv4 (2 у списку), ви можете зробити:
Це активує ipt_LOG для ведення журналів IPv4:
Якщо ви хочете зробити просте тестування, просто завантажте модуль xt_LOG перед nfnetlink_log. Він прив’яже протокол IPv4 та IPv6 та забезпечить ведення журналу.
Використовуючи один єдиний ланцюг
Ланцюги визначені користувачем і можуть бути організовані будь-яким способом. Наприклад, можно використовувати один єдиний ланцюг для введення. Для цього створіть файл onechain з таким вмістом:
і запустить
Потім ви можете додати правило:
Перевагою цієї настройки є те, що фільтрація Netfilter буде активною лише для пакетів, що надходять у коробку (наш host ???).
Набіри
Ви можете використовувати безіменний набір із таким синтаксисом:
Ім'яний набір може бути використаний у файлі. Наприклад, ви можете створити файл simple:
і виконати:
Можливо також використовувати названий набір. Для оголошення одного набору, що містить ipv4 адресу:
Щоб додати елементи до набору:
Відображення набору здійснюється за допомогою:
Набір може бути використаний у правилі:
Можна видалити елемент із існуючого набору:
і видалити набір:
Mapping - відображення
Map - це специфічний тип набору, який веде себе як словник. Наприклад, можна вказати ipv4_address для обмежання:
Щоб видалити один елемент відображення, ви можете використовувати той самий синтаксис, що і при виділені набіру:
Щоб видалити один набір, ви можете використовувати:
Mapping також може використовуватися анонімно:
Щоб відобразити конкретне відображення:
NAT
Перш за все, необхідний модуль nat:
Далі вам потрібно повідомити ядро про NAT для протоколу (тут IPv4):
Тепер ми можемо створити спеціальний ланцюг NAT:
Тепер ми можемо додати правила NAT:
У першому рядку увесь трафік виходячий з 192.168.56.0/24 до інтерфейсу wlan0 до IP 192.168.1.137. У другому - перенаправлення всього трафіку DNS з 192.168.56.0/24 на сервер 8.8.8.8.
Можливо здійснити NAT на діапазон адрес:
IPv6 NAT також можливий. Спочатку вам потрібно завантажити модуль, щоб оголосити можливість NAT для IPv6:
Після цього ви можете додати такі правила, як:
ПОЧАТКОВІ НАЛАШТУВАННЯ
Наступний набір правил - це типовий набір правил для захисту одного ноутбука в IPv4 та IPv6:
Орігінальна статья https://home.regit.org/netfilter-en/nftables-quick-howto/