
radmin-vpn-linux v1.0.0
Ejecuta Radmin VPN en Linux mediante Wine: controlador personalizado, puente TAP y cero pérdida de paquetes.
Radmin VPN para Linux
Ejecuta Radmin VPN en Linux mediante Wine. Únete a redes VPN, ve a tus pares, juega — todo sin una VM de Windows.
No lo construí porque fuera más fácil que una VM. Lo construí porque pensé que era más fácil que una VM.
Código asistido por IA. Construido de forma colaborativa entre un humano y Claude (Anthropic). El driver, los hooks y el bridge se escribieron con una extensa ingeniería inversa asistida por IA del protocolo no documentado del driver de Radmin VPN usando Ghidra. Esto funciona, pero no ofrece garantías. No está afiliado a Famatech. Radmin VPN es propietario — descárgalo tú mismo desde radmin-vpn.com. Úsalo bajo tu propio riesgo.
Cómo funciona
El servicio de Windows de Radmin VPN se comunica con un driver miniport NDIS para su adaptador de red virtual. Wine no soporta NDIS, así que reemplazamos el driver con nuestra propia implementación que hace de puente hacia un dispositivo TAP de Linux. Una DLL de hook gestiona los problemas de compatibilidad con Wine (nombres de adaptador, permisos de registro). El resultado es un cliente de Radmin VPN totalmente funcional ejecutándose de forma nativa bajo Wine.
Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe
Inicio rápido (AppImage, recomendado)
Descarga RadminVPN-Linux-x86_64.AppImage desde la última versión. Nada que instalar — Wine viene incluido.
Candidatos a versión (p. ej.
v1.0.0-rc1) se publican como pre-releases de GitHub. El enlacelatestde arriba siempre apunta a la compilación estable más reciente, así que los pre-releases no aparecerán allí — descárgalos desde la lista completa de versiones.
chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage
En el primer lanzamiento pedirá el instalador de Radmin VPN (descarga primero Radmin_VPN_*.exe desde radmin-vpn.com). Se abre una terminal con el progreso y se pedirá una vez la contraseña de sudo para la configuración de TAP.
El estado persistente (wineprefix, MAC, registros) se almacena en ~/.local/share/radmin-vpn-linux/.
Requisitos (compilación desde el código fuente / no AppImage)
- Wine >= 11.0 (probado en Wine 11.5 en Arch Linux y en Wine 11.6 en Ubuntu 24.04)
- Compiladores cruzados mingw-w64 (
i686-w64-mingw32-gcc,x86_64-w64-mingw32-gcc) — para compilar desde el código fuente - iconv (glibc) — para analizar los registros del servicio
- sudo — acceso para la creación del dispositivo TAP y el enrutamiento
- Soporte TUN/TAP del kernel — normalmente integrado, compruébalo con
modprobe tun - Instalador de Radmin VPN — descárgalo desde radmin-vpn.com. Debe ser una compilación 2.0.x (desarrollado contra 2.0.4899.9). Radmin VPN 1.4 no es compatible — registra y abre el adaptador pero nunca termina de conectar bajo el shim de Wine, dejando la GUI atascada en «Conectando...».
Arch Linux
sudo pacman -S wine mingw-w64-gcc
Ubuntu/Debian
sudo apt install wine64 wine32 gcc-mingw-w64
Inicio rápido desde el código fuente
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
En las ejecuciones posteriores, solo:
./run.sh
Opciones de línea de comandos
| Flag | Descripción |
|---|---|
--installer <path> | Ruta al instalador Radmin_VPN_*.exe (solo la primera ejecución). |
--no-ui | Ejecuta el servicio sin lanzar la GUI de Radmin. |
--no-broadcast-routes | No añade las rutas broadcast/multicast → TAP. |
--filter-ui | Lanza la UI opcional de filtrado de paquetes GTK4 (desactivada por defecto). |
--fix-chat | Parchea el qwindows.dll de Qt para corregir el bloqueo de la ventana de chat bajo Wine (desactivado por defecto). |
Tanto --filter-ui como --fix-chat son opcionales. La UI de filtrado necesita el binario rvpn_filter_ui (compilado por make); el arreglo del chat necesita patch_qwindows_font.py y un intérprete de Python 3.
Modos headless / de servidor
Dos lanzadores adicionales ejecutan Radmin VPN sin un escritorio local — para un VPS o un host de centro de datos. Ambos instalan y configuran exactamente igual que run.sh (mismo wineprefix, mismo flujo de primera ejecución con --installer, mismo bridge TAP); solo difieren en cómo se accede a la GUI.
run_datacenter.sh — GUI a través del navegador
Ejecuta la GUI real de Radmin en una pantalla virtual (Xvfb) y la sirve a través de VNC + noVNC, para que puedas configurar tus redes desde un navegador y luego dejarla funcionando.
sudo apt install -y xvfb x11vnc websockify novnc # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
| Flag | Valor por defecto | Descripción |
|---|---|---|
--vnc-port <n> | 5900 | Puerto del servidor x11vnc. |
--web-port <n> | 6080 | Puerto del endpoint web de noVNC. |
--vnc-password <pw> | (ninguna) | Contraseña para la sesión VNC / web. |
--web-bind <addr> | 127.0.0.1 | Dirección en la que escucha noVNC. |
Por defecto noVNC se vincula a 127.0.0.1, por lo que solo es accesible a través de un túnel SSH:
ssh -L 6080:localhost:6080 your-vps # then open http://localhost:6080/vnc.html
Para exponerla públicamente, pasa --web-bind 0.0.0.0 junto con --vnc-password — de lo contrario, cualquiera que llegue al puerto web termina en un escritorio sin autenticación y con capacidad de root. El script imprime una advertencia bien visible si te vinculas públicamente sin contraseña.
run_vps.sh — solo servicio, GUID fijo
Inicia el servicio sin interfaz con un GUID TAP fijo (no requiere Wine WMI) y sin GUI en absoluto. Si un enumerador de red personalizado (rv_net_enum.exe, no incluido en este repositorio) está presente un directorio más arriba, se lanza; de lo contrario, el servicio simplemente se ejecuta hasta que pulses Ctrl+C. Solo se acepta --installer.
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
Compilación desde el código fuente
Requiere compiladores cruzados mingw-w64. Hay binarios precompilados disponibles en Releases (compilados por CI en cada versión etiquetada) si no quieres instalar mingw.
make # build everything to build/
make clean # remove build artifacts
Genera:
build/rvpnnetmp.sys— driver de kernel de Wine (PE de 64 bits)build/adapter_hook.dll— DLL de hook (PE de 32 bits)build/rvpn_launcher.exe— inyector de DLL (PE de 32 bits)build/netsh.exe— reemplazo de netsh (PE de 32 bits, instalado en SysWOW64)build/netsh64.exe— reemplazo de netsh (PE de 64 bits, instalado en System32)build/drvinst.exe— stub no-op que reemplaza al instalador real del driver NDIS de Radmin (issue #12)build/tap_bridge— bridge TAP nativo de Linuxbuild/rvpn_dnsfix.so— shim nativo LD_PRELOAD, precargado solo en el serviciobuild/rvpn_filter_ui— UI opcional de filtrado de paquetes GTK4 (--filter-ui)
Compilación del AppImage
make
./packaging/build-appimage.sh # → packaging/dist/RadminVPN-Linux-x86_64.AppImage
Descarga la compilación Kron4ek Wine-Staging amd64-wow64 (~100 MB) y appimagetool en la primera ejecución, y guarda ambos en caché en packaging/dist/. Requiere curl e ImageMagick (convert).
Qué hace run.sh
- Primera ejecución: instala Radmin VPN mediante Wine (
/VERYSILENT), elimina el driver NDIS real (incompatible con Wine), registra nuestro driver personalizado - Cada ejecución: crea un dispositivo TAP, inicia el bridge TAP-a-FIFO, configura el registro de Wine (GUID del adaptador, servicio del driver), lanza el servicio y la GUI de Radmin VPN
- Al salir (Ctrl+C o cerrar la GUI): finaliza Wine, elimina el dispositivo TAP y limpia
El wineprefix se almacena en ./wineprefix/ (ejecución desde el código fuente) o en ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage). Se genera una dirección MAC persistente en la primera ejecución y se guarda en el wineprefix.
Arquitectura
| Componente | Descripción |
|---|---|
rvpnnetmp.sys | Driver de kernel de Wine. Emula el miniport NDIS de Radmin. Gestiona IOCTLs (VERSION, STATUS, SETUP, PEERMAC), codificación/decodificación de tramas TLV, cola de IRP para I/O superpuesta, enrutamiento de tramas basado en MAC para soporte multi-par. |
adapter_hook.dll | DLL complementaria cargada junto a RvControlSvc.exe. Hooks de IAT: renombra el adaptador TAP para que coincida con el nombre esperado por Radmin, convierte RegSetKeySecurity en no-op para sortear un bug de SCM en Wine donde los servicios no tienen el SID de SYSTEM. |
tap_bridge | Binario nativo de Linux. Retransmite tramas Ethernet entre el dispositivo TAP y las named pipes (FIFOs) que el driver de Wine lee/escribe. |
netsh.exe / netsh64.exe | Reemplaza el stub de netsh de Wine (32 bits en SysWOW64, 64 bits en System32). Traduce los comandos netsh interface ip de Windows a comandos ip addr/ip link de Linux mediante un relay basado en archivos, validando la dirección antes de que llegue al relay raíz. |
rvpn_launcher.exe | Inyecta adapter_hook.dll en el proceso del servicio de Radmin mediante CreateRemoteThread + LoadLibrary. |
drvinst.exe | Stub no-op que reemplaza al instalador real del driver NDIS de Radmin. Radmin lo ejecuta en tiempo de ejecución para cargar NetMP60_1_1_64.sys, que aborta Wine 11.x mediante NdisInitializeReadWriteLock (issue #12); dado que nuestro driver ya reemplaza ese adaptador, el real nunca debe cargarse. |
rvpn_dnsfix.so | Shim nativo LD_PRELOAD, inyectado solo en el lanzamiento del servicio. Cortocircuita el DNS inverso (getnameinfo/gethostbyaddr) de IPv4/IPv6 privadas en la capa de glibc. Radmin resuelve PTR de cada dirección candidata local que recopila; en un host cuyo resolver bloquea las consultas PTR de RFC1918, eso se detiene durante minutos y el servicio se registra pero nunca queda listo (issue #16). La consulta la emite el lado Unix de Wine, fuera del alcance de cualquier hook dentro de adapter_hook.dll. |
rvpn_filter_ui | UI GTK4 opcional para inspeccionar y filtrar los paquetes que cruzan el bridge. Desactivada por defecto; se lanza con --filter-ui. |
Solución de problemas
GUI atascada en «Esperando al adaptador»: el driver no está cargando. Comprueba que /tmp/radmin_driver.log existe y tiene contenido. Si está vacío, puede faltar el registro del servicio del driver — elimina el wineprefix y vuelve a ejecutar.
Registrado pero nunca «listo»: el servicio llega a Registered as #… y se detiene ahí. Dos causas conocidas, ambas reportadas por el bloque de diagnósticos impreso al agotarse el tiempo de espera. (a) Un proxy transparente o túnel con su propia política de enrutamiento (sing-box, clash/mihomo, v2ray…) que intercepta la conexión saliente — estas implementaciones responden al handshake TCP localmente, por lo que el socket lee ESTABLISHED mientras no se retransmite nada. Excluye 26.0.0.0/8 de sus rutas, y también *.radminte.com si puedes alcanzarlos directamente. (b) Un resolver que bloquea las búsquedas inversas de direcciones privadas (un docker0 en 172.17.0.1 es el desencadenante habitual). rvpn_dnsfix.so se encarga de esto, pero es un shim de 64 bits: un Wine de sistema compilado como old-wow64 lo ignora. Alternativa — añade una línea para la dirección en /etc/hosts, o usa contrib/run-in-netns.sh (que lleva al servicio a «listo» pero mantiene la VPN dentro de un namespace: las aplicaciones del host no pueden alcanzar 26.0.0.0/8; lee la advertencia en su cabecera).
El servicio muere inmediatamente: revisa /tmp/radmin_service.log en busca de errores de Wine. Causa común: un wineprefix antiguo de una versión distinta de Wine. Elimina ./wineprefix/ y vuelve a ejecutar.
0% de pérdida de paquetes con un par, alta pérdida con muchos: este era el bug original — corregido con el enrutamiento de tramas basado en MAC en el driver. Asegúrate de usar la compilación más reciente.
El primer ping es lento (~1 s): la última versión guarda en caché las direcciones MAC de cada paquete IP que ve el driver. Si la IP de destino ha enviado al menos un paquete mientras el driver estaba en ejecución, la MAC ya está en caché y no hay retardo de ARP. Solo los pares completamente silenciosos (los que nunca han enviado un paquete) requieren la resolución ARP inicial, que añade ~1 segundo.
Los juegos de LAN no ven a otros pares / «auto-descubrimiento» roto: la mayoría de los juegos de LAN se descubren entre sí con sondas de broadcast (UDP a 255.255.255.255) o multicast (224.0.0.0/4). En Windows, el driver TAP de Radmin se anuncia como la interfaz preferida para esos flujos; en Linux tienes que indicárselo al kernel explícitamente. run.sh ahora instala dos rutas adicionales cuando la VPN se levanta:
ip route append 255.255.255.255/32 dev radminvpn0 metric 0
ip route append 224.0.0.0/4 dev radminvpn0 metric 0
Efecto secundario: mDNS / Bonjour / SSDP en tu LAN física (Chromecast, AirPrint, Sonos, Smart TVs, ...) pasarán por la VPN mientras esté activa. Si necesitas el descubrimiento de la LAN local y Radmin en paralelo, ejecuta con --no-broadcast-routes:
./run.sh --no-broadcast-routes
Las rutas están limitadas al dispositivo TAP, por lo que se eliminan automáticamente cuando run.sh elimina el dispositivo al salir.
Limitaciones conocidas
- Solo se puede ejecutar una instancia a la vez (FIFOs compartidas en
/tmp/) - La ruta on-link
26.0.0.0/8afecta a todo el sistema mientras se ejecuta (se limpia al salir) - Las rutas de broadcast por defecto (
255.255.255.255/32) y multicast (224.0.0.0/4) se dirigen a la VPN — desactívalas con--no-broadcast-routessi necesitas mDNS / SSDP de LAN local en paralelo - Las versiones antiguas de Wine (< 11.0) pueden tener un comportamiento de I/O superpuesta distinto que rompe el driver
Notas
Solución para un bug de Wine. El hook RegSetKeySecurity sortea una limitación conocida de Wine por la que los servicios no reciben el SID de SYSTEM (S-1-5-18). Esto puede corregirse upstream en una futura versión de Wine.
Créditos
Ingeniería inversa y shim de Wine: @baptisterajaut.
- @ayozetr — rastreó el bloqueo de «se registra pero nunca queda listo» hasta una búsqueda DNS inversa de una dirección privada bloqueada por el resolver del host, lo demostró con una reproducción con libc pura tras descartar cuatro teorías erróneas (incluida la mía), y escribió el original de
src/rvpn_dnsfix.cycontrib/run-in-netns.sh. - @gringoestrangeiro — trabajo de estabilidad en Linux: filtros de paquetes, caché ARP, recuperación de caídas, modos headless y de centro de datos.
- @yuxiaole-bili — descubrió que el SCM de Wine inicia automáticamente una segunda instancia del servicio sin hooks que compite con la inyectada por el adaptador.
- @D1spell-tech, @Milkiway13 y todos los que pegaron un bloque de diagnósticos completo — dos hosts independientes es lo que hace que un bug se pueda encontrar.
Licencia
GPL-3.0. Consulta LICENSE.
En espíritu, este código es de dominio público — haz lo que quieras con él. La GPL está aquí como red de seguridad legal: protege explícitamente la ingeniería inversa para la interoperabilidad, que es lo que hace este proyecto. Cinturón y tirantes.
Radmin VPN es un software propietario de Famatech Corp. Este proyecto solo proporciona herramientas de interoperabilidad — no se incluye ni distribuye código de Famatech.