Соответствие hashlimit
Модуль hashlimit является прямым наследником limit и основным (весьма кардинальным) отличием является поддержка хеш-таблиц, которые позволяют поддерживать и проверять условия соответствия не для всех пакетов сразу (независимо от адресов и портов), а с учетом выбранной пользователем комбинации параметров, включающей адреса и номер порта для отправителя и получателя. Это существенно расширяет возможности управления трафиком, поскольку выполнение условий проверяется независимо для каждого набора параметров в соответствии с выбором пользователя.
Основная идея модуля заключается в создании хэш-таблицы для каждого адреса получателя и поддержка отдельных счетчиков пакетов и байтов для каждой записи. Таким способом можно, например, вводить ограничения на скорость и число попыток организации соединения с каждым адресом, как это делает limit для всех адресов сразу.
Модуль поддерживает несколько параметров:
--hashlimit
задает среднее значение потока трафика. Параметр представляет собой целое число, определяющее максимальное количество пакетов, и суффикс, который определяет единицу времени. В качестве суффикса могут использоваться значения /second, /minute, /hour, /day. По умолчанию устанавливается число пакетов в секунду.
--hashlimit-burst
задает порог, идентичный параметру limit-burst для операции limit (По умолчанию значение параметра равно 5.
--hashlimit-mode <режим>
задает режим хеширования – по адресам, портам или их комбинациям. Параметр может содержать разделенный запятыми список значений dstip, dstport, srcip, srcport. Эта опция является обязательной в команде.
--hashlimit-name foo
задает имя для файла /proc/net/ipt_hashlimit/foo. Данная опция является обязательной. Имя файла может выбираться произвольно.
--hashlimit-htable-size
задает число элементов (bucket) в хэш-таблице;
--hashlimit-htable-max
задает максимальное количество записей в хэше;
--hashlimit-htable-expire
задает время (в миллисекундах) жизни записи в хэш-таблице. По умолчанию время жизни составляет 10000 (10 секунд).
--hashlimit-htable-gcinterval
задает интервал “сборки мусора” в хэш-таблице. По умолчанию интервал сборки составляет 1000 мсек (1 секунда).
Например, правило
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 360000 -j ACCEPT
позволяет ограничить частоту попыток соединения с портом SSH независимо для каждого источника таких пакетов.
При использовании условия hashlimit я дереве каталогов /proc/net/ipt_hashlimit создается файл с именем, заданным параметром –hashlimit-name (в нашем случае /proc/net/ipt_hashlimit/SSH), в котором для каждого отправителя пакетов создается запись вида
50 213.96.92.236:0->0.0.0.0:0 23040000 23040000 11520000
Первый параметр показывает число секунд, в течении которого запись будет оставаться в таблице, если с этого адреса не поступит новых пакетов, соответствующих остальной части правила. При поступлении нового пакета для этого поля устанавливается значение, задаваемое параметром –hashlimit-htable-expire (а приведенном примере 360000=360 сек = 6 мин). Следующий параметр содержит значения адресов и номеров портов для отправителя и получателя с учетом выбранного пользователем режима хеширования. Если какой-либо из перечисленных параметров не используется при хеширование соответствующее поле таблицы имеет значение 0. Третий параметр (23040000 в приведенном примере) содержит текущее значение счетчика пакетов (не удивляйтесь большому значению, счетчик использует коэффициент), четвертый параметр пропорционален значению burst (с тем же коэффициентом), а последний параметр определяет средний интервал “оттока”, т. е. обратно пропорционален значению параметра –hashlimit (в большинстве систем он будет равен среднему интервалу между пакетами в секундах, умноженному на 32000).
В связи с использованием хеш-таблицы модуль поддерживает еще три дополнительных параметра, управляющих выделением памяти для хеширования. Параметр –hashlimit-htable-size определяет размер памяти, выделяемой при создании хеш-таблицы (число записей), а –hashlimit-htable-max задает максимальное число записей в таблице. Эти параметры являются необязательными и при их отсутствии соответствующие значения вычисляются с учетом параметров системы. Третий параметр –hashlimit-htable-gcinterval определяет период “сборки мусора”, т. е. Удаления из таблицы записей, для которых истекло время жизни.
Условие hashlimit существенно расширяет возможности фильтрации пакетов с использованием пороговых значений, но обладает тем же недостатком, что и limit – отсутствием возможности инверсии правила в целом.
Кроме того, исходные коды hashlimit в составе ядра 2.6.10 и iptables 1.3.0.r1 содержат ряд ошибок, которые просто не позволяют использовать модуль. Файлы с корректными исходными кодами можно загрузить с сайтов, используя приведенные ниже ссылки:
http://bugme.osdl.org/show_bug.cgi?id=4105 (модуль для ядра)
https://bugzilla.netfilter.org/bugzilla/show_bug.cgi?id=280 (модуль iptables)