Рейтинг:1

nftables - ограничить поведение скорости (ошибка или неправильное использование?)

флаг nl

Я пытаюсь настроить брандмауэр с помощью nftables, но мне не удалось понять и реализовать простое ограничение скорости на основе найденной документации.

  • ОС: Ubuntu 20.04 LTS
  • Версия nftables: 0.9.3 (Топси)
  • выпуск ядра: 5.8.0-53-универсальный

Я построил тестовый брандмауэр с помощью следующей последовательности команд:

nft 'добавить таблицу inet testnetwork'
nft 'добавить цепочку inet testnetwork INPUT { type filter hook input priority 0; падение политики; }'
nft 'добавить set inet testnetwork SSH { type ipv4_addr; флаги динамические, тайм-аут; размер 65536; }'
nft 'добавить правило inet testnetwork INPUT ct, связанное с состоянием, установленный счетчик принимает'
nft 'добавить правило inet testnetwork INPUT ip saddr @SSH ct state new tcp dport 22 counter drop'
nft 'добавить правило inet testnetwork INPUT ct state new tcp dport 22 limit rate over 10/min add @SSH {ip saddr timeout 60s} counter'
nft 'добавить правило inet testnetwork INPUT ct state new tcp dport 22 tcp sport 1024-65535 counter accept'

Когда я перечисляю исходный набор правил, я получаю:

таблица inet testnetwork {
    установить SSH {
        введите ipv4_addr
        размер 65536
        флаги динамические, время ожидания
    }

    цепочка ВХОД {
        тип фильтра хука входного приоритета фильтр; падение политики;
        ct состояние установлено, связанные пакеты счетчика 0 байт 0 принять
        ip saddr @SSH ct state new tcp dport 22 counter пакетов 0 байт 0 drop
        ct state new tcp dport 22 limit rate over 10/min add @SSH {ip saddr timeout 1m } counter packages 0 bytes 0
        ct state new tcp dport 22 tcp sport 1024-65535 счетчик пакетов 0 байт 0 принять
    }
}

С такой конфигурацией я ожидаю, что IP-адрес будет добавлен в набор SSH при 11-м (новом) пробном подключении в течение 1 минуты и будет заблокирован (на 1 минуту), начиная с 12-й попытки.

Однако, когда я открываю второе окно терминала и последовательно инициирую, а затем закрываю менее 10 ssh-подключений к 127.0.0.1, я получаю IP-адрес, добавленный в набор SSH, а затем заблокированный.

Ниже статус набора правил с 7-й попытки:

таблица inet testnetwork {
    установить SSH {
        введите ipv4_addr
        размер 65536
        флаги динамические, время ожидания
        elements = { 127.0.0.1 тайм-аут 1 м истекает 54 с 564 мс }
    }

    цепочка ВХОД {
        тип filter фильтр приоритета ввода хука; падение политики;
        ct состояние установлено, соответствующие пакеты счетчика 156 байт 28692 принять
        ip saddr @SSH ct state new tcp dport 22 counter пакетов 3 байта 180 drop
        ct state new tcp dport 22 limit rate over 10/min add @SSH {ip saddr timeout 1m } counter пакетов 1 байт 60
        ct state new tcp dport 22 tcp sport 1024-65535 счетчик пакетов 6 байт 360 принять
    }
}

На данный момент либо я не правильно понимаю механизм лимитной ставки, либо где-то ошибся.

Может кто-нибудь, пожалуйста, помогите мне, указав, если мое ожидание неверно или откуда может произойти ошибка?

С уважением и спасибо за ваше время

A.B avatar
флаг cl
A.B
Ядро, вероятно, не хочет ждать 1 минуту, чтобы что-то сделать. Это ставка. Я бы рассмотрел 10/мн 1/6с. Поэтому, чтобы не вызвать его, вы должны разбивать попытки на 10 секунд, что должно быть достаточно далеко от 6 секунд за попытку. Не могу точно понять, как это делается: https://elixir.bootlin.com/linux/v5.12.13/source/net/netfilter/nft_limit.c
A.B avatar
флаг cl
A.B
Думаю, это тоже может помочь: https://en.wikipedia.org/wiki/Token_bucket
keeplearningtogether avatar
флаг nl
Привет @AB, Большое спасибо за ваш ответ и ваше время, это очень ценится. Этот подход с ведром токенов объясняет довольно много вещей. Я сделаю несколько тестов, чтобы попытаться получить точное поведение, поскольку я не гуру C, но, по крайней мере, я знаю, с чего начать, и это большая помощь.
A.B avatar
флаг cl
A.B
Я знаю, что оставил только комментарий, но если вы получите окончательные результаты, вы могли бы подумать об этом позже.
keeplearningtogether avatar
флаг nl
Я новичок на этой платформе, должен ли я нажать «Ответить на ваш вопрос» и сделать резюме или как именно это работает? Извините, я еще не прочитал, чтобы увидеть, какие из лучших практик и так далее
Рейтинг:0
флаг us

На моем VPS

sshPort=2222
nft добавить IP-адрес таблицы sshGuard
nft add chain ip sshGuard input { type filter hook input priority 0 \; }
nft добавить набор запрещенных IP-адресов sshGuard { type ipv4_addr \; флаги динамические, тайм-аут \; тайм-аут 5м\; }
nft добавить правило ip sshGuard input tcp dport $sshPort ct состояние новый ip saddr @denylist отклонить
nft добавить правило ip sshGuard input tcp dport $sshPort ct state новое ограничение скорость более 2/мин пакет 3 пакета добавить @denylist { ip saddr } отклонить
IP-адрес таблицы списка nft sshGuard

Я тестирую несколько раз (каждый по nft flush установить IP-адрес запрещенного списка sshGuard), 4-е соединение будет отклонено. Если я изменю ограничить скорость более 2 пакетов в минуту, пакет из 3 пакетов к ограничение скорости свыше 2/минуту, отказ приходит после 7-9 подключений. Поэтому я не знаю точного механизма ограничение скорости свыше 2/минуту, но лопнуть 3 пакета кажется, сделать вещи более определенными.

По умолчанию лопаться устанавливается # определить NFT_LIMIT_PKT_BURST_DEFAULT 5

Рейтинг:0
флаг nl

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

Прежде всего, большое спасибо @A.B за ваши ответы и помощь.Я не знал «алгоритма ведра маркеров» и помог понять общий процесс, в частности «скорость» в том смысле, что ядро, как вы упомянули, не ждет 1 минуту, чтобы что-то сделать.

Также спасибо @Chen Deng-Ta за ваши тесты.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.