Ipset с Iptables с большим списком диапазонов IP-адресов (CIDR)

Ipset с Iptables с большим списком диапазонов IP-адресов (CIDR)

Я читал здесь некоторые ответы о блокировке диапазонов IP-адресов и уже использовал iptablesдля этой цели раньше. Предлагается использовать ipsetв сочетании с iptables.

Я только что установилipsetно еще не настроил.

Я нашел этот сайтip2location.comдля создания списка IP-адресов для запрета по странам. Я выбрал 5 стран, которые регулярно атакуют наши сайты, но список огромен,256000 строк.

  • Не замедлит ли этот огромный список работу моего сервера при использовании ipset(прежде чем попытаться сделать это с использованием только IPtables, я сомневался, что такой большой файл может снизить производительность).
  • Если это так, то как это сделать? В данный момент я использую fail2ban, но не думаю, что конфигурация для nginx настроена правильно (я предполагаю regex). В любом случае, мне нужен более надежный способ.
  • Наконец, я не утверждаю, что достаточно хорошо понимаю CIDR, чтобы сделать этот список меньше (по возможности объединяйте схожие диапазоны IP-адресов).

Например, есть несколько записей /21:

185.179.152.0/22

Онлайн-инструмент показывает, что это преобразуется в: 185.179.1.1.152.0 до 185.179.155.255

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

решение1

Есть утилита командной строки с именем aggregate. Она берет список сетевых блоков CIDR и объединяет последовательные блоки в соответствующий больший блок. Она также удаляет избыточные сетевые блоки.

Например:

$ aggregate -q << EOF
> 192.168.0.0/24
> 192.168.1.0/24
EOF
192.168.0.0/23

Передайте ему текстовый файл, содержащий только ваши блоки CIDR, и он попытается объединить их, уменьшив размер списка.

Из страницы руководства:

DESCRIPTION
       Takes  a list of prefixes in conventional format on stdin, and performs
       two optimisations to attempt to reduce the length of the prefix list.

       The first optimisation is to remove any supplied prefixes which are su‐
       perfluous because they are already included in another supplied prefix.
       For example, 203.97.2.0/24 would be removed if 203.97.0.0/17  was  also
       supplied.

       The  second  optimisation identifies adjacent prefixes that can be com‐
       bined under a single, shorter-length prefix. For example, 203.97.2.0/24
       and 203.97.3.0/24 can be combined into the single prefix 203.97.2.0/23.

aggregateвключен в большинство основных дистрибутивов Linux, включая Ubuntu.

(Обратите внимание, что я взял список с этого веб-сайта и попытался объединить их, но ничего не произошло, так что они, возможно, уже объединены. Вы, безусловно, можете использовать более одного ipset, что, вероятно, является лучшим решением в данном случае.)

решение2

Обычно максимальная длина списка ipset составляет 65536 элементов, поэтому вам, возможно, придется использовать отдельный список для каждой страны, которую вы хотите заблокировать.

Используя набор hash:net, вы можете напрямую добавлять записи CIDR, которые вы хотите запретить. Вы можете проверитьhttps://www.ipdeny.com/ipblocks/для блоков на уровне страны

Что касается ваших вопросов

  • ipset не должен существенно замедлить работу вашей системы — он будет использовать часть памяти для хранения наборов, но в остальном нагрузка не должна быть заметной.
  • fail2ban стоит сохранить, так как злоумышленники могут использовать облачные/vps-серверы в любой стране

Наконец, есть много похожих вопросов об использовании iptables с ipset для блокировки определенных стран, поэтому я не буду вдаваться в подробности настройки iptables — просто проверьте https://askubuntu.com/questions/868334/block-china-with-iptablesили похожие

решение3

Не могли бы вы использоватьxt_geoipвместо этого использовать дополнение xtables?

geoip против ipset xt_geoip использует (вероятно) самый эффективный формат, (несжатый) упакованный blob. Загрузка одной страны в ядро ​​стоит столько же, сколько и файл на диске.

Поскольку ipset не поддерживает произвольные диапазоны IPaddr–IPaddr, необходимо приблизиться к этому, используя, например, несколько записей Network/Prefixlength. Кроме того, если используется тип набора хэшей, можно предположить, что по природе хэшей и/или деревьев некоторые сегменты остаются пустыми и/или требуются дополнительные метаданные. Таким образом, объем памяти с geoip на основе ipset, естественно, больше. Отчеты пользователей1указывают, что в некоторых случаях он может стать на два порядка выше (iptreemap).

Время поиска xt_geoip составляет O(log2(ranges)), поэтому для поиска адреса в пределах 20 000 диапазонов требуется не более 15 итераций, каждая из которых сопровождается сравнением адресов (не более 3). ipset использует Jenkins3 для хеширования, что само по себе имеет определенные временные затраты.

До сих пор не проводилось никаких эмпирических временных тестов.

Связанный контент