Torna agli aggiornamenti
New releaseAug 8, 2026

radmin-vpn-linux v1.0.0

Esegui Radmin VPN su Linux tramite Wine — driver personalizzato, bridge TAP, zero perdita di pacchetti

Condividi

Radmin VPN per Linux

Esegui Radmin VPN su Linux tramite Wine. Unisciti a reti VPN, vedi i peer, gioca — tutto senza una VM Windows.

Non l'ho creato perché fosse più facile di una VM. L'ho creato perché pensavo fosse più facile di una VM.

Codice assistito dall'IA. Sviluppato in collaborazione tra un umano e Claude (Anthropic). Il driver, le hook e il bridge sono stati scritti con un ampio reverse engineering assistito dall'IA del protocollo driver non documentato di Radmin VPN utilizzando Ghidra. Funziona, ma senza alcuna garanzia. Non affiliato a Famatech. Radmin VPN è proprietario — scaricalo tu stesso da radmin-vpn.com. Usalo a tuo rischio.

Come funziona

Il servizio Windows di Radmin VPN comunica con un driver miniport NDIS per la sua scheda di rete virtuale. Wine non supporta NDIS, quindi sostituiamo il driver con una nostra implementazione che fa da bridge verso un dispositivo TAP Linux. Una DLL hook gestisce i problemi di compatibilità con Wine (denominazione dell'adapter, permessi del registro). Il risultato è un client Radmin VPN completamente funzionale che gira nativamente sotto Wine.

Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe

Avvio rapido (AppImage, consigliato)

Scarica RadminVPN-Linux-x86_64.AppImage dall'ultima release. Niente da installare — Wine è incluso.

Le release candidate (es. v1.0.0-rc1) sono pubblicate come pre-release di GitHub. Il link latest qui sopra punta sempre alla build stabile più recente, quindi le pre-release non appariranno lì — scaricale dall'elenco completo delle release.

chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage

Al primo avvio ti chiederà l'installer di Radmin VPN (scarica prima Radmin_VPN_*.exe da radmin-vpn.com). Si apre un terminale con l'avanzamento e serve una richiesta di password sudo per la configurazione del TAP.

Lo stato persistente (wineprefix, MAC, log) si trova in ~/.local/share/radmin-vpn-linux/.

Prerequisiti (build da sorgente / non-AppImage)

  • Wine >= 11.0 (testato su Wine 11.5 Arch Linux e su Wine 11.6 Ubuntu 24.04)
  • mingw-w64 cross-compilatori (i686-w64-mingw32-gcc, x86_64-w64-mingw32-gcc) — per la compilazione dal sorgente
  • iconv (glibc) — per il parsing dei log di servizio
  • accesso sudo — per la creazione del dispositivo TAP e il routing
  • supporto TUN/TAP nel kernel — di solito integrato, verifica con modprobe tun
  • Installer di Radmin VPN — scaricalo da radmin-vpn.com. Deve essere una build 2.0.x (sviluppato contro la 2.0.4899.9). Radmin VPN 1.4 non è supportato — registra e apre l'adapter ma non finisce mai la connessione sotto lo shim Wine, lasciando la GUI bloccata su "Connecting...".

Arch Linux

sudo pacman -S wine mingw-w64-gcc

Ubuntu/Debian

sudo apt install wine64 wine32 gcc-mingw-w64

Avvio rapido dal sorgente

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

Alle esecuzioni successive, basta:

./run.sh

Flag da riga di comando

FlagDescrizione
--installer <path>Percorso dell'installer Radmin_VPN_*.exe (solo al primo avvio).
--no-uiEsegue il servizio senza avviare la GUI di Radmin.
--no-broadcast-routesNon aggiunge le route broadcast/multicast → TAP.
--filter-uiAvvia l'interfaccia GTK4 opzionale per il filtraggio dei pacchetti (disattivata di default).
--fix-chatApplica una patch a qwindows.dll di Qt per correggere il crash della finestra chat sotto Wine (disattivata di default).

Sia --filter-ui che --fix-chat sono da attivare esplicitamente. L'interfaccia di filtraggio richiede il binario rvpn_filter_ui (compilato con make); la correzione della chat richiede patch_qwindows_font.py e un interprete Python 3.

Modalità headless / server

Due launcher aggiuntivi eseguono Radmin VPN senza un desktop locale — per un VPS o un host in datacenter. Entrambi installano e configurano esattamente come run.sh (stesso wineprefix, stesso flusso di primo avvio con --installer, stesso bridge TAP); differiscono solo nel modo in cui si accede alla GUI.

run_datacenter.sh — GUI tramite browser

Esegue la vera GUI di Radmin su un display virtuale (Xvfb) e la serve tramite VNC + noVNC, così puoi configurare le tue reti da un browser e poi lasciarla in esecuzione.

sudo apt install -y xvfb x11vnc websockify novnc   # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
FlagDefaultDescrizione
--vnc-port <n>5900Porta per il server x11vnc.
--web-port <n>6080Porta per l'endpoint web noVNC.
--vnc-password <pw>(nessuna)Password per la sessione VNC / web.
--web-bind <addr>127.0.0.1Indirizzo su cui noVNC ascolta.

Di default noVNC si lega a 127.0.0.1, quindi è raggiungibile solo tramite un tunnel SSH:

ssh -L 6080:localhost:6080 your-vps    # then open http://localhost:6080/vnc.html

Per esporlo pubblicamente, passa --web-bind 0.0.0.0 insieme a --vnc-password — altrimenti chiunque raggiunga la porta web si ritrova su un desktop non autenticato con privilegi di root. Lo script stampa un avviso ben visibile se ti leghi pubblicamente senza password.

run_vps.sh — solo servizio, GUID fisso

Avvia il servizio headless con un GUID TAP hardcoded (nessuna WMI di Wine richiesta) e nessuna GUI. Se un enumeratore di rete personalizzato (rv_net_enum.exe, non incluso in questo repo) è presente nella directory superiore, viene avviato; altrimenti il servizio rimane in esecuzione finché non premi Ctrl+C. Solo --installer è accettato.

./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe

Compilazione dal sorgente

Richiede i cross-compilatori mingw-w64. I binari precompilati sono disponibili nelle Release (compilati dalla CI su ogni versione taggata) se non vuoi installare mingw.

make          # build everything to build/
make clean    # remove build artifacts

Produce:

  • build/rvpnnetmp.sys — driver kernel Wine (PE 64-bit)
  • build/adapter_hook.dll — DLL hook (PE 32-bit)
  • build/rvpn_launcher.exe — iniettore DLL (PE 32-bit)
  • build/netsh.exe — sostituto di netsh (PE 32-bit, installato in SysWOW64)
  • build/netsh64.exe — sostituto di netsh (PE 64-bit, installato in System32)
  • build/drvinst.exe — stub no-op che sostituisce il vero installer del driver NDIS di Radmin (issue #12)
  • build/tap_bridge — bridge TAP nativo Linux
  • build/rvpn_dnsfix.so — shim LD_PRELOAD nativo, precaricato solo nel servizio
  • build/rvpn_filter_ui — interfaccia GTK4 opzionale per il filtraggio dei pacchetti (--filter-ui)

Compilazione dell'AppImage

make
./packaging/build-appimage.sh       # → packaging/dist/RadminVPN-Linux-x86_64.AppImage

Scarica la build Wine-Staging amd64-wow64 di Kron4ek (~100 MB) e appimagetool al primo avvio, mettendole entrambe in cache in packaging/dist/. Richiede curl e ImageMagick (convert).

Cosa fa run.sh

  1. Primo avvio: installa Radmin VPN tramite Wine (/VERYSILENT), rimuove il vero driver NDIS (incompatibile con Wine), registra il nostro driver personalizzato
  2. Ogni avvio: crea un dispositivo TAP, avvia il bridge TAP-to-FIFO, configura il registro di Wine (GUID adapter, servizio driver), avvia il servizio e la GUI di Radmin VPN
  3. All'uscita (Ctrl+C o chiusura della GUI): termina Wine, rimuove il dispositivo TAP, pulisce

Il wineprefix si trova in ./wineprefix/ (esecuzione da sorgente) o ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage). Un indirizzo MAC persistente viene generato al primo avvio e salvato nel wineprefix.

Architettura

ComponenteDescrizione
rvpnnetmp.sysDriver kernel Wine. Emula il miniport NDIS di Radmin. Gestisce gli IOCTL (VERSION, STATUS, SETUP, PEERMAC), la codifica/decodifica dei frame TLV, la coda IRP per l'I/O sovrapposto, il routing dei frame basato su MAC per il supporto multi-peer.
adapter_hook.dllDLL di supporto caricata insieme a RvControlSvc.exe. Hook IAT: rinomina l'adapter TAP per corrispondere al nome atteso da Radmin, neutralizza RegSetKeySecurity per aggirare un bug dell'SCM di Wine in cui i servizi non ricevono il SID SYSTEM.
tap_bridgeBinario nativo Linux. Inoltra i frame ethernet tra il dispositivo TAP e le named pipe (FIFO) che il driver Wine legge/scrive.
netsh.exe / netsh64.exeSostituisce lo stub netsh di Wine (32-bit in SysWOW64, 64-bit in System32). Traduce i comandi Windows netsh interface ip in comandi Linux ip addr/ip link tramite un relay basato su file, validando l'indirizzo prima che raggiunga il relay di root.
rvpn_launcher.exeInietta adapter_hook.dll nel processo del servizio Radmin tramite CreateRemoteThread + LoadLibrary.
drvinst.exeStub no-op che sostituisce il vero installer del driver NDIS di Radmin. Radmin lo esegue a runtime per caricare NetMP60_1_1_64.sys, che fa abortire Wine 11.x tramite NdisInitializeReadWriteLock (issue #12); poiché il nostro driver sostituisce già quell'adapter, quello vero non deve mai essere caricato.
rvpn_dnsfix.soShim LD_PRELOAD nativo, iniettato solo nell'avvio del servizio. Cortocircuita il DNS inverso (getnameinfo/gethostbyaddr) di IPv4/IPv6 privati a livello glibc. Radmin risolve PTR per ogni indirizzo locale candidato che raccoglie; su un host il cui resolver inghiotte le query PTR RFC1918, questo si blocca per minuti e il servizio si registra ma non diventa mai "ready" (issue #16). La lookup viene emessa dal lato Unix di Wine, fuori dalla portata di qualsiasi hook dentro adapter_hook.dll.
rvpn_filter_uiInterfaccia GTK4 opzionale per ispezionare e filtrare i pacchetti che attraversano il bridge. Disattivata di default; avviala con --filter-ui.

Risoluzione dei problemi

GUI bloccata su "Waiting for adapter": il driver non si carica. Verifica che /tmp/radmin_driver.log esista e abbia contenuto. Se è vuoto, la registrazione del servizio driver potrebbe mancare — elimina il wineprefix e riesegui.

Registrato ma mai "ready": il servizio raggiunge Registered as #… e si ferma lì. Due cause note, entrambe segnalate dal blocco di diagnostica stampato al timeout. (a) Un proxy trasparente o tunnel con una propria policy di routing (sing-box, clash/mihomo, v2ray…) che intercetta la connessione in uscita — questi stack rispondono all'handshake TCP localmente, quindi il socket risulta ESTABLISHED mentre nulla viene inoltrato. Escludi 26.0.0.0/8 dalle sue route, e anche *.radminte.com se riesci a raggiungerli direttamente. (b) Un resolver che inghiotte le lookup inverse di indirizzi privati (un docker0 su 172.17.0.1 è il trigger abituale). rvpn_dnsfix.so gestisce questo caso, ma è uno shim a 64-bit: un Wine di sistema compilato come old-wow64 lo ignora. Workaround — aggiungi una riga per l'indirizzo in /etc/hosts, oppure usa contrib/run-in-netns.sh (che porta il servizio a "ready" ma tiene la VPN dentro un namespace: le applicazioni host non possono raggiungere 26.0.0.0/8, leggi l'avviso nella sua intestazione).

Il servizio muore immediatamente: controlla /tmp/radmin_service.log per errori di Wine. Causa comune: wineprefix vecchio di una versione di Wine diversa. Elimina ./wineprefix/ e riesegui.

0% di perdita di pacchetti con un peer, perdita elevata con molti: questo era il bug originale — risolto dal routing dei frame basato su MAC nel driver. Assicurati di usare l'ultima build.

Il primo ping è lento (~1s): l'ultima versione mette in cache gli indirizzi MAC per ogni pacchetto IP che il driver vede. Se l'IP di destinazione ha inviato almeno un pacchetto mentre il driver era in esecuzione, il MAC è già in cache e non c'è alcun ritardo ARP. Solo i peer completamente silenziosi (quelli che non hanno mai inviato un pacchetto) richiedono la risoluzione ARP iniziale, che aggiunge ~1 secondo.

I giochi in LAN non vedono gli altri peer / "auto-discovery" non funziona: la maggior parte dei giochi LAN si individuano a vicenda con sonde broadcast (UDP verso 255.255.255.255) o multicast (224.0.0.0/4). Su Windows il driver TAP di Radmin si pubblicizza come interfaccia preferita per questi flussi; su Linux devi dirlo esplicitamente al kernel. run.sh ora installa due route extra quando la VPN si attiva:

ip route append 255.255.255.255/32 dev radminvpn0 metric 0
ip route append 224.0.0.0/4        dev radminvpn0 metric 0

Effetto collaterale: mDNS / Bonjour / SSDP sulla tua LAN fisica (Chromecast, AirPrint, Sonos, smart TV, ...) passeranno attraverso la VPN mentre è attiva. Se hai bisogno della discovery in LAN locale e di Radmin in parallelo, esegui con --no-broadcast-routes:

./run.sh --no-broadcast-routes

Le route sono limitate al dispositivo TAP, quindi vengono rimosse automaticamente quando run.sh smantella il dispositivo all'uscita.

Limitazioni note

  • Può girare solo un'istanza alla volta (FIFO condivise in /tmp/)
  • La route on-link 26.0.0.0/8 influisce sull'intero sistema durante l'esecuzione (rimossa all'uscita)
  • Le route broadcast (255.255.255.255/32) e multicast (224.0.0.0/4) di default vengono indirizzate alla VPN — disabilita con --no-broadcast-routes se ti servono mDNS / SSDP in LAN locale in parallelo
  • Versioni di Wine più vecchie (< 11.0) potrebbero avere un comportamento I/O sovrapposto diverso che rompe il driver

Note

Workaround per un bug di Wine. La hook RegSetKeySecurity aggira una limitazione nota di Wine in cui i servizi non ricevono il SID SYSTEM (S-1-5-18). Potrebbe essere risolta a monte in una futura release di Wine.

Crediti

Reverse engineering e shim Wine: @baptisterajaut.

  • @ayozetr — ha ricondotto il blocco "registers but never ready" a una lookup DNS inversa di un indirizzo privato inghiottita dal resolver dell'host, l'ha dimostrato con una riproduzione bare-libc dopo che quattro teorie sbagliate erano state scartate (inclusa la mia), e ha scritto l'originale di src/rvpn_dnsfix.c e contrib/run-in-netns.sh.
  • @gringoestrangeiro — lavoro sulla stabilità Linux: filtri dei pacchetti, cache ARP, recupero dai crash, modalità headless e datacenter.
  • @yuxiaole-bili — ha scoperto che l'SCM di Wine avvia automaticamente una seconda istanza del servizio senza hook che compete con quella iniettata per l'adapter.
  • @D1spell-tech, @Milkiway13 e tutti coloro che hanno incollato un blocco di diagnostica completo — due host indipendenti sono ciò che rende trovabile un bug.

Licenza

GPL-3.0. Vedi LICENSE.

Nello spirito, questo codice è di pubblico dominio — fanne quello che vuoi. La GPL è qui come rete di sicurezza legale: protegge esplicitamente il reverse engineering per l'interoperabilità, che è ciò che questo progetto fa. Cintura e bretelle.

Radmin VPN è un software proprietario di Famatech Corp. Questo progetto fornisce solo strumenti di interoperabilità — nessun codice Famatech è incluso o distribuito.

Categorie