История из практики
Рабочая задача: развернуть VPN на MikroTik с поддержкой L2TP и PPTP, авторизация — через Radius.
В роли серверов — стандартные для нас RouterOS CCR1016-12G. Параллельно возникло требование: подобрать клиент под Windows, чтобы можно было просто передать пользователям исполняемый файл, и они могли подключиться — без инструкций, .bat-файлов и шаманства.
Ключевое условие — не палить IPSEC_KEY.
Звучит несложно. Но, как это часто бывает, при попытке найти готовое решение стало ясно: либо его нет, либо оно недостаточно гибкое.
Ну и поехали. Ситуация была, скажем так, срочной. Почему — может, расскажу позже в Telegram-канале.
Результат: написал собственный VPN-клиент.
Ну как "написал" — взял PowerShell-скрипты, обернул в GUI на Python и получил рабочее приложение.
Почему не C#?
Потому что я умею в сети, а не в Cи-шарпы.
Python — мой максимум, и этого хватило, чтобы всё заработало.
Если вы думаете: "Очередной велосипед", — возможно, этот метериал не для вас.
Но если остались — покажу, как (не без помощи AI) я сделал удобный VPN-клиент, поделюсь исходниками и покажу, как собрать .exe под себя — с иконкой, версией и без лишнего гемора.
Приложение работает на Windows 10+ и выполняет следующее:
создаёт L2TP или PPTP-подключение средствами Windows;
добавляет маршруты (192.168.0.0/16, 10.0.0.0/8);
включает Split Tunneling — интернет остаётся через локального провайдера.
Ключевое: весь трафик не уходит в туннель а только трафик до серых сетей.
Плюс — Telegram-уведомления о подключениях: IP, гео, ОС, AS.
Не столько ради мониторинга, сколько для дебага и отладки.
Полный код и инструкции доступны:
Загрузка конфигурации
if getattr(sys, 'frozen', False):
config_path = os.path.join(sys._MEIPASS, 'config.json')
else:
config_path = 'config.json'
with open(config_path, 'r') as f:
config = json.load(f)
Для сборки приложения через pyinstaller, путь к файлам будет отличаться. Это условие — чтобы искать config.json в нужном месте в обоих случаях.
По простому можно запустить код через PyCharm и протестировать что все работает перед сборкой приложения (PyCharm запускать тоже от администратора).

