
radmin-vpn-linux v1.0.0
Esegui Radmin VPN su Linux tramite Wine — driver personalizzato, bridge TAP, zero perdita di pacchetti
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 linklatestqui 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
| Flag | Descrizione |
|---|---|
--installer <path> | Percorso dell'installer Radmin_VPN_*.exe (solo al primo avvio). |
--no-ui | Esegue il servizio senza avviare la GUI di Radmin. |
--no-broadcast-routes | Non aggiunge le route broadcast/multicast → TAP. |
--filter-ui | Avvia l'interfaccia GTK4 opzionale per il filtraggio dei pacchetti (disattivata di default). |
--fix-chat | Applica 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
| Flag | Default | Descrizione |
|---|---|---|
--vnc-port <n> | 5900 | Porta per il server x11vnc. |
--web-port <n> | 6080 | Porta per l'endpoint web noVNC. |
--vnc-password <pw> | (nessuna) | Password per la sessione VNC / web. |
--web-bind <addr> | 127.0.0.1 | Indirizzo 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 Linuxbuild/rvpn_dnsfix.so— shim LD_PRELOAD nativo, precaricato solo nel serviziobuild/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
- Primo avvio: installa Radmin VPN tramite Wine (
/VERYSILENT), rimuove il vero driver NDIS (incompatibile con Wine), registra il nostro driver personalizzato - 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
- 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
| Componente | Descrizione |
|---|---|
rvpnnetmp.sys | Driver 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.dll | DLL 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_bridge | Binario nativo Linux. Inoltra i frame ethernet tra il dispositivo TAP e le named pipe (FIFO) che il driver Wine legge/scrive. |
netsh.exe / netsh64.exe | Sostituisce 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.exe | Inietta adapter_hook.dll nel processo del servizio Radmin tramite CreateRemoteThread + LoadLibrary. |
drvinst.exe | Stub 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.so | Shim 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_ui | Interfaccia 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/8influisce 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-routesse 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.cecontrib/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.