Рейтинг:14

Заблокируйте 1,4 миллиона IP-адресов на VPS

флаг be

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

-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -d IP_HERE/32 -j DROP

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

Без заблокированных IP-адресов в iptables:

1 Гбит/с

С заблокированными IP в iptables:

3 Мбит/с в пике.

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

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

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

флаг pk
Можем ли мы спросить, почему вы хотите заблокировать 1,4 миллиона IP-адресов? Это много IP. Вместо этого может быть проще убедиться, что ваш сервер безопасен.
peterh avatar
флаг vn
Есть новая вещь под названием **ipset**. Я этого не знаю, но, возможно, стоит попробовать. Это новая структура брандмауэра в Linux, на самом деле iptables сегодня — это всего лишь слой совместимости поверх ipset.
флаг aq
Если вы пытаетесь заблокировать IP-адреса на основе местоположения/страны, скажите об этом, для этого есть решения, которые не включают миллионы записей iptable.
флаг pk
также, пожалуйста, не блокируйте IP-адреса на основе местоположения / страны без очень веской причины. Не просто "о, в этой стране есть хакеры"
ilkkachu avatar
флаг co
@peterh, ты имеешь в виду nftables? Я думаю, что ipset существует уже некоторое время, и, насколько я знаю, речь идет только о правилах, которые включают, ну, набор адресов.
TooTea avatar
флаг cn
Наборы ipsets @peterh включены в ядро ​​с версии [2.6.39](https://kernelnewbies.org/Linux_2_6_39#IPset), выпущенной десять лет назад. Они уже существовали до этого в виде внешнего патча.
user26742873 avatar
флаг cn
@ user253751 Может быть, оператор блокирует весь ЕС из-за закона о файлах cookie? :П
peterh avatar
флаг vn
@TooTea Хорошо, спасибо. Что мне интересно, как ipset сопоставляет ip с ipset (скорее всего это набор ips с маской). Использует ли он дерево или хеш внутри? Если да, то это будет очень быстро. С iptables единственный способ сопоставить IP с набором правил — это линейный поиск, потому что Тьюринг.
jcaron avatar
флаг me
Являются ли IP-адреса действительно отдельными IP-адресами или они являются частью ограниченного числа диапазонов?
флаг be
IP-адреса являются индивидуальными, и большинство из них являются прокси
mckenzm avatar
флаг in
Конечно, это должен быть хешированный (иначе он будет довольно несбалансированным) индекс. «молниеносная скорость» согласно ссылке в ответе @Cyrbil.
Рейтинг:32
флаг in

Вы должны взглянуть на 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 но это уменьшит размер вашего списка.


С другой стороны, с точки зрения производительности, это очень быстро и масштабируется без штрафов. Как Облачная вспышкаупоминание в блоге, есть более быстрые низкоуровневые подходы; но это намного сложнее и добавляет всего несколько байтов в секунду, что, если у вас нет масштаба и амбиций облачного провайдера, не стоит затраченных усилий.

iBug avatar
флаг tr
Обработка отдельных IP-адресов в диапазоны определенно необходима. Затем вы можете использовать `hash:net` для набора и еще большей производительности.
Рейтинг:20
флаг za

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

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

флаг fr
Это больше похоже на то, что он хочет заблокировать предопределенный набор «плохих IP-адресов». Для большинства приложений система белого списка, вероятно, будет бесполезна.
Рейтинг:15
флаг in

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

sudo ufw deny с 192.0.0.0/8 на любой

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

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

флаг mx
Давайте все предположим, что OP хочет заблокировать адреса, которые не входят в диапазон.
iBug avatar
флаг tr
UFW, как он сам себя описывает, является интерфейсом для iptables. Это делает его производительность даже хуже, чем ручное обслуживание цепочек iptables.
флаг in
Почему _хуже_? Это не похоже на то, что правила iptables обращаются к ufw, это просто внешний интерфейс для их настройки в первую очередь. Хотя явно _лучше_ тоже не будет.
iBug avatar
флаг tr
@Useless UFW создает больше цепочек для каждого пакета, который нужно пройти, тогда как поддерживаемые вручную правила могут быть *намного* проще и, следовательно, более производительными.
флаг in
Так сказать, «ufw генерирует слишком простые правила, и вы можете вручную создать лучшие» или что-то в этом роде. Собственная производительность UFW не является проблемой, и тот факт, что это интерфейс, не делает автоматически его правила плохими. Это не хуже, чем написанные от руки правила, которые _не_ умеют использовать цепочки.
Nate T avatar
флаг it
@useless, так как это интерфейс, каждый раз, когда появляется запрос. он обрабатывается ufw, который затем за кулисами вызывает iptables. Как только iptables сопоставит ip с перечисленными правилами, он должен передать эту информацию обратно в ufw, который разрешит или запретит. Это типичный поток fe/be. Вырезание `ufw` устраняет половину шагов. Тем не менее, производительность inc/dec будет зависеть не от того, сколько ips блокируется, а от того, сколько запросов действительно поступает.
флаг in
@NateT Я уже указывал, что это абсолютно неправда. ufw предоставляет простой интерфейс для iptables, который сам настраивает правила в модуле netfilter ip_tables. Действия по фильтрации пакетов никогда не передаются из модуля ядра ip_tables в компонент пользовательского пространства iptables, а тем более во внешний интерфейс ufw для этого.
Nate T avatar
флаг it
Тогда это НЕ ФРОНТЭНД. Приложение 1, обновляющее хранилище данных приложения 2, не делает приложение 1 «внешним интерфейсом» для приложения 2. Если оба приложения не вызываются в том порядке, который я описал, вы можете назвать его как угодно (назовите его «Нэнси в ее красное платье», мне все равно), но называть это интерфейсом в обсуждении скорости алгоритма никогда не было хорошей идеей. Пользователей этой сети всегда критикуют за то, что они слишком придирчивы к терминам, но ^это^ — вот что может сделать слегка неправильно использованный термин. @бесполезный
Nate T avatar
флаг it
Если я неправильно понимаю, пожалуйста, опишите ход событий. Если используются оба приложения, они оба занимают память и временные ресурсы, даже если они только выводят hello world на консоль. Знаешь что? Я посмотрю, чтобы вам не пришлось печатать. Мне все равно сейчас интересно. Единственное исключение, которое я могу придумать, это случай, когда iptables вообще не вызывается, а используются/обновляются только его данные. В таком случае ^^^
Рейтинг:13
флаг jp

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

iptables -N правило8_192_0_0_0
iptables -N правило8_172_0_0_0
iptables -N правило8_10_0_0_0

iptables -A ВХОД -s 192.0.0.0/8 -j правило8_192_0_0_0
iptables -A ВХОД -s 172.0.0.0/8 -j правило8_172_0_0_0
iptables -A ВХОД -s 10.0.0.0/8 -j правило8_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
Рейтинг:4
флаг tr

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

iptables -I INPUT -m conntrack --ctstate УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ

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

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

Рейтинг:1
флаг us

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

ip route добавить blackhole IPv4/32

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

Рейтинг:1
флаг fr

XDP_DROP, вероятно, является излишним, если вы не планируете запускать эти черные списки на чрезвычайно высоких скоростях передачи пакетов (думаю, > 1 млн. пакетов в секунду). Поэтому я бы порекомендовал Cyrbil anwser, если у вас нет опыта работы с кодом.

Если вы все же хотите попробовать XDP, вам нужно что-то, называемое фильтр Блума который может быстро проверить, является ли IP «возможно, в наборе» или «определенно не в наборе»

Пример фильтра Блума на C: Этот пост в блоге

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.