Skip to content

TrackLine/vkcloud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 

Repository files navigation

VK Cloud Floating IP Finder

Скрипт для автоматического поиска и привязки Floating IP из заданной подсети к виртуальной машине в VK Cloud (OpenStack).

Возможности

  • 🔍 Автоматический поиск Floating IP из указанной подсети (поддержка нескольких подсетей)
  • 🚀 Параллельная работа нескольких воркеров для ускорения поиска
  • ⏱️ Режим работы по расписанию (работа/пауза циклами)
  • 🔄 Автоматическая переавторизация при истечении токена
  • 🗑️ Автоматическое удаление неподходящих IP-адресов
  • 📢 Уведомления через Apprise (Telegram, Discord, Email и др.)
  • ⚙️ Гибкая настройка через переменные окружения

Требования

  • Python 3.7+
  • Библиотеки:
    • openstacksdk - для работы с OpenStack API
    • python-dotenv (опционально) - для автоматической загрузки переменных из .env файла
    • apprise (опционально) - для уведомлений

Установка

  1. Клонируйте репозиторий или скопируйте скрипт:
git clone <repository_url>
cd vkcloud
  1. Установите зависимости:
pip install openstacksdk python-dotenv apprise

Или только обязательные зависимости (без уведомлений):

pip install openstacksdk python-dotenv

Примечание: Если python-dotenv не установлен, скрипт будет работать, но вам нужно будет вручную экспортировать переменные окружения перед запуском.

  1. Создайте файл с переменными окружения:
cp env.example .env
  1. Отредактируйте .env файл и заполните необходимые параметры:
nano .env

Настройка

Обязательные параметры

  • VKCLOUD_USERNAME - ваш логин в VK Cloud
  • VKCLOUD_PASSWORD - ваш пароль
  • VKCLOUD_PROJECT_ID - ID проекта из панели VK Cloud
  • VKCLOUD_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/24
  • VKCLOUD_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, принадлежащий любой из указанных подсетей.

Последовательный перебор 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 не указана), скрипт завершится после первого цикла работы

Запуск в фоне на Ubuntu Server

Способ 1: Использование nohup

# Запуск в фоне с перенаправлением вывода в файл
# Если установлен 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

Способ 2: Использование screen

# Установите 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

Способ 3: Использование tmux

# Установите 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

Способ 4: Создание systemd service (рекомендуется)

  1. Создайте файл сервиса:
sudo nano /etc/systemd/system/vkcloud-fip.service
  1. Добавьте следующее содержимое (замените пути на ваши):
[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
  1. Перезагрузите systemd и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable vkcloud-fip.service
sudo systemctl start vkcloud-fip.service
  1. Управление сервисом:
# Проверка статуса
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

Скрипт поддерживает уведомления через Apprise, который поддерживает множество сервисов: Telegram, Discord, Email, Slack, Pushover, Matrix, Microsoft Teams, Rocket.Chat и многие другие.

Примеры настройки

Telegram

  1. Создайте бота через @BotFather
  2. Получите токен бота
  3. Узнайте ваш Chat ID (можно через @userinfobot)
  4. Добавьте в .env:
# Формат: tgram://<bot_token>@telegram/<chat_id>
VKCLOUD_APPRISE_URL=tgram://123456789:ABCdefGHIjklMNOpqrsTUVwxyz@telegram/123456789

Discord

  1. Создайте Webhook в настройках канала Discord (Параметры канала → Интеграции → Вебхуки)
  2. Скопируйте URL вебхука
  3. Добавьте в .env:
# Формат: discord://<webhook_id>/<webhook_token>
VKCLOUD_APPRISE_URL=discord://123456789012345678/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890

Email

# 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

Slack

# Webhook
VKCLOUD_APPRISE_URL=slack://token-a/token-b/token-c

# Bot Token
VKCLOUD_APPRISE_URL=slack://xoxb-12345678/#channel

Microsoft Teams

# Webhook
VKCLOUD_APPRISE_URL=msteams://token-a/token-b/token-c

Matrix

VKCLOUD_APPRISE_URL=matrixs://user:password@synapse.example.com/#room:example.com

Pushover

VKCLOUD_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

Типы уведомлений

Скрипт отправляет уведомления в следующих случаях:

  1. Старт поиска - когда скрипт начинает работу (включая информацию о режиме работы по расписанию, если включен)
  2. Успешная привязка IP - когда найден и привязан подходящий IP
  3. Пауза - когда время работы истекло и начинается пауза (только в режиме работы по расписанию)
  4. Возобновление работы - когда пауза завершена и начинается новый цикл работы
  5. Ошибка - когда все воркеры завершились без результата
  6. Остановка - когда скрипт остановлен пользователем

Примеры вывода

Обычный режим работы

🔗 Подключаюсь к 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 для просмотра логов

Лицензия

Этот скрипт предоставляется "как есть" без каких-либо гарантий.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages