
radmin-vpn-linux v1.0.0
Execute Radmin VPN no Linux via Wine — driver personalizado, ponte TAP, zero perda de pacotes
Radmin VPN para Linux
Execute o Radmin VPN no Linux via Wine. Entre em redes VPN, veja os pares, jogue — tudo sem uma VM Windows.
Eu não construí isto porque era mais fácil que uma VM. Eu o construí porque pensei que era mais fácil que uma VM.
Código assistido por IA. Construído colaborativamente entre um humano e Claude (Anthropic). O driver, os hooks e a ponte foram escritos com extensa engenharia reversa assistida por IA do protocolo de driver não documentado do Radmin VPN usando Ghidra. Funciona, mas não oferece garantias. Sem afiliação com a Famatech. O Radmin VPN é proprietário — baixe você mesmo do radmin-vpn.com. Use por sua conta e risco.
Como funciona
O serviço Windows do Radmin VPN conversa com um driver NDIS miniport para seu adaptador de rede virtual. O Wine não suporta NDIS, então substituímos o driver por nossa própria implementação que faz ponte com um dispositivo TAP do Linux. Uma DLL de hook lida com problemas de compatibilidade do Wine (nomes de adaptadores, permissões de registro). O resultado é um cliente Radmin VPN totalmente funcional rodando nativamente sob o Wine.
Linux app ← TAP (radminvpn0) ← tap_bridge ← FIFO ← rvpnnetmp.sys (Wine driver) ← RvControlSvc.exe
Início rápido (AppImage, recomendado)
Baixe o RadminVPN-Linux-x86_64.AppImage do último lançamento. Nada para instalar — o Wine já vem incluído.
Candidatos a lançamento (ex.:
v1.0.0-rc1) são publicados como pré-lançamentos do GitHub. O linklatestacima sempre aponta para a versão estável mais recente, então pré-lançamentos não aparecerão ali — baixe-os da lista completa de lançamentos.
chmod +x RadminVPN-Linux-x86_64.AppImage
./RadminVPN-Linux-x86_64.AppImage
No primeiro início, ele solicitará o instalador do Radmin VPN (baixe o Radmin_VPN_*.exe do radmin-vpn.com primeiro). Um terminal abre com o progresso, e uma solicitação de senha do sudo é necessária para a configuração do TAP.
O estado persistente (wineprefix, MAC, logs) fica em ~/.local/share/radmin-vpn-linux/.
Pré-requisitos (build pela fonte / sem AppImage)
- Wine >= 11.0 (testado no Wine 11.5 Arch Linux e no Wine 11.6 Ubuntu 24.04)
- Compiladores cruzados mingw-w64 (
i686-w64-mingw32-gcc,x86_64-w64-mingw32-gcc) — para compilar pela fonte - iconv (glibc) — para análise dos logs do serviço
- Acesso ao sudo — para criação do dispositivo TAP e roteamento
- Suporte de kernel TUN/TAP — geralmente embutido, verifique com
modprobe tun - Instalador do Radmin VPN — baixe do radmin-vpn.com. Deve ser um build 2.0.x (desenvolvido contra o 2.0.4899.9). O Radmin VPN 1.4 não é suportado — ele registra e abre o adaptador, mas nunca termina de conectar sob o shim do Wine, deixando a GUI presa em "Connecting...".
Arch Linux
sudo pacman -S wine mingw-w64-gcc
Ubuntu/Debian
sudo apt install wine64 wine32 gcc-mingw-w64
Início rápido pela fonte
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
Nas execuções seguintes, apenas:
./run.sh
Flags de linha de comando
| Flag | Descrição |
|---|---|
--installer <path> | Caminho para o instalador Radmin_VPN_*.exe (apenas na primeira execução). |
--no-ui | Executa o serviço sem abrir a GUI do Radmin. |
--no-broadcast-routes | Não adiciona as rotas de broadcast/multicast → TAP. |
--filter-ui | Inicia a UI opcional de filtro de pacotes GTK4 (desativada por padrão). |
--fix-chat | Aplica patch no qwindows.dll do Qt para corrigir o crash da janela de chat sob o Wine (desativado por padrão). |
Ambos --filter-ui e --fix-chat são opt-in. A UI de filtro precisa do binário rvpn_filter_ui
(construído pelo make); a correção do chat precisa de patch_qwindows_font.py e de um interpretador Python 3.
Modos headless / servidor
Dois lançadores extras executam o Radmin VPN sem uma área de trabalho local — para um VPS ou host de datacenter. Ambos instalam e configuram exatamente como o run.sh (mesmo wineprefix, mesmo fluxo de primeira execução com --installer, mesma ponte TAP); eles só diferem em como a GUI é acessada.
run_datacenter.sh — GUI pelo navegador
Executa a GUI real do Radmin em um display virtual (Xvfb) e a serve via VNC + noVNC, para que você possa configurar suas redes pelo navegador e depois deixá-la rodando.
sudo apt install -y xvfb x11vnc websockify novnc # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
| Flag | Padrão | Descrição |
|---|---|---|
--vnc-port <n> | 5900 | Porta do servidor x11vnc. |
--web-port <n> | 6080 | Porta do endpoint web noVNC. |
--vnc-password <pw> | (nenhuma) | Senha da sessão VNC / web. |
--web-bind <addr> | 127.0.0.1 | Endereço no qual o noVNC escuta. |
Por padrão, o noVNC faz bind em 127.0.0.1, então só é acessível por um túnel SSH:
ssh -L 6080:localhost:6080 your-vps # then open http://localhost:6080/vnc.html
Para expô-lo publicamente, passe --web-bind 0.0.0.0 junto com --vnc-password — caso contrário, qualquer pessoa que alcançar a porta web cairá em uma área de trabalho não autenticada com poderes de root. O script imprime um aviso bem visível se você fizer bind público sem senha.
run_vps.sh — apenas serviço, GUID fixo
Inicia o serviço headless com um GUID TAP fixo no código (sem necessidade de Wine WMI) e nenhuma GUI. Se um enumerador de rede personalizado (rv_net_enum.exe, não incluído neste repositório) estiver presente um diretório acima, ele é iniciado; caso contrário, o serviço apenas roda até você pressionar Ctrl+C. Apenas --installer é aceito.
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
Compilando pela fonte
Requer compiladores cruzados mingw-w64. Binários pré-compilados estão disponíveis nas Releases (compilados pela CI em cada versão etiquetada) se você não quiser instalar o mingw.
make # build everything to build/
make clean # remove build artifacts
Produz:
build/rvpnnetmp.sys— driver de kernel do Wine (PE 64 bits)build/adapter_hook.dll— DLL de hook (PE 32 bits)build/rvpn_launcher.exe— injetor de DLL (PE 32 bits)build/netsh.exe— substituto do netsh (PE 32 bits, instalado em SysWOW64)build/netsh64.exe— substituto do netsh (PE 64 bits, instalado em System32)build/drvinst.exe— stub no-op substituindo o instalador real do driver NDIS do Radmin (issue #12)build/tap_bridge— ponte TAP nativa do Linuxbuild/rvpn_dnsfix.so— shim nativo LD_PRELOAD, pré-carregado apenas no serviçobuild/rvpn_filter_ui— UI opcional de filtro de pacotes GTK4 (--filter-ui)
Compilando o AppImage
make
./packaging/build-appimage.sh # → packaging/dist/RadminVPN-Linux-x86_64.AppImage
Baixa o build Kron4ek Wine-Staging amd64-wow64 (~100 MB) e o appimagetool na primeira execução, armazenando ambos em packaging/dist/. Requer curl e ImageMagick (convert).
O que o run.sh faz
- Primeira execução: instala o Radmin VPN via Wine (
/VERYSILENT), remove o driver NDIS real (incompatível com o Wine), registra nosso driver personalizado - Toda execução: cria um dispositivo TAP, inicia a ponte TAP-para-FIFO, configura o registro do Wine (GUID do adaptador, serviço do driver), inicia o serviço e a GUI do Radmin VPN
- Ao sair (Ctrl+C ou fechar a GUI): encerra o Wine, remove o dispositivo TAP, limpa tudo
O wineprefix é armazenado em ./wineprefix/ (execução pela fonte) ou ~/.local/share/radmin-vpn-linux/wineprefix/ (AppImage). Um endereço MAC persistente é gerado na primeira execução e salvo no wineprefix.
Arquitetura
| Componente | Descrição |
|---|---|
rvpnnetmp.sys | Driver de kernel do Wine. Emula o miniport NDIS do Radmin. Trata IOCTLs (VERSION, STATUS, SETUP, PEERMAC), codificação/decodificação de quadros TLV, fila de IRP para I/O sobreposto, roteamento de quadros baseado em MAC para suporte a múltiplos pares. |
adapter_hook.dll | DLL companheira carregada junto com o RvControlSvc.exe. Hooks de IAT: renomeia o adaptador TAP para corresponder ao nome esperado pelo Radmin, transforma RegSetKeySecurity em no-op para contornar um bug do SCM do Wine em que os serviços não têm o SID SYSTEM. |
tap_bridge | Binário nativo do Linux. Retransmite quadros ethernet entre o dispositivo TAP e pipes nomeados (FIFOs) que o driver do Wine lê/grava. |
netsh.exe / netsh64.exe | Substitui o stub do netsh do Wine (32 bits em SysWOW64, 64 bits em System32). Traduz comandos Windows netsh interface ip para comandos Linux ip addr/ip link via um relay baseado em arquivo, validando o endereço antes que ele chegue ao relay root. |
rvpn_launcher.exe | Injeta adapter_hook.dll no processo do serviço do Radmin via CreateRemoteThread + LoadLibrary. |
drvinst.exe | Stub no-op substituindo o instalador real do driver NDIS do Radmin. O Radmin o executa em tempo de execução para carregar NetMP60_1_1_64.sys, que aborta o Wine 11.x via NdisInitializeReadWriteLock (issue #12); como nosso driver já substitui esse adaptador, o real nunca deve ser carregado. |
rvpn_dnsfix.so | Shim nativo LD_PRELOAD, injetado apenas na inicialização do serviço. Interrompe a resolução reversa de DNS (getnameinfo/gethostbyaddr) de IPv4/IPv6 privados na camada glibc. O Radmin resolve PTR para cada endereço candidato local que coleta; em um host cujo resolvedor anula consultas PTR RFC1918, isso trava por minutos e o serviço registra mas nunca fica pronto (issue #16). A consulta é emitida pelo lado Unix do Wine, fora do alcance de qualquer hook dentro de adapter_hook.dll. |
rvpn_filter_ui | UI opcional GTK4 para inspecionar e filtrar os pacotes que cruzam a ponte. Desativada por padrão; inicie com --filter-ui. |
Solução de problemas
GUI presa em "Waiting for adapter": o driver não está carregando. Verifique se /tmp/radmin_driver.log existe e tem conteúdo. Se estiver vazio, o registro do serviço do driver pode estar faltando — delete o wineprefix e execute novamente.
Registrado mas nunca "ready": o serviço chega a Registered as #… e para ali. Duas causas conhecidas, ambas reportadas pelo bloco de diagnóstico impresso no timeout. (a) Um proxy transparente ou túnel com sua própria política de roteamento (sing-box, clash/mihomo, v2ray…) interceptando a conexão de saída — tais stacks respondem ao handshake TCP localmente, então o socket lê ESTABLISHED enquanto nada é retransmitido. Exclua 26.0.0.0/8 de suas rotas, e *.radminte.com também se você conseguir alcançá-los diretamente. (b) Um resolvedor que anula consultas reversas de endereços privados (um docker0 em 172.17.0.1 é o gatilho usual). O rvpn_dnsfix.so resolve isso, mas é um shim de 64 bits: um Wine de sistema compilado como old-wow64 o ignora. Solução alternativa — adicione uma linha para o endereço em /etc/hosts, ou use contrib/run-in-netns.sh (que leva o serviço a "ready" mas mantém a VPN dentro de um namespace: aplicativos do host não conseguem alcançar 26.0.0.0/8, leia o aviso no cabeçalho dele).
O serviço morre imediatamente: verifique /tmp/radmin_service.log para erros do Wine. Causa comum: wineprefix antigo de uma versão diferente do Wine. Delete ./wineprefix/ e execute novamente.
0% de perda de pacotes com um par, perda alta com muitos: este era o bug original — corrigido pelo roteamento de quadros baseado em MAC no driver. Certifique-se de estar usando o build mais recente.
O primeiro ping é lento (~1s): a versão mais recente armazena em cache os endereços MAC para cada pacote IP que o driver vê. Se o IP de destino enviou pelo menos um pacote enquanto o driver estava rodando, o MAC já está no cache e não há atraso de ARP. Apenas pares completamente silenciosos (aqueles que nunca enviaram um pacote) exigem a resolução ARP inicial, que adiciona ~1 segundo.
Jogos de LAN não veem outros pares / "auto-discovery" quebrado: a maioria dos jogos de LAN se descobre com sondas de broadcast (UDP para 255.255.255.255) ou multicast (224.0.0.0/4). No Windows, o driver TAP do Radmin se anuncia como a interface preferida para esses fluxos; no Linux, você precisa dizer ao kernel explicitamente. O run.sh agora instala duas rotas extras quando a VPN sobe:
ip route append 255.255.255.255/32 dev radminvpn0 metric 0
ip route append 224.0.0.0/4 dev radminvpn0 metric 0
Efeito colateral: mDNS / Bonjour / SSDP na sua LAN física (Chromecast, AirPrint, Sonos, smart TVs, ...) passarão pela VPN enquanto ela estiver ativa. Se você precisar de descoberta na LAN local e do Radmin em paralelo, execute com --no-broadcast-routes:
./run.sh --no-broadcast-routes
As rotas são limitadas ao dispositivo TAP, então são removidas automaticamente quando o run.sh derruba o dispositivo ao sair.
Limitações conhecidas
- Apenas uma instância pode rodar por vez (FIFOs compartilhados em
/tmp/) - A rota on-link
26.0.0.0/8afeta todo o sistema enquanto estiver em execução (limpa ao sair) - As rotas padrão de broadcast (
255.255.255.255/32) e multicast (224.0.0.0/4) são direcionadas para a VPN — desative com--no-broadcast-routesse precisar de mDNS / SSDP na LAN local em paralelo - Versões mais antigas do Wine (< 11.0) podem ter comportamento diferente de I/O sobreposto que quebra o driver
Notas
Solução de contorno para bug do Wine. O hook RegSetKeySecurity contorna uma limitação conhecida do Wine em que os serviços não recebem o SID SYSTEM (S-1-5-18). Isso pode ser corrigido upstream em uma futura versão do Wine.
Créditos
Engenharia reversa e o shim do Wine: @baptisterajaut.
- @ayozetr — rastreou o travamento "registra mas nunca fica pronto" até uma
consulta reversa de DNS de um endereço privado anulada pelo resolvedor do host, provou com um
repro de libc pura depois que quatro teorias erradas foram descartadas (incluindo a minha), e escreveu o
original de
src/rvpn_dnsfix.cecontrib/run-in-netns.sh. - @gringoestrangeiro — trabalho de estabilidade no Linux: filtros de pacotes, cache ARP, recuperação de crash, modos headless e datacenter.
- @yuxiaole-bili — descobriu que o SCM do Wine inicia automaticamente uma segunda instância do serviço sem hook que disputa o adaptador com a instância injetada.
- @D1spell-tech, @Milkiway13 e todos que colaram um bloco de diagnóstico completo — dois hosts independentes é o que torna um bug encontrável.
Licença
GPL-3.0. Veja LICENSE.
Em espírito, este código é domínio público — faça o que quiser com ele. A GPL está aqui como uma rede de segurança legal: ela protege explicitamente a engenharia reversa para interoperabilidade, que é o que este projeto faz. Cinto e suspensórios.
O Radmin VPN é um software proprietário da Famatech Corp. Este projeto fornece apenas ferramentas de interoperabilidade — nenhum código da Famatech é incluído ou distribuído.