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