Вы должны взглянуть на ipset
.
С официального сайта:
Ipset может быть подходящим инструментом [...] для хранения нескольких IP-адресов или номеров портов и сопоставления с коллекцией iptables.
[...] (Ipset) может хранить IP-адреса, сети, номера портов (TCP/UDP), MAC-адреса, имена интерфейсов или их комбинации таким образом, который обеспечивает молниеносную скорость при сопоставлении записи с набором.
Для его использования необходимо создать ipset
, добавить IP-адреса
и создать iptables
правило, соответствующее ipset
:
ipset создать черный список hash:ip hashsize 1400000
ipset добавить в черный список <IP-АДРЕС>
iptables -I INPUT -m set --match-set черный список src -j DROP
Реальный пример использования можно найти здесь. Обратите внимание, что он использует восстановление ipset
вместо того, чтобы проходить через каждый IP
в цикле, потому что это намного быстрее.
Если ваш список IP-адреса
имеет перекрытия, вы можете предварительно обработать его, чтобы преобразовать в Диапазоны IP-адресов
где возможно. Здесь является примером инструмента для этого. Это не даст вам лучших результатов с ipset
но это уменьшит размер вашего списка.
С другой стороны, с точки зрения производительности, это очень быстро и масштабируется без штрафов. Как Облачная вспышка
упоминание в блоге, есть более быстрые низкоуровневые подходы; но это намного сложнее и добавляет всего несколько байтов в секунду, что, если у вас нет масштаба и амбиций облачного провайдера, не стоит затраченных усилий.