Скрипт для автоматического поиска и привязки Floating IP из заданной подсети к виртуальной машине в VK Cloud (OpenStack).
- 🔍 Автоматический поиск Floating IP из указанной подсети (поддержка нескольких подсетей)
- 🚀 Параллельная работа нескольких воркеров для ускорения поиска
- ⏱️ Режим работы по расписанию (работа/пауза циклами)
- 🔄 Автоматическая переавторизация при истечении токена
- 🗑️ Автоматическое удаление неподходящих IP-адресов
- 📢 Уведомления через Apprise (Telegram, Discord, Email и др.)
- ⚙️ Гибкая настройка через переменные окружения
- Python 3.7+
- Библиотеки:
openstacksdk- для работы с OpenStack APIpython-dotenv(опционально) - для автоматической загрузки переменных из .env файлаapprise(опционально) - для уведомлений
- Клонируйте репозиторий или скопируйте скрипт:
git clone <repository_url>
cd vkcloud- Установите зависимости:
pip install openstacksdk python-dotenv appriseИли только обязательные зависимости (без уведомлений):
pip install openstacksdk python-dotenvПримечание: Если python-dotenv не установлен, скрипт будет работать, но вам нужно будет вручную экспортировать переменные окружения перед запуском.
- Создайте файл с переменными окружения:
cp env.example .env- Отредактируйте
.envфайл и заполните необходимые параметры:
nano .envVKCLOUD_USERNAME- ваш логин в VK CloudVKCLOUD_PASSWORD- ваш парольVKCLOUD_PROJECT_ID- ID проекта из панели VK CloudVKCLOUD_SERVER_ID_OR_NAME- ID или имя виртуальной машины
VKCLOUD_AUTH_URL- URL для аутентификации (по умолчанию:https://infra.mail.ru:35357/v3/)VKCLOUD_EXT_NET_NAME- имя внешней сети (если не указано, будет выполнен авто-поиск)VKCLOUD_PORT_ID- конкретный порт ВМ (если не указано, будет выбран первый активный порт)VKCLOUD_TARGET_NET- целевая подсеть для поиска IP (по умолчанию:95.163.248.0/22). Можно указать несколько подсетей через запятую, например:95.163.248.0/22,192.168.1.0/24VKCLOUD_WORKERS_COUNT- количество параллельных воркеров (по умолчанию:1)VKCLOUD_SEQUENTIAL_IP_SCAN- режим последовательного перебора IP внутри диапазона (по умолчанию:false). Еслиtrue, скрипт будет пытаться выделять IP адреса последовательно внутри целевых подсетейVKCLOUD_SLEEP_BETWEEN_ATTEMPTS- пауза между попытками в секундах (по умолчанию:0.6)VKCLOUD_ASSOC_WAIT- время ожидания подтверждения привязки в секундах (по умолчанию:8.0)VKCLOUD_WORK_DURATION_MINUTES- время работы в минутах перед паузой (опционально, если не задано - работает до нахождения IP)VKCLOUD_PAUSE_DURATION_MINUTES- время паузы в минутах между циклами работы (опционально)VKCLOUD_APPRISE_URL- URL для уведомлений через Apprise (опционально)
Полный список параметров см. в файле env.example.
Скрипт автоматически загружает переменные из файла .env (если установлен python-dotenv):
python3 script.pyАльтернативные способы:
Если python-dotenv не установлен, можно использовать один из способов:
# Способ 1: Загрузка через source
source .env
python3 script.py
# Способ 2: Экспорт переменных в одной команде
export $(cat .env | xargs) && python3 script.py
# Способ 3: Указание переменных напрямую
VKCLOUD_USERNAME=user VKCLOUD_PASSWORD=pass python3 script.pyДля ускорения поиска можно запустить несколько параллельных воркеров:
export VKCLOUD_WORKERS_COUNT=5
python3 script.pyСкрипт поддерживает поиск IP в нескольких подсетях одновременно. Укажите подсети через запятую:
export VKCLOUD_TARGET_NET="95.163.248.0/22,192.168.1.0/24,10.0.0.0/8"
python3 script.pyИли в .env файле:
VKCLOUD_TARGET_NET=95.163.248.0/22,192.168.1.0/24,10.0.0.0/8Скрипт будет искать IP, принадлежащий любой из указанных подсетей.
По умолчанию скрипт выделяет случайные floating IP и проверяет, попадают ли они в целевые подсети. Однако можно включить режим последовательного перебора IP адресов внутри диапазона.
Включение режима:
export VKCLOUD_SEQUENTIAL_IP_SCAN=true
python3 script.pyИли в .env файле:
VKCLOUD_SEQUENTIAL_IP_SCAN=trueКак это работает:
- Скрипт генерирует IP адреса последовательно из целевых подсетей (например, 95.163.248.1, 95.163.248.2, и т.д.)
- Пытается выделить каждый IP адрес по очереди
- Если выделение конкретного IP не удается (не поддерживается OpenStack), автоматически переключается на случайный выбор
- После завершения всех IP в подсети, перебор начинается заново
Важно:
- Не все OpenStack окружения поддерживают выделение конкретного IP адреса
- Если ваше окружение не поддерживает эту функцию, скрипт автоматически переключится на обычный режим
- Этот режим может быть медленнее, так как требует больше попыток выделения IP
Скрипт поддерживает режим работы по расписанию: работа заданное время, затем пауза, и так по циклу. Это полезно для длительного поиска с перерывами.
Пример: работа 30 минут, затем пауза 10 минут, и так далее:
export VKCLOUD_WORK_DURATION_MINUTES=30
export VKCLOUD_PAUSE_DURATION_MINUTES=10
python3 script.pyИли добавьте в .env файл:
VKCLOUD_WORK_DURATION_MINUTES=30
VKCLOUD_PAUSE_DURATION_MINUTES=10Особенности режима работы по расписанию:
- Если IP найден во время работы - скрипт завершается успешно
- Если время работы истекло - все воркеры останавливаются, начинается пауза
- После паузы скрипт автоматически возобновляет работу (новый цикл)
- Циклы повторяются до нахождения IP или остановки пользователем
- Если пауза не задана (
VKCLOUD_PAUSE_DURATION_MINUTESне указана), скрипт завершится после первого цикла работы
# Запуск в фоне с перенаправлением вывода в файл
# Если установлен python-dotenv, можно просто:
nohup python3 script.py > vkcloud.log 2>&1 &
# Или без python-dotenv:
nohup bash -c 'export $(cat .env | xargs) && python3 script.py' > vkcloud.log 2>&1 &
# Сохраните PID процесса
echo $! > vkcloud.pidДля остановки:
kill $(cat vkcloud.pid)Для просмотра логов:
tail -f vkcloud.log# Установите screen (если не установлен)
sudo apt-get install screen
# Создайте новую сессию screen
screen -S vkcloud
# В сессии screen запустите скрипт
# Если установлен python-dotenv:
python3 script.py
# Или без python-dotenv:
export $(cat .env | xargs) && python3 script.py
# Отключитесь от сессии (не закрывая её): нажмите Ctrl+A, затем DДля повторного подключения:
screen -r vkcloudДля просмотра списка сессий:
screen -ls# Установите tmux (если не установлен)
sudo apt-get install tmux
# Создайте новую сессию tmux
tmux new -s vkcloud
# В сессии tmux запустите скрипт
# Если установлен python-dotenv:
python3 script.py
# Или без python-dotenv:
export $(cat .env | xargs) && python3 script.py
# Отключитесь от сессии (не закрывая её): нажмите Ctrl+B, затем DДля повторного подключения:
tmux attach -t vkcloud- Создайте файл сервиса:
sudo nano /etc/systemd/system/vkcloud-fip.service- Добавьте следующее содержимое (замените пути на ваши):
[Unit]
Description=VK Cloud Floating IP Finder
After=network.target
[Service]
Type=simple
User=your_username
WorkingDirectory=/path/to/vkcloud
# Если установлен python-dotenv, EnvironmentFile не обязателен
# EnvironmentFile=/path/to/vkcloud/.env
ExecStart=/usr/bin/python3 /path/to/vkcloud/script.py
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target- Перезагрузите systemd и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable vkcloud-fip.service
sudo systemctl start vkcloud-fip.service- Управление сервисом:
# Проверка статуса
sudo systemctl status vkcloud-fip.service
# Просмотр логов
sudo journalctl -u vkcloud-fip.service -f
# Остановка
sudo systemctl stop vkcloud-fip.service
# Перезапуск
sudo systemctl restart vkcloud-fip.serviceСкрипт поддерживает уведомления через Apprise, который поддерживает множество сервисов: Telegram, Discord, Email, Slack, Pushover, Matrix, Microsoft Teams, Rocket.Chat и многие другие.
- Создайте бота через @BotFather
- Получите токен бота
- Узнайте ваш Chat ID (можно через @userinfobot)
- Добавьте в
.env:
# Формат: tgram://<bot_token>@telegram/<chat_id>
VKCLOUD_APPRISE_URL=tgram://123456789:ABCdefGHIjklMNOpqrsTUVwxyz@telegram/123456789- Создайте Webhook в настройках канала Discord (Параметры канала → Интеграции → Вебхуки)
- Скопируйте URL вебхука
- Добавьте в
.env:
# Формат: discord://<webhook_id>/<webhook_token>
VKCLOUD_APPRISE_URL=discord://123456789012345678/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890# SMTP (Gmail, Outlook и др.)
VKCLOUD_APPRISE_URL=mailto://user:password@gmail.com
# С дополнительными параметрами:
VKCLOUD_APPRISE_URL=mailto://user:password@smtp.gmail.com:587/?to=recipient@example.com# Webhook
VKCLOUD_APPRISE_URL=slack://token-a/token-b/token-c
# Bot Token
VKCLOUD_APPRISE_URL=slack://xoxb-12345678/#channel# Webhook
VKCLOUD_APPRISE_URL=msteams://token-a/token-b/token-cVKCLOUD_APPRISE_URL=matrixs://user:password@synapse.example.com/#room:example.comVKCLOUD_APPRISE_URL=pover://user@token/Можно указать несколько URL через запятую (без пробелов):
VKCLOUD_APPRISE_URL=tgram://bot_token@telegram/chat_id,discord://webhook_id/webhook_token,mailto://user:pass@gmail.comВажно:
- URL должны быть разделены запятыми без пробелов
- Каждый URL должен быть валидным форматом Apprise
- При ошибке отправки на один сервис, остальные продолжат работать
Полный список поддерживаемых сервисов и форматов URL: Apprise Documentation
Скрипт отправляет уведомления в следующих случаях:
- Старт поиска - когда скрипт начинает работу (включая информацию о режиме работы по расписанию, если включен)
- Успешная привязка IP - когда найден и привязан подходящий IP
- Пауза - когда время работы истекло и начинается пауза (только в режиме работы по расписанию)
- Возобновление работы - когда пауза завершена и начинается новый цикл работы
- Ошибка - когда все воркеры завершились без результата
- Остановка - когда скрипт остановлен пользователем
🔗 Подключаюсь к VK Cloud (password auth)…
🖥️ ВМ: ubuntu_STD2-1-1_10GB (abc123...)
🔌 Порт: def456...
🌐 Внешняя сеть: internet (ghi789...)
🎯 Целевая подсеть: 95.163.248.0/22
👷 Количество воркеров: 3
🚀 Запускаю параллельный поиск подходящего floating IP…
[Воркер 1] 🔗 Подключен к VK Cloud
[Воркер 2] 🔗 Подключен к VK Cloud
[Воркер 3] 🔗 Подключен к VK Cloud
[Воркер 1] 🔹 Выделен IP: 95.163.248.10
[Воркер 1] ✅ IP 95.163.248.10 принадлежит 95.163.248.0/22. Привязываю к порту def456...
[Воркер 1] 🎉 Привязка подтверждена. Готово!
[Воркер 1] 📌 Итоговый IP: 95.163.248.10
[Воркер 2] 🛑 Остановка: успех достигнут другим воркером
[Воркер 3] 🛑 Остановка: успех достигнут другим воркером
✅ Успешно завершено! IP 95.163.248.10 привязан воркером 1
🔗 Подключаюсь к VK Cloud (password auth)…
🖥️ ВМ: ubuntu_STD2-1-1_10GB (abc123...)
🔌 Порт: def456...
🌐 Внешняя сеть: internet (ghi789...)
🎯 Целевые подсети (3): 95.163.248.0/22, 192.168.1.0/24, 10.0.0.0/8
👷 Количество воркеров: 2
🚀 Запускаю параллельный поиск подходящего floating IP…
[Воркер 1] 🔗 Подключен к VK Cloud
[Воркер 2] 🔗 Подключен к VK Cloud
[Воркер 1] 🔹 Выделен IP: 192.168.1.50
[Воркер 1] ✅ IP 192.168.1.50 принадлежит одной из подсетей (95.163.248.0/22, 192.168.1.0/24, 10.0.0.0/8). Привязываю к порту def456...
[Воркер 1] 🎉 Привязка подтверждена. Готово!
[Воркер 1] 📌 Итоговый IP: 192.168.1.50
[Воркер 2] 🛑 Остановка: успех достигнут другим воркером
✅ Успешно завершено! IP 192.168.1.50 привязан воркером 1
🔗 Подключаюсь к VK Cloud (password auth)…
🖥️ ВМ: ubuntu_STD2-1-1_10GB (abc123...)
🔌 Порт: def456...
🌐 Внешняя сеть: internet (ghi789...)
🎯 Целевая подсеть: 95.163.248.0/22
👷 Количество воркеров: 3
🚀 Запускаю параллельный поиск подходящего floating IP…
⏱️ Режим работы по расписанию: работа 30 мин, пауза 10 мин
[Воркер 1] 🔗 Подключен к VK Cloud
[Воркер 2] 🔗 Подключен к VK Cloud
[Воркер 3] 🔗 Подключен к VK Cloud
[Воркер 1] 🔹 Выделен IP: 192.168.1.1
[Воркер 1] ❌ IP 192.168.1.1 не из 95.163.248.0/22, удаляю…
[Воркер 2] 🔹 Выделен IP: 95.163.248.5
[Воркер 2] ✅ IP 95.163.248.5 принадлежит 95.163.248.0/22. Привязываю к порту def456...
[Воркер 2] 🎉 Привязка подтверждена. Готово!
[Воркер 2] 📌 Итоговый IP: 95.163.248.5
[Воркер 1] 🛑 Остановка: успех достигнут другим воркером
[Воркер 3] 🛑 Остановка: успех достигнут другим воркером
✅ Успешно завершено! IP 95.163.248.5 привязан воркером 2
Если IP не найден за время работы:
[Воркер 1] ⏸️ Время работы истекло (30 мин), ожидаю паузу...
[Воркер 2] ⏸️ Время работы истекло (30 мин), ожидаю паузу...
[Воркер 3] ⏸️ Время работы истекло (30 мин), ожидаю паузу...
⏸️ Пауза на 10 минут...
▶️ Пауза завершена, возобновляю работу...
============================================================
🔄 Цикл работы #2
============================================================
🚀 Запускаю параллельный поиск подходящего floating IP…
⏱️ Режим работы по расписанию: работа 30 мин, пауза 10 мин
...
Все воркеры автоматически останавливаются в следующих случаях:
- Когда один из воркеров успешно находит и привязывает подходящий IP
- Когда истекает время работы (в режиме работы по расписанию)
- При получении сигнала остановки (Ctrl+C)
- Каждый воркер имеет свое соединение с OpenStack API
- Воркеры синхронизируются через механизмы
threading.Eventиthreading.Lock - При успешной привязке IP одним воркером остальные немедленно останавливаются
- Все неподходящие IP-адреса автоматически освобождаются
- Время работы отсчитывается от начала каждого цикла
- Все воркеры синхронизированно останавливаются по истечении времени работы
- Во время паузы скрипт можно остановить через Ctrl+C
- После паузы автоматически начинается новый цикл с новым отсчетом времени
- Проверьте правильность
VKCLOUD_USERNAMEиVKCLOUD_PASSWORD - Убедитесь, что
VKCLOUD_PROJECT_IDуказан верно - Проверьте, что
VKCLOUD_USER_DOMAIN_NAMEустановлен вusers - Убедитесь, что
VKCLOUD_AUTH_URLуказан правильно (должен заканчиваться на/v3/)
- Убедитесь, что
VKCLOUD_SERVER_ID_OR_NAMEуказан правильно - Проверьте, что у вас есть права доступа к этой ВМ
- Можно использовать как ID ВМ, так и её имя
- Укажите
VKCLOUD_EXT_NET_NAMEявно - Проверьте, что в проекте есть внешняя сеть
- Убедитесь, что сеть помечена как
router:external=True
- Убедитесь, что установлен
apprise:pip install apprise - Проверьте правильность формата URL в
VKCLOUD_APPRISE_URL - Проверьте логи на наличие ошибок отправки уведомлений
- Убедитесь, что URL для уведомлений указан правильно (проверьте документацию Apprise)
- Убедитесь, что
VKCLOUD_WORK_DURATION_MINUTESуказано числом больше 0 - Если указано время работы, но не указана пауза, скрипт завершится после первого цикла
- Для бесконечного цикла работы с паузами укажите оба параметра
- Никогда не коммитьте файл
.envв репозиторий! - Добавьте
.envв.gitignore - Используйте сильные пароли
- Для production рекомендуется использовать переменные окружения системы вместо файла
.env - Не используйте
VKCLOUD_VERIFY=falseв production окружении - Храните учетные данные в безопасном месте с ограниченным доступом
- Для быстрого поиска рекомендуется использовать 3-5 воркеров
- Слишком большое количество воркеров может привести к превышению лимитов API
- Начните с 1-2 воркеров и увеличивайте при необходимости
- Для длительного поиска используйте циклы 30-60 минут работы с паузами 10-15 минут
- Паузы помогают избежать перегрузки API и снижают нагрузку на систему
- Учитывайте лимиты вашего проекта при настройке времени работы
- Используйте уведомления для отслеживания статуса работы скрипта
- Регулярно проверяйте логи при работе в фоне
- При использовании systemd service используйте
journalctlдля просмотра логов
Этот скрипт предоставляется "как есть" без каких-либо гарантий.