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