Лимитирование пакетов через iptables
Критерий должен подгружаться ключом -m limit
. Прекрасно подходит для правил, производящих запись в системный журнал (logging) и т.п. Добавляя этот критерий, мы тем самым устанавливаем предельное число пакетов в единицу времени, которое способно пропустить правило. Можно использовать символ !
для инверсии, например -m limit ! –limit 5/s
. В этом случае подразумевается, что пакеты будут проходить правило только после превышения ограничения.
Более наглядно этот критерий можно представить себе как некоторую емкость с выпускным отверстием, через которое проходит определенное число пакетов за единицу времени (т.е. скорость «вытекания»). Скорость «вытекания» как раз и определяет величина –limit
. Величина –limit-burst
задает общий «объем емкости». А теперь представим себе правило –limit 3/minute –limit-burst 5
, тогда после поступления 5 пакетов (за очень короткий промежуток времени), емкость «наполнится» и каждый последующий пакет будет вызывать «переполнение» емкости, т.е. «срабатывание» критерия. Через 20 секунд «уровень» в емкости будет понижен (в соответствии с величиной –limit
), таким образом она готова будет принять еще один пакет, не вызывая «переполнения» емкости, т.е. срабатывания критерия.
Рассмотрим еще подробнее
- Предположим наличие правила, содержащего критерий
-m limit –limit 5/second –limit-burst 10
. Ключlimit-burst
установил объем «емкости» равный 10-ти. Каждый пакет, который подпадает под указанное правило, направляется в эту емкость. - Допустим, в течение 1/1000 секунды, мы получили 10 пакетов, тогда с получением каждого пакета «уровень» в «емкости» будет возрастать: 1-2-3-4-5-6-7-8-9-10.
- Емкость наполнилась. Теперь пакеты, подпадающие под наше ограничительное правило, больше не смогут попасть в эту «емкость» (там просто нет места), поэтому они (пакеты) пойдут дальше по набору правил, пока не будут явно восприняты одним из них, либо подвергнутся политике по-умолчанию.
- Каждые 1/5 секунды «уровень» в воображаемой емкости снижается на 1, и так до тех пор, пока «емкость» не будет опустошена. Через секунду, после приема 10-ти пакетов «емкость» готова будет принять еще 5 пакетов.
- Само собой разумеется, что «уровень» в «емкости» возрастает на 1 с каждым вновь пришедшим пакетом.
- Расширение
-m limit
подразумевает наличие ключей–limit
и–limit-burst
. Если вы не указываете эти ключи, то они принимают значение по-умолчанию. - Ключ
–limit-burst
– это максимальное значение счетчика пакетов, при котором срабатывает ограничение. - Ключ
–limit
– это скорость, с которой счетчикburst limit
«откручивается назад».
- Расширение
Ключ: –limit
Пример: iptables -A INPUT -m limit –limit 3/hour
Описание: Устанавливается средняя скорость «освобождения емкости» за единицу времени. В качестве аргумента указывается число пакетов и время. Допустимыми считаются следующие единицы измерения времени: /second/minute/hour/day
. По умолчанию принято значение 3 пакета в час, или 3/hour
. Использование флага инверсии условия !
в данном критерии недопустим.
Ключ: –limit-burst
Пример: iptables -A INPUT -m limit –limit-burst 5
Описание: Устанавливает максимальное значение числа burst limit
для критерия limit
. Это число увеличивается на единицу если получен пакет, подпадающий под действие данного правила, и при этом средняя скорость (задаваемая ключом –limit
) поступления пакетов уже достигнута. Так происходит до тех пор, пока число burst limit
не достигнет максимального значения, устанавливаемого ключом –limit-burst
. После этого правило начинает пропускать пакеты со скоростью, задаваемой ключом –limit
. Значение по-умолчанию принимается равным 5. Для демонстрации принципов работы данного критерия я написал сценарий Limit-match.txt
С помощью этого сценария вы увидите как работает критерий limit
, просто посылая ping-пакеты с различными временными интервалами.