Zurück zu den Updates
New releaseAug 8, 2026

radmin-vpn-linux v1.0.0

Radmin VPN unter Linux über Wine ausführen — benutzerdefinierter Treiber, TAP-Brücke, kein Paketverlust

Teilen

Radmin VPN für Linux

Führen Sie Radmin VPN unter Linux über Wine aus. Treten Sie VPN-Netzwerken bei, sehen Sie Peers, spielen Sie Spiele — ganz ohne Windows-VM.

Ich habe das nicht gebaut, weil es einfacher als eine VM war. Ich habe es gebaut, weil ich dachte, es sei einfacher als eine VM.

KI-gestützter Code. In Zusammenarbeit zwischen einem Menschen und Claude (Anthropic) entwickelt. Treiber, Hooks und Brücke wurden mit umfangreichem KI-gestütztem Reverse Engineering des undokumentierten Treiberprotokolls von Radmin VPN unter Verwendung von Ghidra geschrieben. Das funktioniert, kommt aber ohne Garantien. Nicht mit Famatech verbunden. Radmin VPN ist proprietär — laden Sie es selbst von radmin-vpn.com herunter. Nutzung auf eigene Gefahr.

So funktioniert es

Der Windows-Dienst von Radmin VPN kommuniziert für seinen virtuellen Netzwerkadapter mit einem NDIS-Miniport-Treiber. Wine unterstützt kein NDIS, daher ersetzen wir den Treiber durch unsere eigene Implementierung, die eine Brücke zu einem Linux-TAP-Gerät herstellt. Eine Hook-DLL kümmert sich um Wine-Kompatibilitätsprobleme (Adapterbenennung, Registrierungsberechtigungen). Das Ergebnis ist ein voll funktionsfähiger Radmin-VPN-Client, der nativ unter Wine läuft.

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

Schnellstart (AppImage, empfohlen)

Holen Sie sich RadminVPN-Linux-x86_64.AppImage vom neuesten Release. Nichts zu installieren — Wine ist enthalten.

Release-Kandidaten (z. B. v1.0.0-rc1) werden als GitHub-Pre-Releases veröffentlicht. Der latest-Link oben zeigt immer auf den neuesten stabilen Build, daher erscheinen Pre-Releases dort nicht — holen Sie diese aus der vollständigen Release-Liste.

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

Beim ersten Start fragt es nach dem Radmin-VPN-Installationsprogramm (laden Sie zuerst Radmin_VPN_*.exe von radmin-vpn.com herunter). Ein Terminal öffnet sich mit Fortschrittsanzeige, und eine sudo-Passwortabfrage ist für die TAP-Einrichtung erforderlich.

Der dauerhafte Zustand (wineprefix, MAC, Logs) liegt in ~/.local/share/radmin-vpn-linux/.

Voraussetzungen (Quellcode-Build / ohne AppImage)

  • Wine >= 11.0 (getestet mit Wine 11.5 unter Arch Linux und Wine 11.6 unter Ubuntu 24.04)
  • mingw-w64-Cross-Compiler (i686-w64-mingw32-gcc, x86_64-w64-mingw32-gcc) — zum Erstellen aus dem Quellcode
  • iconv (glibc) — zum Parsen der Dienstprotokolle
  • sudo-Zugriff — zum Erstellen des TAP-Geräts und für das Routing
  • TUN/TAP-Kernelunterstützung — normalerweise integriert, prüfen mit modprobe tun
  • Radmin-VPN-Installationsprogramm — herunterladen von radmin-vpn.com. Muss ein 2.0.x-Build sein (entwickelt gegen 2.0.4899.9). Radmin VPN 1.4 wird nicht unterstützt — es registriert und öffnet den Adapter, schließt die Verbindung unter dem Wine-Shim jedoch nie ab, sodass die GUI bei „Connecting..." hängen bleibt.

Arch Linux

sudo pacman -S wine mingw-w64-gcc

Ubuntu/Debian

sudo apt install wine64 wine32 gcc-mingw-w64

Schnellstart aus dem Quellcode

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

Bei späteren Ausführungen einfach:

./run.sh

Befehlszeilenoptionen

FlagBeschreibung
--installer <path>Pfad zum Radmin_VPN_*.exe-Installationsprogramm (nur beim ersten Start).
--no-uiDienst ausführen, ohne die Radmin-GUI zu starten.
--no-broadcast-routesDie Broadcast-/Multicast-→-TAP-Routen nicht hinzufügen.
--filter-uiDie optionale GTK4-Paketfilter-UI starten (standardmäßig deaktiviert).
--fix-chatQts qwindows.dll patchen, um den Absturz des Chat-Fensters unter Wine zu beheben (standardmäßig deaktiviert).