Переменные и константы
TELEGRAM_TOKEN = config['TELEGRAM_TOKEN']
...
SERVERS = {
"111.111.111.111": {"name": "SERVER1", "gateway": "10.22.22.1"},
...
}
Все данные — в конфиге. Здесь мы храним Telegram-данные, IP-серверов и их шлюзы.
Проверка прав администратора
def is_admin():
return ctypes.windll.shell32.IsUserAnAdmin() != 0
VPN-команды требуют прав администратора. Если их нет — приложение сразу завершится.
Интерфейс на ttkbootstrap
root = ttk.Window(themename="darkly")
app = VPNManagerApp(root)
self.login_entry = ttk.Entry(root, bootstyle="info")
Используем ttkbootstrap — он делает обычный tkinter более симпатичным. Тема "darkly" даёт тёмный вид.
Добавляем поля ввода логина/пароля, выбор сервера, кнопки подключения и отключения.
Работа с VPN
subprocess.call("rasdial /disconnect", shell=True)
command = f"rasdial \"{interface_name}\" {login} {password}"
Используем rasdial и Add-VpnConnection через PowerShell для создания, подключения и удаления VPN-соединений.
После подключения добавляются маршруты через route add.
Telegram-уведомления
await bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message, parse_mode="Markdown")
После подключения отправляется информация в Telegram: IP, страна, ОС, логин.
Логирование и безопасность
if hide_sensitive:
message = message.replace(IPSEC_KEY, "[HIDDEN]")
Чтобы лог не слил пароль или PSK — замещаем конфиденциальные данные.
Что в итоге
Это приложение:
создаёт VPN соединение (L2TP/PPTP)
подключает его через rasdial
добавляет маршруты
логирует каждый шаг
отправляет информацию о подключении в Telegram
показывает красивый GUI на Python
? Сборка VPN-клиента в .exe: от иконки до метаданных
После того как мы написали рабочий VPN GUI-клиент, пора собрать его в .exe, чтобы можно было запускать на любом Windows-компьютере без Python и консоли.
Разберем по шагам, как именно я это делал.
version.txt — метаинформация
StringStruct('FileDescription', 'VPN-клиент для Windows с GUI и Telegram-уведомлениями')
...
StringStruct('CompanyName', 'netscripor')
Файл version.txt
задаёт, что будет отображаться в свойствах .exe
:
имя продукта;
автор;
версия;
описание;
иконка и прочее. Полный пример — в репозитории.
Команда сборки с PyInstaller
pyinstaller --onefile --noconsole --uac-admin --icon=vpn.ico --version-file=version.txt --add-data "pp.png;." --add-data "vpn.ico;." --add-data "config.json:." "main.py"
Разберем, что делает каждая часть:
Аргумент |
Назначение |
---|---|
--onefile |
Всё в одном .exe без папки dist |
--noconsole |
Не открывать черное окно консоли при запуске |
--uac-admin |
Требовать права администратора при запуске |
--icon=vpn.ico |
Иконка приложения |
--version-file=version.txt |
Метаданные для свойства файла |
--add-data "pp.png;." |
Картинка логотипа в GUI |
--add-data "vpn.ico;." |
Иконка в окне программы |
--add-data "config.json;." |
Конфиг-файл (внимание: подставляется тестовая версия!) |
Главный исполняемый файл |
После выполнения команды в каталоге dist/ появится main.exe, готовый к запуску. Он будет:
выглядеть как полноценное Windows-приложение (с иконкой и описанием),
требовать админ-доступ при запуске,
не показывать консоль,
работать независимо от наличия Python на ПК.

? Заключение
Да, это не Enterprise-решение.
Но оно решает конкретную задачу: простой, автономный, настраиваемый VPN-клиент под Windows с поддержкой Split Tunneling и Telegram-логированием. И главное — его можно дорабатывать под себя.
Если статья была полезной — звёздочку на GitHub и подписку в Telegram я восприму с благодарностью.
Комментарии (11)
c46fd3da
17.07.2025 10:44Пока WG нормально работал, ГОДАМИ пользовались https://tunsafe.com
Да и сейчас можно пользоваться если UDP2RAW прикрутить.
IMHO изобретать велосипед на технологиях двадцатилетней давности, как в статье, могут только люди с избытком свободного времени. =)
Litlmidl Автор
17.07.2025 10:44Спасибо за мнение! Тут ключевой момент — это была задача в корпоративной среде, где уже настроен MikroTik + RADIUS + L2TP/PPTP, и задача стояла именно “не менять сервер, а сделать клиент с GUI”.
pr0l
17.07.2025 10:44если уж хотелось заморочиться то возможно и свой костыль создать. Но майкрософт давно это сделало - CMAK. Собирал его в свое время, работал отлично
а уж если хочется что-то спрятать, так сделай sstp. PPtP и l2tp иногда не пробивается через дешевые провайдерские роутеры. либо через время тупят
amiton
17.07.2025 10:44Полностью поддерживаю. Через cmak прекрасно создаётся инсталлятор с прописанными маршрутами. Для удаленных пользователей обычно лучше sstp с сертификатами, он почти всегда и везде работает. Если нужно добавление сертификата, то делается скрипт с авто добавлением. Все это пакуется например винраром с созданием sfx архива с автоматическим запуском скрипта и инсталлятора. И всё.
podguzovvasily
Блокнуты давно протоколы эти, но интересно
Litlmidl Автор
Так это для корпоративного использования.
Подаете данные в минцифры и никто вас трогать не будет.
Acckey20
PPTP для корп использования? Рассмешили
Litlmidl Автор
Такие реалии
lantonov
IPsec внутри России работает без проблем так как уних фитруютя только диапазоны которые не принадлежат России