Назад | Перейти на главную страницу

Как отбрасывать пакеты на основе вероятности с nftables?

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

число

столы имеет все функции, но по неизвестной причине это не задокументировано ни в одной версии nft справочная страница.

Сторона ядра, обрабатывающая это, nft_numgen был доступен начиная с Linux 4.9 и сторона пользователя поскольку в Выпуск nftables 0.7:

  • Добавьте поддержку генерации номеров. Полезно для установки меток пакетов с циклическим перебором, например.

    # nft add rule filter prerouting meta mark set numgen inc mod 2
    

    Вы также можете указать смещение, чтобы указать, с какого значения вы хотите начать.

    Модуль обеспечивает масштаб последовательности счета. Ты можешь
    также используйте это из карт, например.

    # nft add rule nat prerouting \
          dnat to numgen inc mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }
    

    Итак, это распределение новых подключений по круговой схеме.
    между 192.168.10.100 и 192.168.20.200. Не забывайте о специальной семантике цепочки NAT: только первый пакет оценивает правило, последующие пакеты полагаются на conntrack для применения информации NAT.

    Вы также можете эмулировать распределение потока с разными весами серверной части, используя интервалы, например.

    # nft add rule nat prerouting \
          dnat to numgen inc mod 10 map { 0-5 : 192.168.10.100, 6-9 : 192.168.20.200 }
    

Также есть поддержка случайных чисел. Пример: замена в предыдущем примере inc (используется для циклического перебора) с random:

nft add rule nat prerouting dnat to numgen random mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }

Дополнительная документация и сопутствующие материалы:


Вернуться к вопросу

Случайное число - это 32-битное целое число (достаточно большое, чтобы игнорировать смещение модуля), к которому применяется модуль. Затем его значение можно сравнить. Чтобы отбросить 5% всех нелокальных входящих IPv4-пакетов, которые в этом случае будут:

#!/usr/sbin/nft -f

flush ruleset

table ip filter {
    chain input {
        type filter hook input priority 0; policy accept;
        iif "lo" accept
        numgen random mod 100 < 5 drop
    }
}

Пример, когда со своего хоста отправляется запрос на контейнер с этим набором правил:

# ping -q -f 10.0.3.66
PING 10.0.3.66 (10.0.3.66) 56(84) bytes of data.
^C
--- 10.0.3.66 ping statistics ---
34351 packets transmitted, 32592 received, 5% packet loss, time 19744ms
rtt min/avg/max/mdev = 0.004/0.017/0.481/0.018 ms, ipg/ewma 0.574/0.017 ms