
radmin-vpn-linux v1.0.0
Exécutez Radmin VPN sur Linux via Wine — pilote personnalisé, pont TAP, zéro perte de paquets
Radmin VPN pour Linux
Faites tourner Radmin VPN sur Linux via Wine. Rejoignez des réseaux VPN, voyez les pairs, jouez à des jeux — le tout sans machine virtuelle Windows.
Je ne l'ai pas construit parce que c'était plus facile qu'une VM. Je l'ai construit parce que je pensais que c'était plus facile qu'une VM.
Code assisté par IA. Développé en collaboration entre un humain et Claude (Anthropic). Le pilote, les hooks et le pont ont été écrits avec un important travail de rétro-ingénierie assistée par IA du protocole non documenté du pilote Radmin VPN, en utilisant Ghidra. Ça fonctionne, mais sans aucune garantie. Ce projet n'est pas affilié à Famatech. Radmin VPN est un logiciel propriétaire — téléchargez-le vous-même depuis radmin-vpn.com. À utiliser à vos propres risques.
Comment ça fonctionne
Le service Windows de Radmin VPN communique avec un pilote miniport NDIS pour son adaptateur réseau virtuel. Wine ne prend pas en charge NDIS, nous remplaçons donc le pilote par notre propre implémentation qui fait le pont vers un périphérique TAP Linux. Une DLL de hook gère les problèmes de compatibilité Wine (nommage de l'adaptateur, permissions du registre). Le résultat est un client Radmin VPN entièrement fonctionnel qui tourne nativement sous Wine.
Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe
Démarrage rapide (AppImage, recommandé)
Récupérez RadminVPN-Linux-x86_64.AppImage depuis la dernière version. Rien à installer — Wine est inclus.
Les release candidates (ex.
v1.0.0-rc1) sont publiés en tant que pré-versions GitHub. Le lienlatestci-dessus pointe toujours vers la version stable la plus récente, donc les pré-versions n'y apparaîtront pas — récupérez-les depuis la liste complète des versions.
chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage
Au premier lancement, il demandera le programme d'installation de Radmin VPN (téléchargez d'abord Radmin_VPN_*.exe depuis radmin-vpn.com). Un terminal s'ouvre avec la progression, et une demande de mot de passe sudo est nécessaire pour la configuration du TAP.
L'état persistant (wineprefix, MAC, journaux) se trouve dans ~/.local/share/radmin-vpn-linux/.
Prérequis (compilation depuis les sources / hors AppImage)
- Wine >= 11.0 (testé sur Wine 11.5 Arch Linux et Wine 11.6 Ubuntu 24.04)
- Compilateurs croisés mingw-w64 (
i686-w64-mingw32-gcc,x86_64-w64-mingw32-gcc) — pour la compilation depuis les sources - iconv (glibc) — pour l'analyse des journaux du service
- Accès sudo — pour la création du périphérique TAP et le routage
- Prise en charge TUN/TAP par le noyau — généralement intégrée, vérifiez avec
modprobe tun - Programme d'installation de Radmin VPN — téléchargez-le depuis radmin-vpn.com. Doit être une version 2.0.x (développé avec la 2.0.4899.9). Radmin VPN 1.4 n'est pas pris en charge — il enregistre et ouvre l'adaptateur mais ne termine jamais la connexion sous le shim Wine, laissant l'interface bloquée sur « Connecting... ».
Arch Linux
sudo pacman -S wine mingw-w64-gcc
Ubuntu/Debian
sudo apt install wine64 wine32 gcc-mingw-w64
Démarrage rapide depuis les sources
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
Lors des lancements suivants, il suffit de :
./run.sh
Options de la ligne de commande
| Option | Description |
|---|---|
--installer <path> | Chemin vers le programme d'installation Radmin_VPN_*.exe (premier lancement uniquement). |
--no-ui | Exécute le service sans lancer l'interface graphique Radmin. |
--no-broadcast-routes | N'ajoute pas les routes broadcast/multicast → TAP. |
--filter-ui | Lance l'interface optionnelle de filtrage de paquets GTK4 (désactivée par défaut). |
--fix-chat | Patche qwindows.dll de Qt pour corriger le crash de la fenêtre de discussion sous Wine (désactivé par défaut). |
--filter-ui et --fix-chat sont tous deux facultatifs. L'interface de filtrage nécessite le binaire rvpn_filter_ui
(construit par make) ; le correctif de discussion nécessite patch_qwindows_font.py et un interpréteur Python 3.
Modes sans interface / serveur
Deux lanceurs supplémentaires exécutent Radmin VPN sans bureau local — pour un VPS ou un hôte de datacenter. Les deux s'installent et se configurent exactement comme run.sh (même wineprefix, même flux de premier lancement --installer, même pont TAP) ; ils ne diffèrent que par la façon d'accéder à l'interface graphique.
run_datacenter.sh — interface graphique via le navigateur
Exécute la véritable interface graphique Radmin sur un affichage virtuel (Xvfb) et la diffuse via VNC + noVNC, afin que vous puissiez configurer vos réseaux depuis un navigateur puis la laisser tourner.
sudo apt install -y xvfb x11vnc websockify novnc # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
| Option | Défaut | Description |
|---|---|---|
--vnc-port <n> | 5900 | Port du serveur x11vnc. |
--web-port <n> | 6080 | Port du point d'accès web noVNC. |
--vnc-password <pw> | (aucun) | Mot de passe pour la session VNC / web. |
--web-bind <addr> | 127.0.0.1 | Adresse sur laquelle noVNC écoute. |
Par défaut, noVNC se lie à 127.0.0.1, il n'est donc accessible que via un tunnel SSH :
ssh -L 6080:localhost:6080 your-vps # then open http://localhost:6080/vnc.html
Pour l'exposer publiquement, passez --web-bind 0.0.0.0 avec --vnc-password — sinon, quiconque atteint le port web arrive sur un bureau non authentifié avec les droits root. Le script affiche un avertissement bien visible si vous vous liez publiquement sans mot de passe.
run_vps.sh — service uniquement, GUID fixe
Démarre le service sans interface avec un GUID TAP codé en dur (aucun WMI Wine requis) et sans aucune interface graphique. Si un énumérateur de réseau personnalisé (rv_net_enum.exe, non fourni dans ce dépôt) est présent dans le répertoire parent, il est lancé ; sinon, le service s'exécute simplement jusqu'à ce que vous fassiez Ctrl+C. Seule l'option --installer est acceptée.
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
Compilation depuis les sources
Nécessite les compilateurs croisés mingw-w64. Des binaires pré-compilés sont disponibles depuis Releases (construits par le CI à chaque version taguée) si vous ne voulez pas installer mingw.
make # build everything to build/
make clean # remove build artifacts
Produit :
build/rvpnnetmp.sys— pilote noyau Wine (PE 64 bits)build/adapter_hook.dll— DLL de hook (PE 32 bits)build/rvpn_launcher.exe— injecteur de DLL (PE 32 bits)build/netsh.exe— remplacement de netsh (PE 32 bits, installé dans SysWOW64)build/netsh64.exe— remplacement de netsh (PE 64 bits, installé dans System32)build/drvinst.exe— stub no-op remplaçant le véritable installateur de pilote NDIS de Radmin (issue #12)build/tap_bridge— pont TAP Linux natifbuild/rvpn_dnsfix.so— shim LD_PRELOAD natif, préchargé uniquement dans le servicebuild/rvpn_filter_ui— interface optionnelle de filtrage de paquets GTK4 (--filter-ui)
Construction de l'AppImage
make
./packaging/build-appimage.sh # → packaging/dist/RadminVPN-Linux-x86_64.AppImage
Télécharge la compilation Kron4ek Wine-Staging amd64-wow64 (~100 Mo) et appimagetool au premier lancement, et les met en cache dans packaging/dist/. Nécessite curl et ImageMagick (convert).
Ce que fait run.sh
- Premier lancement : installe Radmin VPN via Wine (
/VERYSILENT), supprime le véritable pilote NDIS (incompatible avec Wine), enregistre notre pilote personnalisé - Chaque lancement : crée un périphérique TAP, démarre le pont TAP-vers-FIFO, configure le registre Wine (GUID de l'adaptateur, service du pilote), lance le service et l'interface graphique Radmin VPN
- À la sortie (Ctrl+C ou fermeture de l'interface graphique) : tue Wine, supprime le périphérique TAP, nettoie
Le wineprefix est stocké dans ./wineprefix/ (lancement depuis les sources) ou ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage). Une adresse MAC persistante est générée au premier lancement et enregistrée dans le wineprefix.
Architecture
| Composant | Description |
|---|---|
rvpnnetmp.sys | Pilote noyau Wine. Émule le miniport NDIS de Radmin. Gère les IOCTL (VERSION, STATUS, SETUP, PEERMAC), l'encodage/décodage des trames TLV, la file d'IRP pour les E/S chevauchées, le routage des trames basé sur l'adresse MAC pour la prise en charge multi-pairs. |
adapter_hook.dll | DLL d'accompagnement chargée avec RvControlSvc.exe. Hooks IAT : renomme l'adaptateur TAP pour correspondre au nom attendu par Radmin, neutralise RegSetKeySecurity pour contourner un bug du SCM de Wine où les services n'ont pas le SID SYSTEM. |
tap_bridge | Binaire Linux natif. Relaie les trames Ethernet entre le périphérique TAP et les tubes nommés (FIFO) que le pilote Wine lit/écrit. |
netsh.exe / netsh64.exe | Remplace le stub netsh de Wine (32 bits dans SysWOW64, 64 bits dans System32). Traduit les commandes Windows netsh interface ip en commandes Linux ip addr/ip link via un relais basé sur des fichiers, en validant l'adresse avant qu'elle n'atteigne le relais root. |
rvpn_launcher.exe | Injecte adapter_hook.dll dans le processus du service Radmin via CreateRemoteThread + LoadLibrary. |
drvinst.exe | Stub no-op remplaçant le véritable installateur de pilote NDIS de Radmin. Radmin l'exécute au moment de l'exécution pour charger NetMP60_1_1_64.sys, ce qui fait avorter Wine 11.x via NdisInitializeReadWriteLock (issue #12) ; puisque notre pilote remplace déjà cet adaptateur, le véritable ne doit jamais être chargé. |
rvpn_dnsfix.so | Shim LD_PRELOAD natif, injecté uniquement au lancement du service. Court-circuite le DNS inverse (getnameinfo/gethostbyaddr) des IPv4/IPv6 privées au niveau de la glibc. Radmin résout en PTR chaque adresse candidate locale qu'il collecte ; sur un hôte dont le résolveur bloque les requêtes PTR RFC1918, cela se fige pendant des minutes et le service s'enregistre mais ne devient jamais prêt (issue #16). La recherche est émise par le côté Unix de Wine, hors de portée de tout hook dans adapter_hook.dll. |
rvpn_filter_ui | Interface GTK4 optionnelle pour inspecter et filtrer les paquets traversant le pont. Désactivée par défaut ; lancez avec --filter-ui. |
Dépannage
Interface bloquée sur « Waiting for adapter » : le pilote ne se charge pas. Vérifiez que /tmp/radmin_driver.log existe et contient des données. S'il est vide, l'enregistrement du service du pilote manque probablement — supprimez le wineprefix et relancez.
Enregistré mais jamais « ready » : le service atteint Registered as #… et s'arrête là. Deux causes connues, toutes deux signalées par le bloc de diagnostic affiché à l'expiration du délai. (a) Un proxy transparent ou un tunnel avec sa propre politique de routage (sing-box, clash/mihomo, v2ray…) qui intercepte la connexion sortante — ces stacks répondent localement à la poignée de main TCP, donc le socket lit ESTABLISHED alors que rien n'est relayé. Excluez 26.0.0.0/8 de ses routes, ainsi que *.radminte.com si vous pouvez les atteindre directement. (b) Un résolveur qui bloque les recherches inverses d'adresses privées (un docker0 à 172.17.0.1 est le déclencheur habituel). rvpn_dnsfix.so gère ce cas, mais c'est un shim 64 bits : un Wine système compilé en old-wow64 l'ignore. Solution de contournement — ajoutez une ligne pour l'adresse dans /etc/hosts, ou utilisez contrib/run-in-netns.sh (qui amène le service à « ready » mais garde le VPN dans un espace de noms : les applications de l'hôte ne peuvent pas atteindre 26.0.0.0/8, lisez l'avertissement dans son en-tête).
Le service meurt immédiatement : vérifiez /tmp/radmin_service.log pour les erreurs Wine. Cause courante : un vieux wineprefix provenant d'une version différente de Wine. Supprimez ./wineprefix/ et relancez.
0 % de perte de paquets avec un pair, perte élevée avec plusieurs : c'était le bug d'origine — corrigé par le routage des trames basé sur l'adresse MAC dans le pilote. Assurez-vous d'utiliser la dernière version.
Le premier ping est lent (~1 s) : la dernière version met en cache les adresses MAC pour chaque paquet IP que le pilote voit. Si l'IP cible a envoyé au moins un paquet pendant que le pilote tournait, la MAC est déjà en cache et il n'y a aucun délai ARP. Seuls les pairs totalement silencieux (ceux qui n'ont jamais envoyé de paquet) nécessitent la résolution ARP initiale, ce qui ajoute ~1 seconde.
Les jeux en LAN ne voient pas les autres pairs / « auto-discovery » en panne : la plupart des jeux en LAN se découvrent mutuellement avec des sondes broadcast (UDP vers 255.255.255.255) ou multicast (224.0.0.0/4). Sous Windows, le pilote TAP de Radmin s'annonce comme l'interface préférée pour ces flux ; sous Linux, vous devez le dire explicitement au noyau. run.sh installe désormais deux routes supplémentaires lorsque le VPN se met en place :
ip route append 255.255.255.255/32 dev radminvpn0 metric 0
ip route append 224.0.0.0/4 dev radminvpn0 metric 0
Effet secondaire : le mDNS / Bonjour / SSDP sur votre LAN physique (Chromecast, AirPrint, Sonos, téléviseurs connectés, ...) passera par le VPN tant qu'il est actif. Si vous avez besoin de la découverte en LAN local et de Radmin en parallèle, lancez avec --no-broadcast-routes :
./run.sh --no-broadcast-routes
Les routes sont liées au périphérique TAP, elles sont donc automatiquement supprimées lorsque run.sh démonte le périphérique à la sortie.
Limitations connues
- Une seule instance peut tourner à la fois (FIFO partagés dans
/tmp/) - La route on-link
26.0.0.0/8affecte tout le système pendant l'exécution (nettoyée à la sortie) - Les routes broadcast (
255.255.255.255/32) et multicast (224.0.0.0/4) par défaut sont dirigées vers le VPN — désactivez-les avec--no-broadcast-routessi vous avez besoin du mDNS / SSDP du LAN local en parallèle - Les versions plus anciennes de Wine (< 11.0) peuvent avoir un comportement d'E/S chevauchées différent qui casse le pilote
Notes
Contournement d'un bug Wine. Le hook RegSetKeySecurity contourne une limitation connue de Wine selon laquelle les services ne reçoivent pas le SID SYSTEM (S-1-5-18). Cela pourra être corrigé en amont dans une future version de Wine.
Crédits
Rétro-ingénierie et shim Wine : @baptisterajaut.
- @ayozetr — a remonté le blocage « s'enregistre mais jamais prêt » jusqu'à une
recherche DNS inverse d'une adresse privée bloquée par le résolveur de l'hôte, l'a prouvé avec une
reproduction en libc nue après que quatre mauvaises théories aient été écartées (la mienne comprise),
et a écrit l'original de
src/rvpn_dnsfix.cetcontrib/run-in-netns.sh. - @gringoestrangeiro — travail sur la stabilité Linux : filtres de paquets, cache ARP, récupération après crash, modes sans interface et datacenter.
- @yuxiaole-bili — a découvert que le SCM de Wine démarre automatiquement une seconde instance du service, sans hook, qui se dispute l'adaptateur avec celle injectée.
- @D1spell-tech, @Milkiway13 et tous ceux qui ont collé un bloc de diagnostic complet — c'est d'avoir deux hôtes indépendants qui rend un bug traçable.
Licence
GPL-3.0. Voir LICENSE.
Dans l'esprit, ce code est dans le domaine public — faites-en ce que vous voulez. La GPL est là comme filet de sécurité juridique : elle protège explicitement la rétro-ingénierie pour l'interopérabilité, ce que fait ce projet. Ceinture et bretelles.
Radmin VPN est un logiciel propriétaire de Famatech Corp. Ce projet fournit uniquement des outils d'interopérabilité — aucun code Famatech n'est inclus ni distribué.