Какие правила следует указать в nftables, чтобы определить путь прохождения пакетов?

Как работает последовательность прохождения пакетов по таблицам и цепочкам в nftables?
Изображение к вопросу
  • 7 января 2024 г. 19:37
Ответы на вопрос 2
Чтобы определить путь прохождения пакетов в `nftables`, вам понадобится создать несколько цепочек (chains) и правил (rules), относящихся к различным таблицам (tables), через которые проходят пакеты. В `nftables` используются три основных типа таблиц:

1. **Filter table**: Традиционно используется для фильтрации пакетов.
2. **Nat table**: Используется для сетевого адресного преобразования (NAT).
3. **Mangle table**: Предназначена для специфических изменений пакетов.

Каждая таблица может включать в себя несколько цепочек, которые определяют точки входа пакетов в систему. Цепочки могут быть предопределены (например, `input`, `forward`, `output`) или пользовательскими.

Вот как работают цепочки `nftables` в порядке их применения:

1. **Прерывание (Prerouting)**: Для обработки входящих пакетов до принятия решения о маршрутизации. Здесь можно применять NAT для адреса приемника или изменять пакеты.

2. **Вход (Input)**: Для пакетов, которые предназначены для локального процесса, т.е., когда система является конечным получателем.

3. **Преобразование (Forward)**: Для пакетов, которые только проходят через хост (маршрутизатор).

4. **Выход (Output)**: Для обработки пакетов, сгенерированных локальным процессом и предназначенных для отправки.

5. **Постобработка (Postrouting)**: Для обработки исходящих пакетов после принятия решения о маршрутизации.

Для организации логирования пути пакетов и его контроля, могут быть добавлены правила в разные цепочки таблиц, например:

```bash
# Создание таблицы с именем "filter"
nft add table ip filter

# Создание цепочки с именем "input" в таблице "filter"
nft add chain ip filter input { type filter hook input priority 0 \; }

# Создание правила для логирования входящих пакетов на интерфейсе "eth0"
nft add rule ip filter input iifname "eth0" log prefix "input-accept: " limit rate over 10/second drop
```

В примере выше, правило записывает в системный журнал информацию о входящих пакетах на интерфейс `eth0` с префиксом "input-accept:". Рейт лимит вправо от "log" предотвращает слишком частое логирование пакетов, что могло бы засорить логи.

Дополнительно, могут быть созданы правила и для других действий, таких как принятие, отбрасывание, модификация пакетов или даже изменение счётчиков для мониторинга трафика.

Для более глубокого контроля и логирования, правила могут быть детализированы с условиями относительно протоколов, портов, адресов и т.д. Сочетание таких правил даёт возможность составить точную последовательность обработки пакетов в соответствии с вашими требованиями.

Помните, что конфигурация `n
При общении клиент1 - клиент2 роутер не участвует, т.к. клиенты находятся в одной сети и будут общаться напрямую друг с другом. 
Клиент1-Роутер - порядок верный, сначала Prerouting, потом input в обоих случаях
ARP layer - судя по схеме обрабатывается когда приходит пакет не из бриджа и это ARP-запрос.
Пакет будет проходить все цепочки до тех пор, пока не обработается каким-либо терминирующим правилом - аксепт или дроп.
Пакет попадает в ту или иную цепочку в зависимости от адреса назначения и входного интерфейса роутера
Похожие вопросы