Sowohl --filter-ui als auch --fix-chat müssen explizit aktiviert werden. Die Filter-UI benötigt die Binärdatei rvpn_filter_ui (von make erstellt); die Chat-Korrektur benötigt patch_qwindows_font.py und einen Python-3-Interpreter.

Headless- / Server-Modi

Zwei zusätzliche Starter führen Radmin VPN ohne lokale Desktop-Umgebung aus — für einen VPS- oder Rechenzentrums-Host. Beide installieren und konfigurieren genau wie run.sh (gleiches wineprefix, gleicher --installer-Ablauf beim ersten Start, gleiche TAP-Brücke); sie unterscheiden sich nur darin, wie auf die GUI zugegriffen wird.

run_datacenter.sh — GUI über den Browser

Führt die echte Radmin-GUI auf einem virtuellen Display (Xvfb) aus und stellt sie über VNC + noVNC bereit, sodass Sie Ihre Netzwerke aus einem Browser konfigurieren und dann laufen lassen können.

sudo apt install -y xvfb x11vnc websockify novnc   # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
FlagStandardBeschreibung
--vnc-port <n>5900Port für den x11vnc-Server.
--web-port <n>6080Port für den noVNC-Web-Endpunkt.
--vnc-password <pw>(keine)Passwort für die VNC-/Web-Sitzung.
--web-bind <addr>127.0.0.1Adresse, auf der noVNC lauscht.

Standardmäßig bindet noVNC an 127.0.0.1, sodass es nur über einen SSH-Tunnel erreichbar ist:

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

Für eine öffentliche Freigabe übergeben Sie --web-bind 0.0.0.0 zusammen mit --vnc-password — andernfalls landet jeder, der den Web-Port erreicht, auf einem nicht authentifizierten Desktop mit Root-Rechten. Das Skript gibt eine deutliche Warnung aus, wenn Sie öffentlich binden, ohne ein Passwort zu setzen.

run_vps.sh — nur Dienst, feste GUID

Startet den Dienst headless mit einer fest verdrahteten TAP-GUID (kein Wine-WMI erforderlich) und ganz ohne GUI. Wenn sich ein benutzerdefinierter Netzwerk-Enumerator (rv_net_enum.exe, nicht in diesem Repo enthalten) ein Verzeichnis darüber befindet, wird er gestartet; andernfalls läuft der Dienst einfach, bis Sie Strg+C drücken. Nur --installer wird akzeptiert.

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

Aus dem Quellcode erstellen

Erfordert mingw-w64-Cross-Compiler. Vorgefertigte Binärdateien sind in den Releases verfügbar (von CI für jede getaggte Version erstellt), falls Sie mingw nicht installieren möchten.

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

Erzeugt:

  • build/rvpnnetmp.sys — Wine-Kernel-Treiber (64-bit PE)
  • build/adapter_hook.dll — Hook-DLL (32-bit PE)
  • build/rvpn_launcher.exe — DLL-Injektor (32-bit PE)
  • build/netsh.exe — netsh-Ersatz (32-bit PE, installiert nach SysWOW64)
  • build/netsh64.exe — netsh-Ersatz (64-bit PE, installiert nach System32)
  • build/drvinst.exe — No-op-Stub, der Radmins echten NDIS-Treiber-Installer ersetzt (Issue #12)
  • build/tap_bridge — native Linux-TAP-Brücke
  • build/rvpn_dnsfix.so — nativer LD_PRELOAD-Shim, nur in den Dienst vorgeladen
  • build/rvpn_filter_ui — optionale GTK4-Paketfilter-UI (--filter-ui)

Das AppImage erstellen

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

Lädt beim ersten Ausführen den Kron4ek-Wine-Staging-amd64-wow64-Build (~100 MB) und appimagetool herunter und speichert beides in packaging/dist/ zwischen. Erfordert curl und ImageMagick (convert).

Was run.sh tut

  1. Erster Start: installiert Radmin VPN über Wine (/VERYSILENT), entfernt den echten NDIS-Treiber (mit Wine inkompatibel), registriert unseren benutzerdefinierten Treiber
  2. Jeder Start: erstellt ein TAP-Gerät, startet die TAP-zu-FIFO-Brücke, konfiguriert die Wine-Registrierung (Adapter-GUID, Treiberdienst), startet den Radmin-VPN-Dienst und die GUI
  3. Bei Beendigung (Strg+C oder GUI schließen): beendet Wine, entfernt das TAP-Gerät, räumt auf

Das wineprefix wird in ./wineprefix/ (Quellcode-Ausführung) oder ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage) gespeichert. Eine dauerhafte MAC-Adresse wird beim ersten Start erzeugt und im wineprefix gespeichert.

