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

Использование iptables hashlimit memory: в чем разница между --hashlimit-htable-size и --hashlimit-htable-max

Я хочу использовать iptables hashlimit, чтобы ограничить злонамеренные поисковые роботы, как и этот вопрос пытается ограничить сканирование ssh bruteforce.

Время от времени они попадают в неэффективный код на нашем сайте. Это ставит нас на колени, потому что они так сильно распараллеливаются и входят так быстро (например, 3-5 входящих соединений в секунду). Конечные пользователи не сталкиваются с этим слишком часто, и когда они это делают, это не 10x или 20x параллельно.

Я знаю, что мне нужно будет выполнить некоторую настройку, чтобы убедиться, что размер пакета подходит для реальных пользователей в браузерах, и чтобы моя проверка каждого IP-адреса не повредила пару пользователей за NAT. Однако все это кажется выполнимым. Настроить его на нашем действующем сайте не составит большого труда, я просто зарегистрируюсь, вместо того, чтобы отказываться от него в течение первых двух недель.

Тем не менее, меня немного беспокоит использование памяти hashlimit. В основном я хочу убедиться, что сайт не упадет из-за того, что этому правилу iptables не хватает памяти.

Прекрасное руководство для iptables-extension говорит:

--hashlimit-htable-size buckets
The number of buckets of the hash table
--hashlimit-htable-max entries
Maximum entries in the hash.

Но не совсем понятно, что это за ведра и какие записи.

Кроме того, что происходит, когда хеш-таблица заполняется (максимальное количество записей или сегментов)? Надеюсь, правило не работает, и iptables переходит к следующему правилу, но на самом деле это не так.

Вот правило, которое я рассматриваю. Он работает так, как задумано при ограниченном тестировании, но нагрузочное тестирование с тысячами удаленных IP-адресов немного сложно.

iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
  -m hashlimit --hashlimit-name=WWW --hashlimit-above 1/sec --hashlimit-burst 50 \
  --hashlimit-mode srcip -j LOGACCEPT

Я полагаю, вы знаете, как обычно работает хеширование: оно вычисляет некоторую функцию из данных (IP, пара IP-адресов и т. Д.) И использует значение этой функции в качестве индекса в таблице для поиска структур, связанных с этими данными. Каждая ячейка в таблице (которая соответствует одному возможному значению хеш-функции) обычно называется хеш-корзиной.

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

Таким образом, hashlimit-htable-size ограничивает количество хеш-сегментов (размер самой хеш-таблицы), а hashlimit-htable-max ограничивает количество всех хеш-записей (хранящихся во всех хеш-сегментах).