我想对位于 10 千兆 LAN 内的 Linux 机器上的传入 UDP 数据包设置硬限制。
以下命令有效
/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内核源代码中看到了一个宏linux/netfilter/xt_limit.h`。
知道为什么设置这个限制吗?
答案1
如果你看一下源文件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
是 10000,正如你所说。 的值mult
从 1 秒开始,达到 24*60*60 天。 当然,最大值将是天数。 如果你进行计算,你将得到以下表达式:
10000 * 24 * 60 * 60 / 10000 = 864,000,000 / 10000 = ..
被除数可以存储在 32 位无符号整数 (uint32_t) 中。但是,如果该数字变大(例如 XT_LIMIT_SCALE = 100,0000 的情况),该数字将被截断。该值10001
不会导致此问题,但我认为该值没有用。