
Radmin VPN को Linux पर Wine के माध्यम से चलाएँ — कस्टम ड्राइवर, TAP ब्रिज, शून्य पैकेट हानि
Radmin VPN को Wine के माध्यम से लिनक्स पर चलाएँ। VPN नेटवर्क से जुड़ें, पीयर देखें, गेम खेलें — बिना किसी Windows VM के।
मैंने इसे इसलिए नहीं बनाया क्योंकि यह VM से आसान था। मैंने इसे इसलिए बनाया क्योंकि मुझे लगा कि यह VM से आसान है।
AI-सहायता प्राप्त कोड। एक मानव और Claude (Anthropic) के बीच सहयोग से निर्मित। ड्राइवर, हुक और ब्रिज को Ghidra का उपयोग करके Radmin VPN के अप्रलेखित ड्राइवर प्रोटोकॉल के व्यापक AI-सहायता प्राप्त रिवर्स इंजीनियरिंग के साथ लिखा गया था। यह काम करता है, लेकिन कोई गारंटी नहीं देता। Famatech से संबद्ध नहीं। Radmin VPN मालिकाना है — इसे स्वयं radmin-vpn.com से डाउनलोड करें। अपने जोखिम पर उपयोग करें।
Radmin VPN की Windows सेवा अपने वर्चुअल नेटवर्क एडेप्टर के लिए एक NDIS मिनिपोर्ट ड्राइवर से बात करती है। Wine NDIS का समर्थन नहीं करता, इसलिए हम ड्राइवर को अपने स्वयं के कार्यान्वयन से बदल देते हैं जो लिनक्स TAP डिवाइस से ब्रिज करता है। एक हुक DLL Wine संगतता समस्याओं (एडेप्टर नामकरण, रजिस्ट्री अनुमतियाँ) को संभालता है। परिणाम एक पूर्ण रूप से कार्यात्मक Radmin VPN क्लाइंट है जो Wine के अंतर्गत मूल रूप से चलता है।
Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe
नवीनतम रिलीज़ से प्राप्त करें। कुछ भी इंस्टॉल करने की आवश्यकता नहीं — Wine बंडल किया गया है।
RadminVPN-Linux-x86_64.AppImageरिलीज़ कैंडिडेट (जैसे
v1.0.0-rc1) GitHub प्री-रिलीज़ के रूप में प्रकाशित होते हैं। उपरोक्तlatestलिंक हमेशा नवीनतम स्थिर बिल्ड की ओर इशारा करता है, इसलिए प्री-रिलीज़ वहाँ दिखाई नहीं देंगे — उन्हें पूर्ण रिलीज़ सूची से प्राप्त करें।
chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage
पहले लॉन्च पर यह Radmin VPN इंस्टॉलर डाउनलोड करता है जिसके विरुद्ध इसे मान्य किया गया है (या --installer के साथ अपना स्वयं का पास करें)। प्रगति के साथ एक टर्मिनल खुलता है, और TAP सेटअप के लिए एक sudo पासवर्ड प्रॉम्प्ट की आवश्यकता होती है।
स्थायी स्थिति (wineprefix, MAC, लॉग) ~/.local/share/radmin-vpn-linux/ में रहती है।
Radmin अपने आप बंद हो रहा है? इसका अपना अपडेटर चल रहे प्रीफ़िक्स के अंदर एक नया बिल्ड इंस्टॉल कर रहा है। इसके बजाय नियंत्रित तरीके से अपग्रेड करें — यह आपका प्रीफ़िक्स और आपकी Radmin ID बनाए रखता है:
./RadminVPN-Linux-x86_64.AppImage --updateफिर Radmin सेटिंग्स में "Automatic updates" बंद कर दें ताकि यह फिर से कोशिश न करे। विवरण Radmin के स्वयं के ऑटो-अपडेटर में।
i686-w64-mingw32-gcc, x86_64-w64-mingw32-gcc) — स्रोत से निर्माण के लिएmodprobe tun से जाँचेंlib.sh में RADMIN_VERSION (वर्तमान में 2.1.4951.1; 2.0.4899.9 भी काम करता है)। Radmin VPN 1.4 समर्थित नहीं है — यह एडेप्टर को पंजीकृत और खोलता है लेकिन Wine शिम के अंतर्गत कभी कनेक्ट नहीं होता, GUI को "Connecting..." पर अटका छोड़ देता है।sudo pacman -S wine mingw-w64-gcc
sudo apt install wine64 wine32 gcc-mingw-w64
git clone https://github.com/baptisterajaut/radmin-vpn-linux.git
cd radmin-vpn-linux
# विकल्प A: 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/
# विकल्प B: स्रोत से निर्माण करें
make
# https://www.radmin-vpn.com/ से Radmin VPN इंस्टॉलर डाउनलोड करें
./run.sh --installer ~/Downloads/Radmin_VPN_*.exe
बाद के रन पर, बस:
./run.sh
| फ़्लैग | विवरण |
|---|---|
--installer <path> | Radmin_VPN_*.exe इंस्टॉलर का पथ (केवल पहले रन पर)। |
--no-ui | Radmin GUI लॉन्च किए बिना सेवा चलाएँ। |
--update | Radmin को पिन किए गए संस्करण में स्थान पर अपग्रेड करें। प्रीफ़िक्स बनाए रखता है, इसलिए Famatech के साथ पंजीकृत RID बचा रहता है। |
--no-broadcast-routes | ब्रॉडकास्ट/मल्टीकास्ट → TAP रूट न जोड़ें। |
--filter-ui | वैकल्पिक GTK4 पैकेट-फ़िल्टर UI लॉन्च करें (डिफ़ॉल्ट रूप से बंद)। |
--fix-chat | चैट-विंडो क्रैश को ठीक करने के लिए Qt के qwindows.dll को पैच करें (डिफ़ॉल्ट रूप से बंद)। |
Radmin का GUI एक नया बिल्ड डाउनलोड कर सकता है और उसका इंस्टॉलर लाइव प्रीफ़िक्स के अंदर चला सकता है,
जो GUI को मार देता है और चल रही सेवा को दोषपूर्ण बना देता है (GUI लॉग तब AppData\\Local\\Temp के अंतर्गत
एक इंस्टॉलर दिखाता है)। दो बचाव: लॉन्चर वर्तमान मान्य बिल्ड भेजता है ताकि अपडेटर के पास धकेलने के लिए कुछ न हो,
और एक GUI जो मर जाता है वह अब टनल को अपने साथ नहीं ले जाता — इसे एक बार पुनः आरंभ किया जाता है, फिर VPN हेडलेस चलता रहता है। जानबूझकर
अपग्रेड करने के लिए, ./run.sh --update का उपयोग करें, जो पहले सब कुछ रोक देता है। GUI सेटिंग्स में
"Automatic updates" बंद करने से यह दौड़ पूरी तरह से टल जाती है।
--filter-ui और --fix-chat दोनों ऑप्ट-इन हैं। फ़िल्टर UI को rvpn_filter_ui बाइनरी की आवश्यकता होती है
(make द्वारा निर्मित); चैट फिक्स को patch_qwindows_font.py और एक Python 3 इंटरप्रेटर की आवश्यकता होती है।
दो अतिरिक्त लॉन्चर Radmin VPN को स्थानीय डेस्कटॉप के बिना चलाते हैं — VPS या डेटासेंटर होस्ट के लिए। दोनों run.sh की तरह ही इंस्टॉल और कॉन्फ़िगर करते हैं (समान wineprefix, समान --installer पहले-रन प्रवाह, समान TAP ब्रिज); वे केवल GUI तक पहुँचने के तरीके में भिन्न हैं।
run_datacenter.sh — ब्राउज़र पर GUIवास्तविक Radmin GUI को वर्चुअल डिस्प्ले (Xvfb) पर चलाता है और इसे VNC + noVNC के माध्यम से परोसता है, ताकि आप अपने नेटवर्क को ब्राउज़र से कॉन्फ़िगर कर सकें और फिर इसे चलता छोड़ सकें।
sudo apt install -y xvfb x11vnc websockify novnc # या: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
--vnc-port <n> | 5900 | x11vnc सर्वर के लिए पोर्ट। |
--web-port <n> | 6080 | noVNC वेब एंडपॉइंट के लिए पोर्ट। |
--vnc-password <pw> | (कोई नहीं) | VNC / वेब सत्र के लिए पासवर्ड। |
--web-bind <addr> | 127.0.0.1 | noVNC जिस पते पर सुनता है। |
डिफ़ॉल्ट रूप से noVNC 127.0.0.1 से बंधा होता है, इसलिए यह केवल SSH टनल के माध्यम से पहुँच योग्य है:
ssh -L 6080:localhost:6080 your-vps # फिर http://localhost:6080/vnc.html खोलें
इसे सार्वजनिक रूप से उजागर करने के लिए, --web-bind 0.0.0.0 को --vnc-password के साथ पास करें — अन्यथा जो कोई भी वेब पोर्ट तक पहुँचता है वह एक अप्रमाणित, रूट-सक्षम डेस्कटॉप पर पहुँच जाता है। स्क्रिप्ट एक ज़ोरदार चेतावनी प्रिंट करती है यदि आप पासवर्ड के बिना सार्वजनिक रूप से बाइंड करते हैं।
run_vps.sh — केवल सेवा, निश्चित GUIDसेवा को हार्डकोडेड TAP GUID (कोई Wine WMI आवश्यक नहीं) और बिल्कुल कोई GUI नहीं के साथ हेडलेस शुरू करता है। यदि एक कस्टम नेटवर्क एन्यूमरेटर (rv_net_enum.exe, इस रिपो में शिप नहीं किया गया) एक निर्देशिका ऊपर मौजूद है, तो इसे लॉन्च किया जाता है; अन्यथा सेवा तब तक चलती है जब तक आप Ctrl+C नहीं दबाते। केवल --installer स्वीकार किया जाता है।
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
mingw-w64 क्रॉस-कंपाइलर की आवश्यकता है। पूर्व-निर्मित बाइनरी Releases से उपलब्ध हैं (प्रत्येक टैग किए गए संस्करण पर CI द्वारा निर्मित) यदि आप mingw इंस्टॉल नहीं करना चाहते हैं।
make # सब कुछ build/ में बनाएँ
make clean # बिल्ड आर्टिफैक्ट हटाएँ
उत्पादन करता है:
build/rvpnnetmp.sys — Wine कर्नेल ड्राइवर (64-बिट PE)build/adapter_hook.dll — हुक DLL (32-बिट PE)build/rvpn_launcher.exe — DLL इंजेक्टर (32-बिट PE)build/netsh.exe — netsh प्रतिस्थापन (32-बिट PE, SysWOW64 में स्थापित)build/netsh64.exe — netsh प्रतिस्थापन (64-बिट PE, System32 में स्थापित)build/drvinst.exe — नो-ऑप स्टब जो Radmin के वास्तविक NDIS ड्राइवर इंस्टॉलर को प्रतिस्थापित करता है (issue #12)build/tap_bridge — मूल लिनक्स TAP ब्रिजbuild/rvpn_dnsfix.so — मूल LD_PRELOAD शिम, केवल सेवा में प्रीलोड किया गयाbuild/rvpn_reuseport.so — मूल LD_PRELOAD शिम, wineserver में प्रीलोड किया गयाbuild/rvpn_filter_ui — वैकल्पिक GTK4 पैकेट-फ़िल्टर UI (--filter-ui)make
./packaging/build-appimage.sh # → packaging/dist/RadminVPN-Linux-x86_64.AppImage
पहले रन पर Kron4ek Wine-Staging amd64-wow64 बिल्ड (~100 MB) और appimagetool डाउनलोड करता है, दोनों को packaging/dist/ में कैश करता है। curl और ImageMagick (convert) की आवश्यकता है।
run.sh क्या करता है/VERYSILENT), वास्तविक NDIS ड्राइवर को हटाता है (Wine के साथ असंगत), हमारे कस्टम ड्राइवर को पंजीकृत करता हैwineprefix ./wineprefix/ (स्रोत रन) या ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage) में संग्रहीत है। पहले रन पर एक स्थायी MAC पता उत्पन्न होता है और wineprefix में सहेजा जाता है।
| घटक | विवरण |
|---|---|
rvpnnetmp.sys | Wine कर्नेल ड्राइवर। Radmin NDIS मिनिपोर्ट का अनुकरण करता है। IOCTL (VERSION, STATUS, SETUP, PEERMAC), TLV फ्रेम एन्कोडिंग/डिकोडिंग, ओवरलैप्ड I/O के लिए IRP कतार, मल्टी-पीयर समर्थन के लिए MAC-आधारित फ्रेम रूटिंग संभालता है। |
adapter_hook.dll | RvControlSvc.exe के साथ लोड की गई सहयोगी DLL। IAT हुक: TAP एडेप्टर का नाम Radmin के अपेक्षित नाम से मिलान करने के लिए बदलता है, Wine SCM बग के आसपास काम करने के लिए RegSetKeySecurity को नो-ऑप करता है जहाँ सेवाओं में SYSTEM SID की कमी होती है, और चार Perf{Increment,Decrement}ULong{,Long}CounterValue लुकअप का उत्तर देता है जो Wine का advapi32 निर्यात नहीं करता। वह अंतिम वाला कॉस्मेटिक नहीं है: Radmin 2.1 एक सभी-या-कुछ नहीं कैस्केड में सात perflib एंट्री पॉइंट हल करता है, फिर परिणामी प्रति-पीयर काउंटर ऑब्जेक्ट को पीयर हैंडशेक के पेलोड के रूप में पास करता है — इसलिए चार लापता टेलीमेट्री निर्यात पूरे डेटा पथ को नीचे ले जाते हैं (issue #24, docs/wine-perflib.md)। |
tap_bridge | मूल लिनक्स बाइनरी। TAP डिवाइस और नामित पाइप (FIFO) के बीच ईथरनेट फ्रेम रिले करता है जिन्हें Wine ड्राइवर पढ़ता/लिखता है। |
netsh.exe / netsh64.exe | Wine के netsh स्टब को प्रतिस्थापित करता है (SysWOW64 में 32-बिट, System32 में 64-बिट)। Windows netsh interface ip कमांड को फ़ाइल-आधारित रिले के माध्यम से लिनक्स ip addr/ip link कमांड में अनुवादित करता है, रूट रिले तक पहुँचने से पहले पते को मान्य करता है। |
rvpn_launcher.exe | CreateRemoteThread + LoadLibrary के माध्यम से adapter_hook.dll को Radmin सेवा प्रक्रिया में इंजेक्ट करता है। |
drvinst.exe | नो-ऑप स्टब जो Radmin के वास्तविक NDIS ड्राइवर इंस्टॉलर को प्रतिस्थापित करता है। Radmin इसे रनटाइम पर NetMP60_1_1_64.sys लोड करने के लिए चलाता है, जो NdisInitializeReadWriteLock के माध्यम से Wine 11.x को रोक देता है (issue #12); चूँकि हमारा ड्राइवर पहले से ही उस एडेप्टर को प्रतिस्थापित करता है, वास्तविक को कभी लोड नहीं होना चाहिए। |
rvpn_dnsfix.so | मूल LD_PRELOAD शिम, केवल सेवा लॉन्च में इंजेक्ट किया गया। glibc परत पर निजी IPv4/IPv6 के रिवर्स DNS (getnameinfo/gethostbyaddr) को शॉर्ट-सर्किट करता है। Radmin हर स्थानीय उम्मीदवार पते का PTR-समाधान करता है जिसे वह एकत्र करता है; एक होस्ट पर जिसका रिज़ॉल्वर RFC1918 PTR क्वेरी को ब्लैक-होल करता है, यह मिनटों के लिए रुक जाता है और सेवा पंजीकृत होती है लेकिन कभी तैयार नहीं होती (issue #16)। लुकअप Wine के Unix पक्ष द्वारा जारी किया जाता है, जो के अंदर किसी भी हुक की पहुँच से बाहर है। |
GUI "Waiting for adapter" पर अटका: ड्राइवर लोड नहीं हो रहा है। जाँचें कि /tmp/radmin_driver.log मौजूद है और उसमें सामग्री है। यदि खाली है, तो ड्राइवर सेवा पंजीकरण लापता हो सकता है — wineprefix हटाएँ और फिर से चलाएँ।
पंजीकृत लेकिन कभी "ready" नहीं: सेवा Registered as #… तक पहुँचती है और वहीं रुक जाती है। दो ज्ञात कारण, दोनों टाइमआउट पर मुद्रित डायग्नोस्टिक्स ब्लॉक द्वारा रिपोर्ट किए गए। (a) एक पारदर्शी प्रॉक्सी या टनल जिसकी अपनी रूटिंग नीति है (sing-box, clash/mihomo, v2ray…) आउटबाउंड कनेक्शन को इंटरसेप्ट कर रही है — ऐसे स्टैक TCP हैंडशेक का स्थानीय रूप से उत्तर देते हैं, इसलिए सॉकेट ESTABLISHED पढ़ता है जबकि कुछ भी रिले नहीं होता। 26.0.0.0/8 को उसके रूट से बाहर करें, और *.radminte.com को भी यदि आप उन तक सीधे पहुँच सकते हैं। (b) एक रिज़ॉल्वर जो निजी पतों के रिवर्स लुकअप को ब्लैक-होल करता है (एक docker0 172.17.0.1 पर सामान्य ट्रिगर है)। rvpn_dnsfix.so इसे संभालता है, लेकिन यह एक 64-बिट शिम है: old-wow64 के रूप में निर्मित एक सिस्टम Wine इसे अनदेखा करता है। वहाँ वर्कअराउंड — पते के लिए /etc/hosts में एक पंक्ति जोड़ें, या contrib/run-in-netns.sh का उपयोग करें (जो सेवा को "ready" तक पहुँचाता है लेकिन VPN को नेमस्पेस के अंदर रखता है: होस्ट एप्लिकेशन 26.0.0.0/8 तक नहीं पहुँच सकते, इसके हेडर में चेतावनी पढ़ें)।
Radmin चलाने के बाद आपके अन्य Wine ऐप्स टूट गए (unimplemented function ndis.sys.NdisInitializeReadWriteLock): 1.0.0 तक के संस्करण Wine के winemenubuilder.exe को चलने देते थे, जो होस्ट की Windows फ़ाइल एसोसिएशन (.exe, .msi, .lnk, .reg, .chm, …) को हमारे प्रीफ़िक्स में खोलने के लिए फिर से लिखता है। अन्य Windows प्रोग्राम तब Radmin प्रीफ़िक्स के अंदर शुरू होते हैं, और यदि Radmin का वास्तविक NDIS मिनिपोर्ट (RvNetMP60) अभी भी वहाँ पंजीकृत है, तो उनमें से हर एक उस ndis स्टब पर रुक जाता है। 1.0.1 हर जगह winemenubuilder को अक्षम करता है, Radmin प्रीफ़िक्स के लिए उसके द्वारा लिखी गई प्रविष्टियों को शुद्ध करता है, और system.reg से RvNetMP60 को ऑफ़लाइन हटाता है — बस 1.0.1 को एक बार चलाएँ और दोनों मरम्मत हो जाते हैं। ध्यान दें echo $WINEPREFIX इस स्थिति में कुछ नहीं दिखाता: हाइजैक ~/.local/share/applications/*.desktop में रहता है, आपके वातावरण में नहीं। मैन्युअल सफाई, यदि आप पसंद करते हैं:
grep -rl 'WINEPREFIX=[^"]*radmin' ~/.local/share/applications --include='*.desktop' | xargs -r rm
rm -rf ~/.local/share/applications/wine/Programs/"Radmin VPN"
update-desktop-database ~/.local/share/applications
ऑनलाइन और आपके नेटवर्क में, लेकिन कोई पीयर कभी कनेक्ट नहीं होता (error: 0x700000000): यह 1.1.0 से पुराने बिल्ड पर Radmin 2.1 है। सेवा लॉग पीयर कनेक्शन तक स्वस्थ दिखता है, जो फिर उस कोड के साथ लूप में विफल होते हैं और अंत में node offline के साथ हार मान लेते हैं। दो स्वतंत्र Wine अंतराल, दोनों 1.1.0 में ठीक किए गए और दोनों ऊपर rvpn_reuseport.so और adapter_hook.dll पंक्तियों में समझाए गए: Wine TCP SO_REUSEADDR के लिए कोई Unix-स्तरीय विकल्प सेट नहीं करता, इसलिए 2.1 के पोर्ट-रीयूज़ NAT ट्रैवर्सल को हर पीयर कनेक्ट पर WSAEACCES मिलता है; और Wine का advapi32 चार perflib निर्यात लापता है, जिनके बिना 2.1 अपने पीयर हैंडशेक के रूप में एक नल पेलोड भेजता है। ध्यान दें कि कोड स्वयं कोई जानकारी नहीं रखता — यह त्रुटि कैस्केड के अंत में सामान्य हार-मानना है, इसलिए इसमें से किसी सबसिस्टम को प
adapter_hook.dllrvpn_reuseport.so | मूल LD_PRELOAD शिम, wineserver में प्रीलोड किया गया (सेवा में नहीं — Unix सॉकेट wineserver के हैं)। निर्माण के समय हर TCP सॉकेट पर SO_REUSEPORT सेट करता है। Radmin 2.1 TCP पोर्ट-रीयूज़ NAT ट्रैवर्सल करता है: यह uplink:PORT पर एक लिसनर बाइंड करता है, उस मैपिंग का विज्ञापन करता है, फिर अपने आउटबाउंड पीयर सॉकेट को SO_REUSEADDR के साथ उसी स्थानीय पोर्ट पर बाइंड करता है, जिसे Windows अनुमति देता है। Wine उस अनुरोध को TCP के लिए किसी Unix-स्तरीय विकल्प में अनुवादित नहीं करता (server/sock.c, SO_REUSEPORT केवल __APPLE__ के लिए संकलित है), इसलिए कर्नेल दूसरे बाइंड को अस्वीकार कर देता है और क्लाइंट हर पीयर कनेक्ट पर WSAEACCES देखता है (issue #24)। Wineserver की अपनी संघर्ष बहीखाता अभी भी चलती है, इसलिए जिन बाइंड्स को Windows अस्वीकार करेगा उन्हें अभी भी अस्वीकार किया जाता है। |
rvpn_filter_ui | वैकल्पिक GTK4 UI ब्रिज पार करने वाले पैकेटों का निरीक्षण और फ़िल्टर करने के लिए। डिफ़ॉल्ट रूप से बंद; --filter-ui के साथ लॉन्च करें। |