Блокировка 1,4 миллиона IP-адресов на VPS

Как я могу заблокировать список из примерно 1,4 миллиона IP-адресов? Я уже пытался сделать это с помощью iptables PREROUTING, например:

-A PREROUTING -d IP_HERE/32 -j DROP

Но с таким количеством записей моя пропускная способность падает как сумасшедшая, когда я делаю speedtest.

Без блокировки IP в iptables:

1 Гб/с

С блокировкой IP в iptables:

3 Мб/с в пике.

Я хочу использовать XDP_DROP, как здесь (последний шаг): https://blog.cloudflare.com/how-to-drop-10-million-packets/

Но я не представляю, как это использовать. :/ (Я очень плох в программировании)

Есть ли альтернативы этому подходу?

13
задан 18 August 2021 в 10:32

6 ответов

Вам следует взглянуть на ipset .

(Ipset) может хранить IP-адреса, сети, номера портов (TCP / UDP), MAC-адреса, имена интерфейсов или их комбинации таким способом, который обеспечивает молниеносную скорость сопоставления записи с набором.

sudo ipset create blacklist hash:ip hashsize 1400000
sudo ipset add blacklist <IP-ADDRESS>
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP

Другой пример использования можно найти здесь . Обратите внимание, что он использует ipset restore вместо прохождения каждого IP-адреса в цикле, потому что это намного быстрее.

Если ваш список IP-адресов перекрывается, вы можете захотеть предварительно обработать его для преобразования в диапазон IP-адресов, где это возможно. Вот пример инструмента для этого.

24
ответ дан 20 August 2021 в 10:26

Если IP-адреса работают в четко определенном диапазоне, вы можете использовать ufw следующим образом, чтобы заблокировать трафик:

sudo ufw deny from 192.0.0.0/8 to any

В приведенном выше примере блокируется весь трафик с 192.0.0.1 на 192.255.255.254 , который работает с 16 777 214 адресами и не оказывает никакого (заметного) влияния на пропускную способность сети.

Пока ваш список IP-адресов позволяет генерировать диапазоны IP-адресов, это может сработать для вас.

12
ответ дан 20 August 2021 в 10:26

Здесь используются не iptables, а таблица маршрутизации ядра ip, возможно, стоит попробовать и проверить производительность:

ip route add blackhole IPv4 / 32

IIRC, это должно быть быстрее, чем фильтрация с помощью iptables, но я никогда не проводил тест с 1,4 миллиона IP-адресов :)

0
ответ дан 20 August 2021 в 10:26

Есть еще одно улучшение, которое напрямую решает вашу проблему со скоростью 3 Мбит / с:

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Это позволяет установленным соединениям проходить как можно меньше правил iptables, хотя использование ipset для улучшения IP-адреса Скорость поиска по-прежнему необходима для новых соединений для более быстрого установления.

Независимо от того, сколько у вас других правил, это хорошее правило для развертывания в качестве первого правила.

0
ответ дан 20 August 2021 в 10:26

Вы можете свести к минимуму поиски для увеличения скорости древовидной структуры ваших правил. Вы можете, например, сделать это на основе первой части IP, то есть / 8 , например так:

iptables -N rule8_192_0_0_0
iptables -N rule8_172_0_0_0
iptables -N rule8_10_0_0_0

iptables -A INPUT -s 192.0.0.0/8 -j rule8_192_0_0_0
iptables -A INPUT -s 172.0.0.0/8 -j rule8_172_0_0_0
iptables -A INPUT -s 10.0.0.0/8 -j rule8_10_0_0_0

iptables -A rule8_192_0_0_0 -s 192.168.2.3 -j DROP
iptables -A rule8_172_0_0_0 -s 172.16.2.3 -j DROP
iptables -A rule8_10_0_0_0 -s 10.10.2.3 -j DROP
9
ответ дан 20 August 2021 в 10:26

Задача фрейма - какой список короче, авторизованные или заблокированные адреса?

Вместо того, чтобы отрицать 1,4 миллиона, просто разрешите, возможно, ~ дюжину IP-адресов, которые вы хотите разрешить, и по умолчанию- все отрицать.

17
ответ дан 20 August 2021 в 10:26

Другие вопросы по тегам:

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