Я хочу установить жесткое ограничение для входящих UDP-пакетов на моем компьютере с Linux, который находится в 10-гигабитной локальной сети.
Следующая команда работает нормально
/sbin/iptables -A UDP-LIMIT -m limit --limit 10000/s --limit-burst 500 -j RETURN
Но когда я пытаюсь увеличить лимит вроде
/sbin/iptables -A UDP-LIMIT -m limit --limit 10001/s --limit-burst 500 -j RETURN
Это дает мне ошибку Rate too fast
.
Есть идеи, почему?
Я тоже видел макрос #define XT_LIMIT_SCALE 10000 in
linux / netfilter / xt_limit.h` в исходном коде ядра Linux.
Есть идеи, почему установлен этот предел?
Если вы посмотрите исходный файл libxt_limit.c
, вы можете найти ответ. В частности, посмотрите на эти строки в parse_rate
функция:
*val = XT_LIMIT_SCALE * mult / r;
if (*val == 0)
/*
* The rate maps to infinity. (1/day is the minimum they can
* specify, so we are ok at that end).
*/
xtables_error(PARAMETER_PROBLEM, "Rate too fast \"%s\"\n", rate);
return 1;
Макрос XT_LIMIT_SCALE
как вы сказали, 10 000. Значение mult
начинается с 1 в секундах и достигает 24 * 60 * 60 дней. Наибольшее значение, конечно же, будет для дней. Если вы посчитаете, вы получите следующее выражение:
10000 * 24 * 60 * 60 / 10000 = 864,000,000 / 10000 = ..
Число, которое нужно разделить, можно сохранить в виде 32-битного целого числа без знака (uint32_t). Однако это число будет усечено, если станет больше (как в случае XT_LIMIT_SCALE = 100,0000). Значение 10001
не вызовет этой проблемы, но я думаю, что это бесполезное значение.