
radmin-vpn-linux v1.0.0
Запуск Radmin VPN на Linux через Wine — собственный драйвер, TAP-мост, нулевая потеря пакетов
Radmin VPN для Linux
Запускайте Radmin VPN в Linux через Wine. Входите в VPN-сети, видьте пиров, играйте в игры — всё без виртуальной машины с Windows.
Я создал это не потому, что это проще, чем виртуальная машина. Я создал это, потому что посчитал, что это проще, чем виртуальная машина.
Код, написанный при помощи ИИ. Создан совместно человеком и Claude (Anthropic). Драйвер, хуки и мост написаны с массовым использованием ИИ для реверс-инжиниринга недокументированного протокола драйвера Radmin VPN через Ghidra. Это работает, но без каких-либо гарантий. Не аффилирован с Famatech. Radmin VPN — проприетарное ПО: скачайте его самостоятельно с radmin-vpn.com. Используйте на свой страх и риск.
Как это работает
Служба Windows Radmin VPN общается с NDIS-драйвером miniport своего виртуального сетевого адаптера. Wine не поддерживает NDIS, поэтому мы заменяем драйвер собственной реализацией, которая мостит к Linux-устройству TAP. Hook-DLL решает проблемы совместимости с Wine (именование адаптера, права на реестр). В итоге получается полностью функциональный клиент Radmin VPN, работающий нативно под Wine.
Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe
Быстрый старт (AppImage, рекомендуется)
Забирайте RadminVPN-Linux-x86_64.AppImage из последнего релиза. Ничего устанавливать не нужно — Wine уже в комплекте.
Кандидаты в релизы (например,
v1.0.0-rc1) публикуются как GitHub pre-release. Ссылкаlatestвыше всегда указывает на самую свежую стабильную сборку, поэтому pre-release там не появятся — берите их из полного списка релизов.
chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage
При первом запуске он запросит установщик Radmin VPN (сначала скачайте Radmin_VPN_*.exe с radmin-vpn.com). Откроется терминал с прогрессом, и понадобится один запрос пароля sudo для настройки TAP.
Постоянное состояние (wineprefix, MAC, логи) хранится в ~/.local/share/radmin-vpn-linux/.
Предварительные требования (сборка из исходников / не-AppImage)
- Wine >= 11.0 (проверено на Wine 11.5 в Arch Linux и на Wine 11.6 в Ubuntu 24.04)
- mingw-w64 кросс-компиляторы (
i686-w64-mingw32-gcc,x86_64-w64-mingw32-gcc) — для сборки из исходников - iconv (glibc) — для разбора логов службы
- доступ sudo — для создания устройства TAP и маршрутизации
- поддержка TUN/TAP в ядре — обычно встроена, проверьте командой
modprobe tun - установщик Radmin VPN — скачайте с radmin-vpn.com. Должен быть сборкой 2.0.x (разрабатывалось под 2.0.4899.9). Radmin VPN 1.4 не поддерживается — он регистрирует и открывает адаптер, но так и не завершает подключение под Wine-прослойкой, оставляя GUI зависшим на «Connecting...».
Arch Linux
sudo pacman -S wine mingw-w64-gcc
Ubuntu/Debian
sudo apt install wine64 wine32 gcc-mingw-w64
Быстрый старт из исходников
git clone https://github.com/baptisterajaut/radmin-vpn-linux.git
cd radmin-vpn-linux
# Option A: download pre-built binaries from GitHub Releases
mkdir -p build
TAG=$(curl -sI https://github.com/baptisterajaut/radmin-vpn-linux/releases/latest | grep -i location | grep -oP 'v[\d.]+')
curl -sL "https://github.com/baptisterajaut/radmin-vpn-linux/releases/download/${TAG}/radmin-vpn-linux-${TAG}.tar.gz" \
| tar xz -C build/
# Option B: build from source
make
# Download Radmin VPN installer from https://www.radmin-vpn.com/
./run.sh --installer ~/Downloads/Radmin_VPN_*.exe
При последующих запусках просто:
./run.sh
Флаги командной строки
| Флаг | Описание |
|---|---|
--installer <path> | Путь к установщику Radmin_VPN_*.exe (только при первом запуске). |
--no-ui | Запускает службу без запуска GUI Radmin. |
--no-broadcast-routes | Не добавляет маршруты broadcast/multicast → TAP. |
--filter-ui | Запускает опциональный GTK4-интерфейс фильтра пакетов (по умолчанию выключен). |
--fix-chat | Патчит qwindows.dll из Qt для исправления падения окна чата под Wine (по умолчанию выключено). |
Оба параметра --filter-ui и --fix-chat подключаются явно. Для интерфейса фильтра нужен бинарник rvpn_filter_ui (собирается командой make); для исправления чата нужны patch_qwindows_font.py и интерпретатор Python 3.
Headless / серверные режимы
Два дополнительных лаунчера запускают Radmin VPN без локального рабочего стола — для VPS или сервера в дата-центре. Оба устанавливаются и настраиваются точно так же, как run.sh (тот же wineprefix, тот же сценарий первого запуска с --installer, тот же TAP-мост); отличаются только тем, как добраться до GUI.
run_datacenter.sh — GUI через браузер
Запускает настоящий GUI Radmin на виртуальном дисплее (Xvfb) и отдаёт его через VNC + noVNC, так что вы можете настроить свои сети из браузера и оставить его работать дальше.
sudo apt install -y xvfb x11vnc websockify novnc # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
| Флаг | По умолчанию | Описание |
|---|---|---|
--vnc-port <n> | 5900 | Порт для сервера x11vnc. |
--web-port <n> | 6080 | Порт для веб-эндпоинта noVNC. |
--vnc-password <pw> | *(none)* | Пароль для VNC / веб-сессии. |
--web-bind <addr> | 127.0.0.1 | Адрес, на котором слушает noVNC. |
По умолчанию noVNC слушает на 127.0.0.1, поэтому до него можно добраться только через SSH-туннель:
ssh -L 6080:localhost:6080 your-vps # then open http://localhost:6080/vnc.html
Чтобы открыть публичный доступ, передайте --web-bind 0.0.0.0 вместе с --vnc-password — иначе любой, кто доберётся до веб-порта, получит рабочий стол без аутентификации и с root-правами. Скрипт выводит громкое предупреждение, если вы открываете публичный доступ без пароля.
run_vps.sh — только служба, фиксированный GUID
Запускает службу в headless-режиме с захардкоженным TAP GUID (Wine WMI не требуется) и вообще без GUI. Если на каталог выше присутствует кастомный перечислитель сетей (rv_net_enum.exe, в этот репозиторий не входит), он запускается; иначе служба просто работает, пока вы не нажмёте Ctrl+C. Принимается только --installer.
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
Сборка из исходников
Требуются кросс-компиляторы mingw-w64. Готовые бинарники доступны в Releases (собираются CI для каждой версии с тегом), если вы не хотите устанавливать mingw.
make # build everything to build/
make clean # remove build artifacts
Результат:
build/rvpnnetmp.sys— драйвер ядра Wine (64-битный PE)build/adapter_hook.dll— Hook DLL (32-битный PE)build/rvpn_launcher.exe— инжектор DLL (32-битный PE)build/netsh.exe— замена netsh (32-битный PE, устанавливается в SysWOW64)build/netsh64.exe— замена netsh (64-битный PE, устанавливается в System32)build/drvinst.exe— заглушка-пустышка, заменяющая настоящий установщик NDIS-драйвера Radmin (issue #12)build/tap_bridge— нативный Linux TAP-мостbuild/rvpn_dnsfix.so— нативная прослойка LD_PRELOAD, подгружается только в службуbuild/rvpn_filter_ui— опциональный GTK4-интерфейс фильтра пакетов (--filter-ui)
Сборка AppImage
make
./packaging/build-appimage.sh # → packaging/dist/RadminVPN-Linux-x86_64.AppImage
При первом запуске скачивает сборку Kron4ek Wine-Staging amd64-wow64 (~100 МБ) и appimagetool, кэширует обе в packaging/dist/. Требуются curl и ImageMagick (convert).
Что делает run.sh
- Первый запуск: устанавливает Radmin VPN через Wine (
/VERYSILENT), удаляет настоящий NDIS-драйвер (несовместим с Wine), регистрирует наш собственный драйвер - Каждый запуск: создаёт устройство TAP, запускает мост TAP-FIFO, настраивает реестр Wine (GUID адаптера, служба драйвера), запускает службу и GUI Radmin VPN
- При выходе (Ctrl+C или закрытие GUI): убивает Wine, удаляет устройство TAP, подчищает за собой
Wineprefix хранится в ./wineprefix/ (запуск из исходников) или ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage). Постоянный MAC-адрес генерируется при первом запуске и сохраняется в wineprefix.
Архитектура
| Компонент | Описание |
|---|---|
rvpnnetmp.sys | Драйвер ядра Wine. Эмулирует NDIS-минипорт Radmin. Обрабатывает IOCTL (VERSION, STATUS, SETUP, PEERMAC), кодирование/декодирование TLV-кадров, очередь IRP для перекрывающегося (overlapped) ввода-вывода, маршрутизацию кадров на основе MAC для поддержки нескольких пиров. |
adapter_hook.dll | Сопутствующая DLL, загружаемая вместе с RvControlSvc.exe. IAT-хуки: переименовывает TAP-адаптер в ожидаемое Radmin имя, превращает RegSetKeySecurity в no-op для обхода бага SCM в Wine, из-за которого службам не хватает SID SYSTEM. |
tap_bridge | Нативный Linux-бинарник. Передаёт ethernet-кадры между устройством TAP и именованными каналами (FIFO), которые читает/пишет драйвер Wine. |
netsh.exe / netsh64.exe | Заменяют заглушку netsh в Wine (32-битную в SysWOW64, 64-битную в System32). Переводят команды Windows netsh interface ip в команды Linux ip addr/ip link через файловый ретранслятор, проверяя адрес до того, как он попадёт в root-ретранслятор. |
rvpn_launcher.exe | Внедряет adapter_hook.dll в процесс службы Radmin через CreateRemoteThread + LoadLibrary. |
drvinst.exe | Заглушка-пустышка, заменяющая настоящий установщик NDIS-драйвера Radmin. Radmin запускает его в рантайме для загрузки NetMP60_1_1_64.sys, который роняет Wine 11.x через NdisInitializeReadWriteLock (issue #12); поскольку наш драйвер уже заменяет этот адаптер, настоящий никогда не должен загружаться. |
rvpn_dnsfix.so | Нативная прослойка LD_PRELOAD, внедряется только в запуск службы. Замыкает обратный DNS (getnameinfo/gethostbyaddr) частных IPv4/IPv6 на уровне glibc. Radmin делает PTR-резолв каждого локального адреса-кандидата, который собирает; на хосте, чей резолвер глотает RFC1918 PTR-запросы как «чёрная дыра», это зависает на минуты, и служба регистрируется, но так и не становится готовой (issue #16). Запрос выполняется на Unix-стороне Wine и недоступен никаким хукам внутри adapter_hook.dll. |
rvpn_filter_ui | Опциональный GTK4-интерфейс для просмотра и фильтрации пакетов, проходящих через мост. По умолчанию выключен; запускается с --filter-ui. |
Устранение неполадок
GUI завис на «Waiting for adapter»: драйвер не загружается. Проверьте, что /tmp/radmin_driver.log существует и не пуст. Если пуст — возможно, отсутствует регистрация службы драйвера: удалите wineprefix и запустите заново.
Зарегистрировался, но так и не «ready»: служба доходит до Registered as #… и останавливается. Известны две причины, обе фиксируются диагностическим блоком, выводимым по таймауту. (a) Прозрачный прокси или туннель со своей политикой маршрутизации (sing-box, clash/mihomo, v2ray…) перехватывает исходящее соединение — такие стеки отвечают на TCP-handshake локально, поэтому сокет читает ESTABLISHED, хотя ничего не ретранслируется. Исключите 26.0.0.0/8 из его маршрутов, а также *.radminte.com, если можете ходить туда напрямую. (b) Резолвер, который «чёрной дырой» глотает обратные запросы частных адресов (обычный триггер — docker0 на 172.17.0.1). Это лечит rvpn_dnsfix.so, но это 64-битная прослойка: системный Wine, собранный как old-wow64, игнорирует её. Обходной путь — добавьте строку для адреса в /etc/hosts или используйте contrib/run-in-netns.sh (он доводит службу до «ready», но держит VPN внутри namespace: приложения хоста не могут достучаться до 26.0.0.0/8; прочтите предупреждение в его шапке).
Служба падает сразу: проверьте /tmp/radmin_service.log на ошибки Wine. Частая причина — старый wineprefix от другой версии Wine. Удалите ./wineprefix/ и запустите заново.
0% потерь пакетов с одним пиром, большие потери со многими: это и был исходный баг — исправлен маршрутизацией кадров на основе MAC в драйвере. Убедитесь, что используете последнюю сборку.
Первый пинг медленный (~1 с): последняя версия кэширует MAC-адреса для каждого IP-пакета, который видит драйвер. Если целевой IP отправил хотя бы один пакет, пока драйвер работал, MAC уже в кэше, и задержки ARP нет. Только полностью молчащие пиры (те, что ни разу не отправляли пакетов) требуют первоначального ARP-разрешения, которое добавляет ~1 секунду.
Локальные игры не видят других пиров / сломано «auto-discovery»: большинство LAN-игр находят друг друга broadcast-запросами (UDP на 255.255.255.255) или multicast (224.0.0.0/4). В Windows TAP-драйвер Radmin заявляет себя предпочтительным интерфейсом для таких потоков; в Linux ядру нужно сказать об этом явно. run.sh теперь добавляет два дополнительных маршрута при поднятии VPN:
ip route append 255.255.255.255/32 dev radminvpn0 metric 0
ip route append 224.0.0.0/4 dev radminvpn0 metric 0
Побочный эффект: mDNS / Bonjour / SSDP в вашей физической локальной сети (Chromecast, AirPrint, Sonos, smart TV, ...) будут ходить через VPN, пока он поднят. Если вам нужны параллельно и локальное обнаружение в LAN, и Radmin, запускайте с --no-broadcast-routes:
./run.sh --no-broadcast-routes
Маршруты привязаны к устройству TAP, поэтому автоматически удаляются, когда run.sh при выходе сносит устройство.
Известные ограничения
- Одновременно может работать только один экземпляр (общие FIFO в
/tmp/) - Маршрут on-link
26.0.0.0/8влияет на всю систему, пока работает (убирается при выходе) - Маршруты по умолчанию для broadcast (
255.255.255.255/32) и multicast (224.0.0.0/4) направляются в VPN — отключите с помощью--no-broadcast-routes, если нужны параллельно mDNS / SSDP в локальной сети - Более старые версии Wine (< 11.0) могут иметь другое поведение перекрывающегося (overlapped) ввода-вывода, которое ломает драйвер
Примечания
Обход бага Wine. Хук RegSetKeySecurity обходит известное ограничение Wine, из-за которого службы не получают SID SYSTEM (S-1-5-18). Возможно, это исправят в апстриме в одном из будущих релизов Wine.
Благодарности
Реверс-инжиниринг и Wine-прослойка: @baptisterajaut.
- @ayozetr — отследил зависание «регистрируется, но никогда не ready» до обратного DNS-запроса частного адреса, который резолвер хоста глотал «чёрной дырой», доказал это воспроизведением на голой libc после того, как были отброшены четыре неверные теории (включая мою), и написал оригинал
src/rvpn_dnsfix.cиcontrib/run-in-netns.sh. - @gringoestrangeiro — работа над стабильностью в Linux: фильтры пакетов, ARP-кэш, восстановление после сбоев, режимы headless и дата-центра.
- @yuxiaole-bili — обнаружил, что SCM в Wine автоматически запускает второй экземпляр службы без хуков, который конкурирует с внедрённым за адаптер.
- @D1spell-tech, @Milkiway13 и все, кто вставлял полный диагностический блок — именно два независимых хоста делают баг находимым.
Лицензия
GPL-3.0. См. LICENSE.
По духу этот код — общественное достояние: делайте с ним что хотите. GPL здесь как юридическая страховка: она явно защищает реверс-инжиниринг для интероперабельности — именно этим проект и занимается. Ремень и подтяжки.
Radmin VPN — проприетарное ПО компании Famatech Corp. Этот проект предоставляет только инструменты интероперабельности — код Famatech не включён и не распространяется.