IP-ограничитель
1. Зачем нужен IP-лимит?
В мире сетей реальные пользователи и боты смешиваются, а нормальные запросы и аномальные запросы переплетаются. Как поставщик услуг, все хотят, чтобы запросы исходили от реальных пользователей и их реальных запросов, что позволяет максимизировать рентабельность инвестиций. Однако всегда найдутся люди, которые незаконно пытаются получить информацию о поставщике или использовать ценные данные для своих целей. Как владелец данных, вы не хотите, чтобы ваши данные использовались другими людьми. Поэтому необходимо принять некоторые меры защиты данных. Одним из эффективных решений является ограничение IP.
Поскольку боты обычно работают на одном или нескольких серверах (хотя они могут приобрести больше серверов, но это будет стоить дороже), можно отслеживать и записывать аномальный трафик с этих IP-адресов. Это позволяет определить, являются ли запросы, исходящие от этих IP-адресов, реальными запросами пользователей.
2. Цели:
1. Интерактивная архитектура
2. Архитектурная реализация
3. Системные модули
— Модуль агента для сбора данных о доступе к различным уровням, который должен быть интегрирован с приложениями.
— Контрольный модуль для администрирования и управления, реализованный по схеме Master/Slave. Мастер отвечает за выполнение задач по расписанию, проверку узлов и мониторинг чёрного списка IP.
1. Высокая производительность
2. Высокая доступность
3. Масштабируемость
4. Простота использования
По умолчанию система сохраняет данные о доступе за последний час и размещает данные каждого приложения в отдельном хэш-ключе. Для обеспечения эффективности доступа используется Redis, также поддерживается расширение для других хранилищ.
1. Чёрный список IP
Используется ключ «black-ips» для хранения глобального чёрного списка IP в виде хэша. Ключом является IP, а значением — объект com.eeeffff.limiter.common.vo.BlackIpVO со следующими полями:
Примечание:
Данные чёрного списка IP для каждого приложения хранятся отдельно под ключом «приложение-имя — black-ips», например, данные чёрного списка IP платформы управления ограничителем IP хранятся под ключом «ip-limiter-dashboard-black-ips».
2. Белый список IP
Ключ «white-ips» используется для хранения глобального белого списка IP в виде хэша. Ключом является IP, а значением — объект com.eeeffff.limiter.common.vo.WhiteIpVO со следующими полями:
Примечание:
Данные белого списка IP для каждого приложения хранятся отдельно под ключом «приложение-имя — white-ips», например, данные белого списка IP платформы управления ограничителем IP хранятся под ключом «ip-limiter-dashboard-white-ips».
3. Доступ за минуту
Ключ «minute-access» используется для хранения сводной статистики доступа за каждую минуту для всех приложений, подключённых к платформе ограничения IP. Данные хранятся в виде хэша, где ключом является минута, а значением является список объектов com.eeeffff.limiter.common.vo.AccessVO со следующими полями:
Примечание:
Для каждого приложения данные доступа за минуту хранятся отдельно под ключом «приложение-имя — minute-access», например, данные доступа за минуту платформы управления ограничителем IP хранятся под ключом «ip-limiter-dashboard-minute-access».
Для каждого узла приложения данные доступа за минуту также хранятся отдельно под ключом «приложение-имя — IP и порт — minute-access», например, данные доступа за минуту платформы управления ограничителем IP на узле с IP 127.0.0.1 и портом 20520 хранятся под ключом «ip-limiter-dashboard-127.0.0.1:20520-minute-access».
4. Ограничение IP
Ключ «ip-limit» используется для хранения глобальных настроек QPS для IP в виде хэша. Ключом является IP, а значением — объект com.eeeffff.limiter.common.vo.IpLimitVO со следующими полями:
Примечание:
Настройки QPS для каждого приложения хранятся отдельно под ключом «приложение-имя — ip-limit», например, настройки QPS платформы управления ограничителем IP хранятся под ключом «ip-limiter-dashboard-ip-limit».
5. Зарегистрированные клиенты
Ключ «registered-clients» используется для хранения информации о клиентах, зарегистрированных в платформе управления ограничителем IP. Данные хранятся в виде хэша, где ключом является имя приложения, а значением является карта, содержащая информацию обо всех зарегистрированных клиентах этого приложения. Карта использует IP+порт в качестве ключа и объект com.eeeffff.limiter.common.vo.Client в качестве значения со следующими полями: 6. ip-limiter-dashboard-master
Используется для хранения ключа Master-узла платформы IP-лимитирования. Значение ключа — IP и порт текущего Master-узла.
7. permitsPerSecondEachIp
Используется для хранения значения по умолчанию максимального QPS для каждого IP. Значение ключа — максимальное значение QPS по умолчанию для каждого IP.
Примечание:
Каждое приложение хранит отдельное значение максимального QPS по умолчанию для своего IP. Ключ для хранения этого значения имеет формат «название приложения — permitsPerSecondEachIp». Например, для приложения ip-limiter-dashboard ключ будет называться «ip-limiter-dashboard-permitsPerSecondEachIp».
1. IP-ограничитель Agent
Этот агент интегрируется в приложение и предоставляет некоторые удобные функции, такие как сбор и отправка данных о доступе IP, получение чёрного/белого списка IP с удалённой консоли управления и т. д.
Каждый узел сохраняет 60 копий статистических данных доступа за 60 минут с интервалом в минуту и 60 копий данных с интервалом в секунду. Эти настройки можно изменить в соответствии с соответствующими параметрами конфигурации.
1)Функциональный модуль
2)Алгоритм ограничения
Существует несколько популярных алгоритмов ограничения: — счётчик (фиксированное окно); — скользящее окно; — дырявое ведро; — маркерное ведро.
В данном случае используется алгоритм счётчика (фиксированного окна), так как он подходит для ограничения одного IP, а не всех запросов. Этот алгоритм прост в реализации и может обрабатывать определённые пиковые нагрузки. Класс реализации — com.eeeffff.limiter.core.interceptor.IpQpsRateLimiter.
3)Основные функции Проверка легитимности доступа IP: обеспечение того, что доступ IP не превышает ограничение QPS. Если IP находится в чёрном списке, доступ блокируется. Это обеспечивает безопасность системы.
Отчётность о локальных данных доступа: в настоящее время только данные о доступе каждого IP за минуту активно отправляются.
Обновление чёрного и белого списков IP и конфигурации ограничения QPS с удалённых серверов: обновлённые конфигурации хранятся в локальном кэше для обеспечения эффективности проверки легитимности доступа.
Предоставление интерфейса статистики доступа в реальном времени с точностью до секунды: удалённая консоль управления может вызывать этот интерфейс для получения информации о текущем состоянии приложения.
4)Основной процесс
Проверка легитимности запроса
Запрос проходит проверку легитимности, которая включает в себя следующие шаги:
Если IP находится в белом списке, запрос считается легитимным. Если IP находится в чёрном списке или превышает ограничение QPS, запрос отклоняется. В противном случае количество обращений IP увеличивается на единицу.
Проверка белого списка IP
Запрос проверяется на соответствие белому списку IP. Если IP присутствует в белом списке, он считается легитимным и проверка завершается.
Проверка чёрного списка IP
Запрос проверяется на соответствие чёрному списку IP. Если IP отсутствует в чёрном списке, проверка продолжается. Если IP присутствует в чёрном списке, запрос отклоняется и проверка завершается.
Проверка ограничения QPS
Проверяется, превышает ли количество обращений данного IP ограничение QPS за указанный период времени. Если количество обращений не превышает ограничение, проверка продолжается. Иначе запрос отклоняется, и проверка завершается.
Увеличение количества обращений IP
Количество обращений IP увеличивается на 1.
Ограничение доступа при превышении QPS
При превышении IP ограничения QPS применяются следующие меры:
— Если это первый случай превышения QPS данным IP, его временно добавляют в чёрный список на одну минуту. — Если после снятия ограничений в течение одной минуты происходит повторное превышение QPS этим IP, срок блокировки увеличивается до одного часа. — При повторном превышении QPS после снятия часового ограничения срок блокировки увеличивается до 24 часов. — После снятия суточной блокировки при повторном превышении QPS срок блокировки становится постоянным.
После снятия блокировки IP автоматически удаляется из чёрного списка, если в течение указанного периода времени не было превышений QPS.
5) Основные настройки
#IP Limiter控制台的地址
ip.limiter.core.dashboardAddress = 127.0.0.1:8080
#当前服务器的IP地址
ip.limiter.core.serverAddress = [не настроено, используется автоматическое определение, можно указать конкретное значение]
#в локальном кеше хранится количество копий данных о доступе с точностью до секунд
ip.limiter.core.secondsMetricLocalKeeped = 60
#локальное приложение хранит максимум 60 копий данных о доступе за минуту
ip.limiter.core.maxTopAccessMinutes = 60
#интервал обновления чёрного списка IP и настроек ограничения QPS из удалённой консоли управления, в миллисекундах
ip.limiter.core.ipQpsLimitAndBlackIpUpdateTimeInterval = 10000
2. IP-ограничитель Control Panel
1)Функциональные модули
2)Основные функции a) Ограничение доступа при превышении лимита QPS
Для IP, превышающих лимит QPS, применяется временное ограничение доступа. Доступ может быть ограничен на одну минуту, один час, 24 часа или навсегда.
Правила и условия повышения уровня ограничения доступа:
— Для впервые превысивших лимит IP доступ ограничивается на одну минуту. Если в течение следующей минуты не происходит превышения лимита, ограничение снимается. — Для IP, которым был ограничен доступ на одну минуту и которые снова превысили лимит после снятия ограничения, уровень ограничения повышается до одного часа. Если после часовой блокировки не происходит превышений, ограничение снимается. — Для IP, которым был ограничен доступ на один час и которые снова превысили лимит после снятия ограничения, уровень ограничения повышается до 24 часов. Если после суточной блокировки не происходит превышений, ограничение снимается. — Для IP, которым был ограничен доступ на 24 часа и которые снова превысили лимит после снятия ограничения, устанавливается постоянное ограничение доступа.
b) Управление чёрным и белым списками IP
Поддерживается управление чёрными и белыми списками для конкретных приложений. Чёрные списки могут быть глобальными или специфичными для приложения. Управление включает добавление, удаление и поиск IP в списках.
c) Настройка максимального лимита QPS для IP
Настройка максимального лимита QPS может осуществляться для отдельных IP, всех IP конкретного приложения или всех IP по умолчанию. Правила определения превышения лимита применяются в следующем порядке:
— Сначала проверяется, не превышен ли лимит для конкретного IP. — Затем проверяется, не превышен ли общий лимит для всех IP данного приложения. — Наконец, проверяется, не превышен ли глобальный лимит для всех IP по умолчанию.
d) Регистрация и проверка состояния клиентов
Клиенты регулярно регистрируются на панели управления. Состояние клиентов проверяется следующим образом:
— Если три попытки проверки состояния клиента завершаются неудачно, клиент удаляется из приложения. — Если все клиенты приложения не проходят проверку, приложение удаляется.
e) Автоматическое восстановление IP из чёрного списка
IP, добавленные в чёрный список за первое превышение лимита, автоматически удаляются из списка через минуту, если не происходит новых превышений.
Аналогично, IP, ограниченные доступом на одну минуту за повторное превышение, автоматически восстанавливаются через минуту после отсутствия новых нарушений. Ограничение доступа к IP, который был ограничен на 24 часа
Если в течение 24 часов после снятия ограничения на доступ к IP не будет зафиксировано превышение лимита, то система автоматически удалит этот IP из чёрного списка.
f) Запрос информации о текущем доступе к приложению
В консоли можно запросить информацию о текущем IP-адресе, с которого осуществляется доступ к определённому узлу приложения.
3) Основные процессы
a) Регистрация проверки работоспособности клиента
b) Система проверяет IP, которые автоматически добавляются в чёрный список.
4) Основные настройки
spring.boot.enableautoconfiguration=true
# Сервисный порт
server.port = 8080
spring.application.name = ip-limiter-dashboard
# Следующие параметры конфигурации необходимы для Apollo, если вы используете его в качестве центра конфигурации. Если вы запускаете через Apollo, вам нужно добавить соответствующие параметры в командной строке, например:
# -Dspring.profiles.active=DEV -Dapollo.meta=http://apollo.dev.xxx.com:8072
## Этот параметр передаётся через командную строку. Он используется при запуске команды и позволяет поддерживать несколько различных сред.
##active.env= DEV
## При использовании Apollo для загрузки конфигурации необходимо включить эту опцию перед инициализацией журнала.
#apollo.bootstrap.eagerLoad.enabled = true
## Уникальный идентификатор приложения
#app.id = ip-limiter-dashboard
## Адрес сервера метаданных Apollo. Этот параметр необходимо передать через командную строку при запуске, чтобы обеспечить поддержку нескольких сред.
##apollo.meta = http://apollo.dev.xxx.com:8072
## Путь к файлу локального кэша конфигурации
#apollo.cacheDir = ./config
## Загрузка конфигурации Apollo при запуске приложения
#apollo.bootstrap.enabled = true
## Внедрение пространства имён приложения
#apollo.bootstrap.namespaces = application
# Если вы используете Apollo в качестве центра конфигурации, скопируйте следующие настройки в Apollo и закомментируйте их в этом файле конфигурации.
ip.limiter.dashboard.permitsPerSecondEachIp = 50
ip.limiter.dashboard.maxTopAccessIps = 10
ip.limiter.dashboard.maxRedisTopAccessIps = 50
ip.limiter.dashboard.globalMaxRedisTopAccessIps = 50
ip.limiter.dashboard.maxRedisTopAccessMinutes = 60
ip.limiter.dashboard.globalMaxRedisTopAccessMinutes = 60
ip.limiter.dashboard.redisLockMaxWaitMillis = 60000
ip.limiter.dashboard.maxTopAccessMinutes = 30
ip.limiter.dashboard.connectTimeout = 5000
ip.limiter.dashboard.soTimeout = 5000
ip.limiter.dashboard.maxConnTotal = 100
ip.limiter.dashboard.maxConnPerRoute = 10
ip.limiter.dashboard.maxHttpRetryTimes = 5
ip.limiter.dashboard.httpRetryIntervalTime = 20
ip.limiter.dashboard.appClientHealthCheckRate = 1
ip.limiter.dashboard.systemAddBlackIpCheckRate = 1
spring.redis.host = 192.168.12.111
spring.redis.port = 6379
spring.redis.password = 8lFvrZh7d7Ik8LtNwpBMakleishen
spring.redis.database = 12
spring.redis.timeout = 5000
spring.redis.jedis.pool.max-idle = 8
spring.redis.jedis.pool.min-idle = 0
spring.redis.jedis.pool.max-wait = 8
spring.redis.jedis.pool.max-active = 20
ip.limiter.core.dashboardAddress = 127.0.0.1:8080
5) Интерфейс функций
(Для одного приложения) Статистика доступа TOP по широте и долготе
(Для одного приложения) Статистика секундного доступа TOP
(Для одного приложения) Настройка белого списка IP
(Для одного приложения) Настройка чёрного списка IP
(Для одного приложения) Установка QPS для отдельного IP
(На уровне отдела) Статистика доступа TOP по широте и долготе
(Глобальный) Настройка чёрного списка
(Глобальный) Настройка белого списка
(Глобальный) Установка QPS для отдельных IP
1. Скачивание исходного кода и организация
git clone https://gitee.com/laofeng/ip-limiter.git
cd ip-limiter
2. Изменение необходимых основных файлов конфигурации
Сначала необходимо запустить консоль управления ограничением IP. Консоль управления IP по умолчанию использует Redis для хранения данных, поэтому необходимо сначала настроить Redis, иначе приложение может выдать ошибку во время выполнения. Измените основные файлы конфигурации консоли управления IP (ip-limiter-dashboard/src/main/resources/application.properties), необходимо изменить только конфигурацию Redis, остальные значения можно оставить по умолчанию:
spring.redis.host = 192.168.12.111
spring.redis.port = 6379
spring.redis.password = 8lFvrZh7d7Ik8LtNwpBMakleishen **3. Запуск IP-платформы управления доступом**
cd ip-limiter-dashboard ./start.sh
*Примечание: при запуске появится несколько предупреждений, связанных с Apollo. Эти предупреждения можно игнорировать. Если они вас беспокоят, вы можете удалить ссылки на Apollo в файле pom.xml и удалить соответствующий код.*
Адрес доступа к консоли управления:
- адрес отдельной панели управления приложением: [http://127.0.0.1:8080/limiter](http://127.0.0.1:8080/limiter);
- глобальный адрес панели управления приложениями: [http://127.0.0.1:8080/global-limiter](http://127.0.0.1:8080/global-limiter).
**4. Запуск демонстрационного приложения**
Демонстрационное приложение находится в каталоге ip-limiter-samples и включает три демонстрационных приложения:
- ip-limiter-spring-boot-sample: используется для демонстрации интеграции Spring Boot с платформой управления IP;
- ip-limiter-spring-mvc-sample: используется для демонстрации обычного приложения Spring MVC, интегрированного с платформой управления IP;
- ip-limiter-spring-gateway-sample: используется для демонстрации приложения Spring Gateway, интегрированного с платформой управления IP.
Эти три типа приложений охватывают большинство типов приложений. Каждый тип приложения имеет свои особенности интеграции.
**1) Запуск ip-limiter-spring-boot-sample**
Сначала перейдите в каталог ip-limiter-spring-boot-sample и выполните следующие команды для запуска:
./install.sh ./start.sh
По умолчанию порт — 10000. После успешного запуска вы можете получить доступ к [http://localhost:10000/hello](http://localhost:10000/hello), чтобы проверить это. Когда консоль выведет сообщение об успешной регистрации в платформе управления IP, вы увидите это приложение в раскрывающемся списке в левом верхнем углу консоли.
**2) Запуск ip-limiter-spring-mvc-sample**
Для запуска этого демонстрационного приложения необходимо сначала добавить плагин Jetty в /etc/maven/setting.xml:
Затем перейдите в каталог ip-limiter-spring-mvc-sample и запустите его с помощью следующей команды:
./runJetty.sh
Во время запуска могут появиться некоторые ошибки Jetty, но их можно проигнорировать. По умолчанию порт — 10001. После успешного запуска вы можете перейти по адресу http://localhost:10001/app/health, чтобы проверить его. Когда консоль выведет сообщение об успешной регистрации в платформе управления IP, вы увидите это приложение в раскрывающемся списке в левом верхнем углу консоли.
3) Запуск ip-limiter-spring-gateway-sample
Сначала перейдите в каталог ip-limiter-spring-gateway-sample и выполните следующие команды для запуска:
./install.sh
./start.sh
По умолчанию порт — 10002. После успешного запуска вы можете обратиться к http://localhost:10002/api_hello/hello, чтобы проверить это. Этот запрос проходит через шлюз и обращается к http://localhost:10000/hello. Поэтому перед проверкой приложения ip-limiter-spring-gateway-sample необходимо запустить ip-limiter-spring-boot-sample. Когда консоль выведет сообщение об успешной регистрации в платформе управления IP, вы увидите это приложение в раскрывающемся списке в левом верхнем углу консоли.
Текущая версия приложения — 1.1.3.
Чтобы интегрировать приложение Spring Boot, добавьте зависимость от основного модуля ядра клиента ограничения IP:
<dependency>
<groupId>com.eeeffff.limiter</groupId>
<artifactId>ip-limiter-core-web</artifactId>
<version>${ip-limiter-core.version}</version>
</dependency>
Больше ничего делать не нужно. Это очень удобно.
Интеграция приложений Spring MVC немного сложнее, но всё равно проста. 1)Добавьте зависимость от основного модуля ядра клиентского ограничения IP:
<dependency>
<groupId>com.eeeffff.limiter</groupId>
<artifactId>ip-limiter-core-web</artifactId>
<version>${ip-limiter-core.version}</version>
</dependency>
2)Включите пакет платформы управления IP в сканирование и добавьте Inteceptor:
Поскольку платформа управления IP основана на Inteceptor, в конфигурации Spring добавьте следующее:
<context:component-scan base-package="com.eeeffff.limiter"></context:component-scan>
<mvc:interceptors>
<ref bean="ipLimiterInterceptor" />
</mvc:interceptors>
Если у вас возникли проблемы с интеграцией, обратитесь к примеру ip-limiter-spring-mvc-sample.
Spring Gateway использует Netty в качестве коммуникационного модуля и не может использовать Inteceptor для реализации, как другие приложения. Вместо этого он должен использовать GlobalFilter и WebFilter вместе. Поэтому необходимо интегрировать разные пакеты:
<dependency>
<groupId>com.eeeffff.limiter</groupId>
<artifactId>ip-limiter-core-spring-gateway</artifactId>
<version>${ip-limiter-core.version}</version>
</dependency>
Как и в случае с обычными приложениями Spring Boot, вам не нужно ничего делать. Всё очень просто.
Присоединяйтесь к организации:
Если изображение группы устарело, пожалуйста, свяжитесь со мной по номеру 13265554108 или отправьте сообщение с кодовым словом «ip-limiter».
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )