
radmin-vpn-linux v1.0.0
Radmin VPN unter Linux über Wine ausführen — benutzerdefinierter Treiber, TAP-Brücke, kein Paketverlust
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. Derlatest-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
| Flag | Beschreibung |
|---|---|
--installer <path> | Pfad zum Radmin_VPN_*.exe-Installationsprogramm (nur beim ersten Start). |
--no-ui | Dienst ausführen, ohne die Radmin-GUI zu starten. |
--no-broadcast-routes | Die Broadcast-/Multicast-→-TAP-Routen nicht hinzufügen. |
--filter-ui | Die optionale GTK4-Paketfilter-UI starten (standardmäßig deaktiviert). |
--fix-chat | Qts 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
| Flag | Standard | Beschreibung |
|---|---|---|
--vnc-port <n> | 5900 | Port für den x11vnc-Server. |
--web-port <n> | 6080 | Port für den noVNC-Web-Endpunkt. |
--vnc-password <pw> | (keine) | Passwort für die VNC-/Web-Sitzung. |
--web-bind <addr> | 127.0.0.1 | Adresse, 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ückebuild/rvpn_dnsfix.so— nativer LD_PRELOAD-Shim, nur in den Dienst vorgeladenbuild/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
- Erster Start: installiert Radmin VPN über Wine (
/VERYSILENT), entfernt den echten NDIS-Treiber (mit Wine inkompatibel), registriert unseren benutzerdefinierten Treiber - 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
- 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
| Komponente | Beschreibung |
|---|---|
rvpnnetmp.sys | Wine-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.dll | Begleit-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_bridge | Native 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.exe | Ersetzt 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.exe | Injiziert adapter_hook.dll per CreateRemoteThread + LoadLibrary in den Radmin-Dienstprozess. |
drvinst.exe | No-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.so | Nativer 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_ui | Optionale 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-routesdeaktivieren, 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.cundcontrib/run-in-netns.shgeschrieben. - @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.