Как я могу заблокировать список из примерно 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/
Но я не представляю, как это использовать. :/ (Я очень плох в программировании)
Есть ли альтернативы этому подходу?
Вам следует взглянуть на 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-адресов, где это возможно. Вот пример инструмента для этого.
Если 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-адресов, это может сработать для вас.
Здесь используются не iptables, а таблица маршрутизации ядра ip, возможно, стоит попробовать и проверить производительность:
ip route add blackhole IPv4 / 32
IIRC, это должно быть быстрее, чем фильтрация с помощью iptables, но я никогда не проводил тест с 1,4 миллиона IP-адресов :)
Есть еще одно улучшение, которое напрямую решает вашу проблему со скоростью 3 Мбит / с:
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Это позволяет установленным соединениям проходить как можно меньше правил iptables, хотя использование ipset для улучшения IP-адреса Скорость поиска по-прежнему необходима для новых соединений для более быстрого установления.
Независимо от того, сколько у вас других правил, это хорошее правило для развертывания в качестве первого правила.
Вы можете свести к минимуму поиски для увеличения скорости древовидной структуры ваших правил. Вы можете, например, сделать это на основе первой части 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
Задача фрейма - какой список короче, авторизованные или заблокированные адреса?
Вместо того, чтобы отрицать 1,4 миллиона, просто разрешите, возможно, ~ дюжину IP-адресов, которые вы хотите разрешить, и по умолчанию- все отрицать.