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

Ограничение скорости исходных IP-адресов в iptables: hashlimit vs Recent

Я хочу выполнить ограничение скорости для каждого IP-адреса источника в iptables. Например, ограничьте скорость, с которой хост может устанавливать новые SSH-соединения, до 5 в минуту. Насколько мне известно, это можно сделать двумя способами:

С модулем hashlimit

iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m hashlimit --hashlimit-name SSH --hashlimit-above 5/min \
  --hashlimit-mode srcip -j REJECT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

С недавним модулем

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent \
  --rcheck --seconds 60 --hitcount 5 --name SSH --rsource -j REJECT
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
  -m recent --set --name SSH --rsource -j ACCEPT

Мои вопросы:

Is there any difference in how these two will behave?

Нет, то, что вы написали, функционально будет делать то же самое.

With an emphasis on performance, which one is preferable?

Возможно, недавний имеет лучшую производительность, потому что он поддерживает таблицу, но не использует хеш-сегменты.

Is there a significant downside to using both modules?

Я не уверен, зачем вам использовать оба. Использование обоих модулей повлияет на производительность, если вам нужен только один.

Есть ли разница в том, как эти двое будут себя вести?

Зависит от того, сколько соединений вы ожидаете.

В большинстве дистрибутивов последний модуль настроен на запоминание только небольшого количества адресов и пакетов на адрес; 100 и 20 соответственно. Поэтому, если вы хотите ограничить 21 попаданием, это было бы невозможно с недавними значениями по умолчанию.

Hashlimit, похоже, не имеет таких ограничений по умолчанию, хотя можно указать количество сегментов, количество записей и срок действия.