iptables hashlimit использование памяти: Каково различие между - hashlimit-htable-size и - hashlimit-htable-max

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

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

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

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

В Прекрасном Руководстве для iptables-расширений говорится:

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

Но не совсем ясно, что является блоками и что является записями.

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

Вот правило, которое я рассматриваю. Это работает, как разработано в ограниченном тестировании, но испытание на нагрузку с тысячами удаленного дюйм/с немного хитро.

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
1
задан 13 April 2017 в 15:14
1 ответ

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

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

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

1
ответ дан 4 December 2019 в 00:06

Теги

Похожие вопросы