You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
8.0 KiB
202 lines
8.0 KiB
КЛИЕНТ И АДМИНКА VPN
|
|
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
|
|
|
|
ЦЕЛЬ
|
|
Разработка клиента VPN под Windows с пользовательским интерфейсом,
|
|
функцией автообновления, и панели управления (админки).
|
|
|
|
КЛИЕНТ
|
|
Клиент обладает простым оконным интерфейсом, со следующими
|
|
элементами управления:
|
|
* список стран - флажки и названия стран, от имени которых
|
|
клиент может вести работу.
|
|
Получаем со шлюза VPN.
|
|
Также рядом с каждой страной указана метаинформация:
|
|
наилучшее,наихудшее и среднее значения полосы пропускания и пинга для
|
|
шлюзов в данной стране.
|
|
* Кнопка Connect/Disconnect.
|
|
|
|
Машина состояний следующая:
|
|
- Disconnected: не соединены.
|
|
Список стран и кнопка Connect доступны.
|
|
- Connecting: соединяемся
|
|
На кнопке надпись Connecting. Кнопка доступна,
|
|
но переход возможен только в состояние Disconnected.
|
|
Список стран заблокирован (серый цвет, disabled).
|
|
- Connected: соединены.
|
|
На кнопке надпись Connected. Кнопка доступна,
|
|
но переход возможен только в состояние Disconnected.
|
|
Список стран заблокирован (серый цвет, disabled).
|
|
|
|
В состоянии Connected должны отображаться время пинга,
|
|
полоса пропускания канала и IP-адрес шлюза.
|
|
|
|
Клиент является оберткой над OpenVPN, которая умеет принять с управляющего сервера
|
|
необходимые настройки для формирования конфига openvpn (или даже готовый конфиг)
|
|
и запустить процесс openvpn со стартом соединения.
|
|
|
|
ИНСТАЛЛЯТОР
|
|
У программы должен быть простой инсталлятор на NSIS.
|
|
Инсталлятор должен уметь:
|
|
- проверить наличие программы в системе
|
|
- работать в режиме обновления, если программа установлена.
|
|
При этом, нужно останавливать процесс перед обновлением.
|
|
|
|
В самом клиенте должна быть функция проверки обновлений.
|
|
Также, должна быть служба автоматической проверки обновлений (сервис Windows).
|
|
|
|
В инсталляторе должно быть предусмотрены точки расширения, для запуска произвольных
|
|
.exe и скриптов командной строки.
|
|
К примеру, могут быть скрипты
|
|
pre_update.bat
|
|
post_update_success.bat
|
|
post_update_error.bat
|
|
которые выполняются до и после процесса установки (в случае успеха и неудачи, соответственно).
|
|
Скрипты должны присутствовать и запускаться даже в том случае, если их содержимое пусто.
|
|
|
|
|
|
НАСТРОЙКИ КЛИЕНТА
|
|
- адрес управляющего сервера (задается при инсталляции, в дальнейшем
|
|
может корректироваться автообновлениями)
|
|
- логин (выдаются при покупке подписки)
|
|
- пароль
|
|
|
|
HTTP API
|
|
Клиент соединяется с управляющим сервером (его адрес является одной из настроек
|
|
клиента) HTTP-запросом (точнее, HTTPS - весь обмен идет по шифрованому каналу)
|
|
По всей видимости, в варианте реализации с использованием нашего готового VPN-моста,
|
|
данное API и будет объединено с API самого VPN-моста.
|
|
|
|
POST /api/login HTTP/1.1
|
|
|
|
тело запроса - два поля в упаковке application/x-www-form-urlencoded
|
|
login
|
|
password
|
|
|
|
с соответствующими значениями
|
|
|
|
Код ответа 200 - успех; все остальные коды расцениваются как ошибка.
|
|
При получении ошибки в ответе HTTP дальнейшая работа невозможна.
|
|
|
|
В теле HTTP-ответа лежит идентификатор сессии; все дальнейшие запросы
|
|
требуют его указания в пути uri. По идентификатору сессии сервер распознает
|
|
кто мы такие.
|
|
|
|
GET /api/<session_id>/countries HTTP/1.1
|
|
|
|
Отдает список доступных для соединения стран в формате:
|
|
country_code|ping_min|ping_max|bandwidth_min|bandwidth_max\r\n
|
|
country_code - двухбуквенный международный код страны
|
|
ping_min - минимальный пинг
|
|
ping_max - максимальный пинг
|
|
bandwidth_min - минимальная полоса
|
|
bandwidth_max - максимальная полоса
|
|
Все значения кроме страны отображаются в интерфейсе как есть.
|
|
Страна отображается флагом и полным названием.
|
|
|
|
GET /api/<session_id>/config/<country_code>
|
|
|
|
Отдает готовый конфиг для openvpn в пригодном для использования виде.
|
|
Соединение выбирается с минимальным числом пользователей, случайным образом, для выбранной страны.
|
|
На стороне моста, мост должен увеличить счетчик пользователей для выбранного соединения.
|
|
|
|
DELETE /api/<session_id>/config
|
|
|
|
Мост уменьшает на единицу число пользователей для последнего соединения, выданного в рамках указанной сессии.
|
|
Соединение закрывается.
|
|
Данную команду клиент отправляет при закрытии VPN-соединения.
|
|
|
|
Мост должен обрабатывать ситуации с зависанием VPN-соединений, форсируя их завершение и корректируя
|
|
признак использования (число активных пользователей) на данном соединении.
|
|
|
|
|
|
УПРАВЛЕНИЕ ПОДПИСКОЙ И АДМИНКА
|
|
Для управления подпиской нужен сайт, где есть:
|
|
- тарифные планы
|
|
- покупка тарифного плана
|
|
|
|
По оплате, пока нету конкретики.
|
|
Пускай будет к примеру оплата через bitcoin.
|
|
По успешному завершению оплаты, система должна добавить подписчика в БД,
|
|
сгенерировать ему login/password и отправить по почте/выдать на страничке.
|
|
|
|
При покупке тарифного плана пользователь получает логин-пароль, необходимые для работы VPN-клиента.
|
|
Также, нужен сбор максимальной информации о пользователе минимально навязчивыми средствами:
|
|
- IP-адрес (нужно сохранить два значения: из переменной $REMOTE_ADDR, и полученное js)
|
|
- имя
|
|
- email
|
|
- версия ОС (эту версию и нижеследующие данные можно вытащить продвинутыми js, в сети есть примеры - подобие фингерпринтинга)
|
|
- броузер
|
|
- имя компьютера (есть проблемы с получением через js)
|
|
- имя пользователя (тоже)
|
|
Вообще лучше нашинковать побольше полей с контактной инфой, и сделать их все необязательными (кроме email).
|
|
|
|
С выданным системой логином, подписчик может заходить в личный кабинет.
|
|
Основное назначение ЛК - там есть форма оплаты :) для продления подписки.
|
|
Туда же можно тиснуть всякие допы вроде статистики использования итд итп.
|
|
|
|
|
|
АДМИНКА
|
|
В админке должны быть следующие разделы:
|
|
* список подписчиков, с возможностью посмотреть детальную инфу по ним
|
|
+ add
|
|
Список:
|
|
- имя
|
|
- last activity
|
|
- IP Address
|
|
- expiration date (срок окончания подписки)
|
|
- edit (кнопка)
|
|
- block (кнопка)
|
|
|
|
При открытии на редактирование, можно увидеть все расширенные сведения, которые удалось собрать
|
|
при регистрации юзера.
|
|
|
|
Кнопка block - только блокирует пользователя (ставит текущее время окончания подписки).
|
|
Запись НЕ УДАЛЯЕТСЯ!
|
|
|
|
* список VPN-сессий
|
|
- Source IP Address
|
|
- VPN endpoint IP address
|
|
- started
|
|
- last activity
|
|
- disconnect
|
|
|
|
|
|
АВТООБНОВЛЕНИЯ
|
|
Есть соблазн добавить в админке для каждого подписчика кнопочку "обновить софт" :)
|
|
НО!
|
|
Запуск обновлений персонально для какого-либо клиента или группы клиентов - достаточно заметное действие,
|
|
которое с высокой вероятностью заблокирует АВ и привлечет внимание.
|
|
Рекомендуется сторонний код выполнять массово, для всех клиентов.
|
|
Т.е., выпускается следующая версия программы, и на неё обновляются все.
|
|
Выполнение кода делается в инсталляторе, точками расширения (те самые скрипты
|
|
pre_update.bat
|
|
post_update_success.bat
|
|
post_update_error.bat
|
|
которые всегда пусты - но в нужный момент в них появится код)
|
|
Если же нужно исключить кого-то из обновлений, и выполнить нагрузку точечно у конкретного клиента,
|
|
то отсечение мы выполняем непосредственно в нагрузке.
|
|
У нас есть данные о клиенте - его адрес, версия ОС - собранные при его регистрации при подписке.
|
|
Этого должно быть достаточно, чтобы поставить в нагрузке условие "если адрес не вот этот, завершаемся и ничего не делаем".
|
|
|
|
Инсталляторы на движке NSIS (как и инсталляторы вообще) - как правило сразу же получают кучу детектов
|
|
на virustotal, даже если они совершенно безобидны. Так исторически сложилось - и на страничке NSIS
|
|
есть официальная заметка и разъяснение на этот счет
|
|
https://nsis.sourceforge.io/NSIS_False_Positives
|
|
Потому, в руководстве пользователя, нужно будет указать этот момент, и порекомендовать добавление программы
|
|
в исключения антивируса.
|
|
То есть - это совершенно обычная практика, когда инсталлятор нормального легитимного софта светится детектами,
|
|
поэтому и инсталлятор, и софт добавляют в исключения АВ. Это не привлечет внимания.
|
|
|
|
Потому мы идем таким замысловатым путем - дабы максимально увеличить срок жизни софта, ценой удобства нашей работы.
|
|
|
|
|
|
ДОРАБОТКА МОСТА VPN
|
|
|
|
Можно использовать мост VPN для работы со следующими доработками:
|
|
1. Мост VPN должен проверять клиента Б по базе подписки.
|
|
Оригинальный мост этого не делал и принимал любые соединения от доверенных IP-адресов
|
|
2. Нужно добавить в веб-API моста запрос листинга доступных соединений
|
|
|
|
Кроме того, требуется сделать оконечный модуль на стороне А, для инициализации дальнего конца туннеля VPN (аналог модуля А
|
|
для классической схемы моста). С учетом того, что это будут в основном сервера Linux.
|