Architektur

KomponenteBeschreibung
rvpnnetmp.sysWine-Kernel-Treiber. Emuliert den Radmin-NDIS-Miniport. Verarbeitet IOCTLs (VERSION, STATUS, SETUP, PEERMAC), TLV-Frame-Enkodierung/-Dekodierung, IRP-Warteschlange für überlappende E/A, MAC-basiertes Frame-Routing für Multi-Peer-Unterstützung.
adapter_hook.dllBegleit-DLL, die zusammen mit RvControlSvc.exe geladen wird. IAT-Hooks: benennt den TAP-Adapter gemäß dem von Radmin erwarteten Namen um, setzt RegSetKeySecurity als No-op, um einen Wine-SCM-Bug zu umgehen, bei dem Diensten die SYSTEM-SID fehlt.
tap_bridgeNative Linux-Binärdatei. Leitet Ethernet-Frames zwischen dem TAP-Gerät und Named Pipes (FIFOs) weiter, die der Wine-Treiber liest/schreibt.
netsh.exe / netsh64.exeErsetzt den netsh-Stub von Wine (32-bit in SysWOW64, 64-bit in System32). Übersetzt Windows-netsh interface ip-Befehle über ein dateibasiertes Relay in die Linux-Befehle ip addr/ip link und validiert die Adresse, bevor sie das Root-Relay erreicht.
rvpn_launcher.exeInjiziert adapter_hook.dll per CreateRemoteThread + LoadLibrary in den Radmin-Dienstprozess.
drvinst.exeNo-op-Stub, der Radmins echten NDIS-Treiber-Installer ersetzt. Radmin führt ihn zur Laufzeit aus, um NetMP60_1_1_64.sys zu laden, was Wine 11.x über NdisInitializeReadWriteLock abbricht (Issue #12); da unser Treiber diesen Adapter bereits ersetzt, darf der echte nie geladen werden.
rvpn_dnsfix.soNativer LD_PRELOAD-Shim, der nur in den Dienststart injiziert wird. Umgeht Reverse-DNS-Abfragen (getnameinfo/gethostbyaddr) privater IPv4/IPv6-Adressen auf der glibc-Ebene. Radmin löst per PTR jede gesammelte lokale Kandidatenadresse auf; auf einem Host, dessen Resolver RFC1918-PTR-Abfragen verschluckt, bleibt das Minuten lang hängen und der Dienst registriert sich, wird aber nie bereit (Issue #16). Die Abfrage erfolgt auf der Unix-Seite von Wine, außerhalb der Reichweite jedes Hooks in adapter_hook.dll.
rvpn_filter_uiOptionale GTK4-UI zur Untersuchung und Filterung der Pakete, die die Brücke passieren. Standardmäßig deaktiviert; Start mit --filter-ui.

Fehlerbehebung

GUI hängt bei „Waiting for adapter": Der Treiber wird nicht geladen. Prüfen Sie, ob /tmp/radmin_driver.log existiert und Inhalt hat. Wenn leer, fehlt möglicherweise die Registrierung des Treiberdienstes — löschen Sie das wineprefix und führen Sie es erneut aus.

Registriert, aber nie „ready": Der Dienst erreicht Registered as #… und bleibt dort stehen. Zwei bekannte Ursachen, beide vom Diagnoseblock gemeldet, der bei Timeout ausgegeben wird. (a) Ein transparenter Proxy oder Tunnel mit eigener Routing-Richtlinie (sing-box, clash/mihomo, v2ray…), der die ausgehende Verbindung abfängt — solche Stacks beantworten den TCP-Handshake lokal, sodass der Socket ESTABLISHED meldet, während nichts weitergeleitet wird. Schließen Sie 26.0.0.0/8 aus seinen Routen aus, und auch *.radminte.com, wenn Sie diese direkt erreichen können. (b) Ein Resolver, der Reverse-Abfragen privater Adressen verschluckt (ein docker0 bei 172.17.0.1 ist der übliche Auslöser). rvpn_dnsfix.so behandelt dies, aber es ist ein 64-bit-Shim: Ein als old-wow64 gebautes System-Wine ignoriert ihn. Workaround dort — fügen Sie eine Zeile für die Adresse in /etc/hosts hinzu oder verwenden Sie contrib/run-in-netns.sh (das den Dienst zu „ready" bringt, aber das VPN in einem Namespace hält: Host-Anwendungen können 26.0.0.0/8 nicht erreichen, lesen Sie die Warnung am Anfang der Datei).

Dienst stirbt sofort: Prüfen Sie /tmp/radmin_service.log auf Wine-Fehler. Häufige Ursache: altes wineprefix von einer anderen Wine-Version. Löschen Sie ./wineprefix/ und führen Sie es erneut aus.

0 % Paketverlust mit einem Peer, hoher Verlust mit vielen: Das war der ursprüngliche Bug — behoben durch MAC-basiertes Frame-Routing im Treiber. Stellen Sie sicher, dass Sie den neuesten Build verwenden.

Erster Ping ist langsam (~1s): Die neueste Version zwischenspeichert MAC-Adressen für jedes IP-Paket, das der Treiber sieht. Wenn die Ziel-IP mindestens ein Paket gesendet hat, während der Treiber lief, ist die MAC bereits zwischengespeichert und es gibt keine ARP-Verzögerung. Nur völlig stille Peers (solche, die nie ein Paket gesendet haben) erfordern die anfängliche ARP-Auflösung, was etwa 1 Sekunde dauert.

LAN-Spiele sehen andere Peers nicht / „Auto-Discovery" defekt: Die meisten LAN-Spiele finden sich über Broadcast-Probes (UDP an 255.255.255.255) oder Multicast (224.0.0.0/4). Unter Windows bewirbt sich der Radmin-TAP-Treiber als bevorzugte Schnittstelle für diese Datenströme; unter Linux müssen Sie es dem Kernel explizit mitteilen. run.sh installiert jetzt zwei zusätzliche Routen, wenn das VPN hochkommt:

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

Nebeneffekt: mDNS / Bonjour / SSDP in Ihrem physischen LAN (Chromecast, AirPrint, Sonos, Smart-TVs, ...) laufen durch das VPN, solange es aktiv ist. Wenn Sie lokale LAN-Erkennung und Radmin parallel benötigen, führen Sie es mit --no-broadcast-routes aus:

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

Die Routen sind an das TAP-Gerät gebunden, sodass sie automatisch entfernt werden, wenn run.sh das Gerät beim Beenden abbaut.

Bekannte Einschränkungen

  • Es kann jeweils nur eine Instanz laufen (gemeinsame FIFOs in /tmp/)
  • Die 26.0.0.0/8-On-Link-Route betrifft während des Betriebs das gesamte System (wird beim Beenden bereinigt)
  • Standard-Broadcast- (255.255.255.255/32) und Multicast-Routen (224.0.0.0/4) werden zum VPN geleitet — mit --no-broadcast-routes deaktivieren, wenn Sie lokales LAN-mDNS / SSDP parallel benötigen
  • Ältere Wine-Versionen (< 11.0) können ein anderes Verhalten bei überlappender E/A aufweisen, das den Treiber bricht

Hinweise

Workaround für Wine-Bug. Der RegSetKeySecurity-Hook umgeht eine bekannte Wine-Einschränkung, bei der Dienste die SYSTEM-SID (S-1-5-18) nicht erhalten. Dies wird möglicherweise in einer zukünftigen Wine-Version upstream behoben.

Danksagungen

Reverse Engineering und der Wine-Shim: @baptisterajaut.

  • @ayozetr — hat das Hängen bei „Registriert, aber nie ready" auf eine Reverse-DNS-Abfrage einer privaten Adresse zurückgeführt, die vom Host-Resolver verschluckt wurde, hat es mit einem Bare-libc-Repro bewiesen, nachdem vier falsche Theorien verworfen worden waren (meine eingeschlossen), und hat das Original von src/rvpn_dnsfix.c und contrib/run-in-netns.sh geschrieben.
  • @gringoestrangeiro — Linux-Stabilitätsarbeit: Paketfilter, ARP-Cache, Absturzwiederherstellung, Headless- und Rechenzentrums-Modi.
  • @yuxiaole-bili — hat herausgefunden, dass der SCM von Wine automatisch eine zweite, ungehookte Dienstinstanz startet, die mit der injizierten um den Adapter kämpft.
  • @D1spell-tech, @Milkiway13 und alle, die einen vollständigen Diagnoseblock eingefügt haben — zwei unabhängige Hosts sind es, die einen Bug auffindbar machen.

Lizenz

GPL-3.0. Siehe LICENSE.

Im Geiste ist dieser Code Public Domain — machen Sie damit, was Sie wollen. Die GPL ist hier als rechtliches Sicherheitsnetz: Sie schützt ausdrücklich Reverse Engineering für Interoperabilität, genau das tut dieses Projekt. Gürtel und Hosenträger.

Radmin VPN ist proprietäre Software von Famatech Corp. Dieses Projekt stellt nur Interoperabilitätswerkzeuge bereit — es ist kein Famatech-Code enthalten oder wird weitergegeben.

Kategorien