Вы должны взглянуть на 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 но это уменьшит размер вашего списка.
С другой стороны, с точки зрения производительности, это очень быстро и масштабируется без штрафов. Как Облачная вспышкаупоминание в блоге, есть более быстрые низкоуровневые подходы; но это намного сложнее и добавляет всего несколько байтов в секунду, что, если у вас нет масштаба и амбиций облачного провайдера, не стоит затраченных усилий.