Retour aux mises à jour
New releaseAug 8, 2026

radmin-vpn-linux v1.0.0

Exécutez Radmin VPN sur Linux via Wine — pilote personnalisé, pont TAP, zéro perte de paquets

Partager

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 lien latest ci-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

OptionDescription
--installer <path>Chemin vers le programme d'installation Radmin_VPN_*.exe (premier lancement uniquement).
--no-uiExécute le service sans lancer l'interface graphique Radmin.
--no-broadcast-routesN'ajoute pas les routes broadcast/multicast → TAP.
--filter-uiLance l'interface optionnelle de filtrage de paquets GTK4 (désactivée par défaut).
--fix-chatPatche 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
OptionDéfautDescription
--vnc-port <n>5900Port du serveur x11vnc.
--web-port <n>6080Port 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.1Adresse 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 natif
  • build/rvpn_dnsfix.so — shim LD_PRELOAD natif, préchargé uniquement dans le service
  • build/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

  1. Premier lancement : installe Radmin VPN via Wine (/VERYSILENT), supprime le véritable pilote NDIS (incompatible avec Wine), enregistre notre pilote personnalisé
  2. 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
  3. À 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

ComposantDescription
rvpnnetmp.sysPilote 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.dllDLL 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_bridgeBinaire 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.exeRemplace 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.exeInjecte adapter_hook.dll dans le processus du service Radmin via CreateRemoteThread + LoadLibrary.
drvinst.exeStub 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.soShim 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_uiInterface 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/8 affecte 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-routes si 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.c et contrib/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é.

Catégories