업데이트로 돌아가기
New releaseAug 8, 2026

radmin-vpn-linux v1.0.0

Wine을 통해 Linux에서 Radmin VPN 실행 — 커스텀 드라이버, TAP 브리지, 패킷 손실 제로

공유

Linux용 Radmin VPN

Wine을 통해 Linux에서 Radmin VPN을 실행하세요. VPN 네트워크에 참여하고, 피어를 보고, 게임을 플레이하세요 — Windows VM 없이도 가능합니다.

VM보다 쉬워서 만든 것이 아닙니다. VM보다 쉽다고 생각했기 때문에 만든 것입니다.

AI 지원 코드. 인간과 Claude(Anthropic)가 협업하여 제작했습니다. 드라이버, 훅, 브리지는 Ghidra를 사용한 Radmin VPN의 문서화되지 않은 드라이버 프로토콜에 대한 광범위한 AI 지원 리버스 엔지니어링을 통해 작성되었습니다. 동작하지만, 어떠한 보장도 없습니다. Famatech와 무관합니다. Radmin VPN은 독점 소프트웨어입니다 — radmin-vpn.com에서 직접 다운로드하세요. 사용에 따른 책임은 본인에게 있습니다.

작동 방식

Radmin VPN의 Windows 서비스는 가상 네트워크 어댑터용 NDIS 미니포트 드라이버와 통신합니다. Wine은 NDIS를 지원하지 않으므로, 드라이버를 Linux TAP 디바이스로 브리지하는 자체 구현으로 대체합니다. 훅 DLL이 Wine 호환성 문제(어댑터 이름, 레지스트리 권한)를 처리합니다. 그 결과 완전한 기능을 갖춘 Radmin VPN 클라이언트가 Wine에서 네이티브로 실행됩니다.

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

빠른 시작 (AppImage, 권장)

최신 릴리스에서 RadminVPN-Linux-x86_64.AppImage를 받으세요. 설치할 것이 없습니다 — Wine이 번들로 포함되어 있습니다.

릴리스 후보 (예: v1.0.0-rc1)는 GitHub 사전 릴리스로 게시됩니다. 위의 latest 링크는 항상 최신 안정 빌드를 가리키므로 사전 릴리스는 여기에 표시되지 않습니다 — 전체 릴리스 목록에서 받으세요.

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

첫 실행 시 Radmin VPN 설치 프로그램을 요청합니다 (먼저 radmin-vpn.com에서 Radmin_VPN_*.exe를 다운로드하세요). 진행 상황이 표시되는 터미널이 열리고, TAP 설정을 위해 sudo 비밀번호 입력이 한 번 필요합니다.

영구 상태(wineprefix, MAC, 로그)는 ~/.local/share/radmin-vpn-linux/에 저장됩니다.

사전 요구 사항 (소스 빌드 / AppImage 아님)

  • Wine >= 11.0 (Wine 11.5 Arch Linux 및 Wine 11.6 Ubuntu 24.04에서 테스트됨)
  • mingw-w64 크로스 컴파일러 (i686-w64-mingw32-gcc, x86_64-w64-mingw32-gcc) — 소스에서 빌드용
  • iconv (glibc) — 서비스 로그 파싱용
  • sudo 액세스 — TAP 디바이스 생성 및 라우팅용
  • TUN/TAP 커널 지원 — 일반적으로 내장되어 있으며, modprobe tun으로 확인
  • Radmin VPN 설치 프로그램radmin-vpn.com에서 다운로드. 2.0.x 빌드여야 함 (2.0.4899.9 기준으로 개발됨). Radmin VPN 1.4는 지원되지 않음 — 등록 및 어댑터 열기는 되지만 Wine 셰임에서 연결이 완료되지 않아 GUI가 "Connecting..."에서 멈춥니다.

Arch Linux

sudo pacman -S wine mingw-w64-gcc

Ubuntu/Debian

sudo apt install wine64 wine32 gcc-mingw-w64

소스 빠른 시작

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

이후 실행 시에는:

./run.sh

명령줄 플래그

플래그설명
--installer <path>Radmin_VPN_*.exe 설치 프로그램 경로 (첫 실행에만 해당).
--no-uiRadmin GUI를 실행하지 않고 서비스만 실행.
--no-broadcast-routes브로드캐스트/멀티캐스트 → TAP 경로를 추가하지 않음.
--filter-ui선택적 GTK4 패킷 필터 UI 실행 (기본값: 꺼짐).
--fix-chatQt의 qwindows.dll을 패치하여 Wine에서 채팅 창 크래시 수정 (기본값: 꺼짐).

--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   # or: make install-datacenter-deps
./run_datacenter.sh --installer ~/Downloads/Radmin_VPN_*.exe
플래그기본값설명
--vnc-port <n>5900x11vnc 서버 포트.
--web-port <n>6080noVNC 웹 엔드포인트 포트.
--vnc-password <pw>(없음)VNC/웹 세션 비밀번호.
--web-bind <addr>127.0.0.1noVNC가 수신 대기하는 주소.

기본적으로 noVNC는 127.0.0.1에 바인딩되므로 SSH 터널을 통해서만 접근할 수 있습니다:

ssh -L 6080:localhost:6080 your-vps    # then open 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 크로스 컴파일러가 필요합니다. 미리 빌드된 바이너리는 릴리스에서 받을 수 있습니다(각 태그 버전에서 CI로 빌드됨) — mingw를 설치하고 싶지 않다면 말이죠.

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

생성물:

  • 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 드라이버 설치 프로그램을 대체하는 no-op 스텁 (이슈 #12)
  • build/tap_bridge — 네이티브 Linux TAP 브리지
  • build/rvpn_dnsfix.so — 네이티브 LD_PRELOAD 셰임, 서비스에만 프리로드됨
  • build/rvpn_filter_ui — 선택적 GTK4 패킷 필터 UI (--filter-ui)

AppImage 빌드

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

첫 실행 시 Kron4ek Wine-Staging amd64-wow64 빌드(~100MB)와 appimagetool을 다운로드하여 둘 다 packaging/dist/에 캐시합니다. curl과 ImageMagick(convert)이 필요합니다.

run.sh가 수행하는 작업

  1. 첫 실행: Wine을 통해 Radmin VPN 설치(/VERYSILENT), 실제 NDIS 드라이버 제거(Wine과 호환되지 않음), 사용자 정의 드라이버 등록
  2. 매 실행: TAP 디바이스 생성, TAP-to-FIFO 브리지 시작, Wine 레지스트리 구성(어댑터 GUID, 드라이버 서비스), Radmin VPN 서비스 및 GUI 실행
  3. 종료 시(Ctrl+C 또는 GUI 닫기): Wine 종료, TAP 디바이스 제거, 정리

wineprefix는 ./wineprefix/(소스 실행) 또는 ~/.local/share/radmin-vpn-linux/wineprefix/(AppImage)에 저장됩니다. 영구 MAC 주소는 첫 실행 시 생성되어 wineprefix에 저장됩니다.

아키텍처

구성 요소설명
rvpnnetmp.sysWine 커널 드라이버. Radmin NDIS 미니포트를 에뮬레이션. IOCTL(VERSION, STATUS, SETUP, PEERMAC), TLV 프레임 인코딩/디코딩, 중첩 I/O용 IRP 큐, 다중 피어 지원을 위한 MAC 기반 프레임 라우팅 처리.
adapter_hook.dllRvControlSvc.exe와 함께 로드되는 컴패니언 DLL. IAT 훅: TAP 어댑터 이름을 Radmin이 기대하는 이름으로 변경, RegSetKeySecurity를 no-op 처리하여 서비스에 SYSTEM SID가 없는 Wine SCM 버그를 우회.
tap_bridge네이티브 Linux 바이너리. TAP 디바이스와 Wine 드라이버가 읽고 쓰는 명명된 파이프(FIFO) 간 이더넷 프레임 중계.
netsh.exe / netsh64.exeWine의 netsh 스텁 대체(32비트는 SysWOW64, 64비트는 System32). Windows netsh interface ip 명령을 파일 기반 릴레이를 통해 Linux ip addr/ip link 명령으로 변환하고, 주소가 루트 릴레이에 도달하기 전에 검증.
rvpn_launcher.exeCreateRemoteThread + LoadLibrary를 통해 adapter_hook.dll을 Radmin 서비스 프로세스에 주입.
drvinst.exeRadmin의 실제 NDIS 드라이버 설치 프로그램을 대체하는 no-op 스텁. Radmin은 런타임에 NetMP60_1_1_64.sys를 로드하기 위해 이를 실행하는데, NdisInitializeReadWriteLock에서 Wine 11.x를 중단시킵니다(이슈 #12). 우리 드라이버가 이미 해당 어댑터를 대체하므로 실제 드라이버는 절대 로드되어서는 안 됩니다.
rvpn_dnsfix.so네이티브 LD_PRELOAD 셰임, 서비스 실행에만 주입. glibc 계층에서 사설 IPv4/IPv6의 역방향 DNS(getnameinfo/gethostbyaddr)를 단락시킵니다. Radmin은 수집한 모든 로컬 후보 주소를 PTR 조회합니다. 리졸버가 RFC1918 PTR 쿼리를 블랙홀 처리하는 호스트에서는 수 분간 중단되고 서비스가 등록되어도 준비 상태가 되지 않습니다(이슈 #16). 조회는 Wine의 Unix 쪽에서 이루어지므로 adapter_hook.dll 내부의 어떤 훅으로도 닿을 수 없습니다.
rvpn_filter_ui선택적 GTK4 UI로 브리지를 통과하는 패킷을 검사하고 필터링. 기본값: 꺼짐. --filter-ui로 실행.

문제 해결

"Waiting for adapter"에서 GUI 멈춤: 드라이버가 로드되지 않고 있습니다. /tmp/radmin_driver.log가 존재하고 내용이 있는지 확인하세요. 비어 있다면 드라이버 서비스 등록이 누락된 것일 수 있습니다 — wineprefix를 삭제하고 다시 실행하세요.

등록은 되지만 "ready"가 되지 않음: 서비스가 Registered as #…까지 도달하고 멈춥니다. 두 가지 알려진 원인이 있으며, 둘 다 시간 초과 시 출력되는 진단 블록에 보고됩니다. (a) 자체 라우팅 정책을 가진 투명 프록시 또는 터널(sing-box, clash/mihomo, v2ray…)이 아웃바운드 연결을 가로채는 경우 — 이러한 스택은 TCP 핸드셰이크를 로컬에서 응답하므로 아무것도 중계되지 않는데 소켓은 ESTABLISHED로 읽힙니다. 해당 경로에서 26.0.0.0/8을 제외하고, 직접 도달할 수 있다면 *.radminte.com도 제외하세요. (b) 사설 주소의 역방향 조회를 블랙홀 처리하는 리졸버(172.17.0.1docker0이 일반적인 원인). rvpn_dnsfix.so가 이를 처리하지만 64비트 셰임입니다: old-wow64로 빌드된 시스템 Wine은 이를 무시합니다. 해결 방법 — /etc/hosts에 주소에 대한 줄을 추가하거나 contrib/run-in-netns.sh를 사용하세요(서비스를 "ready" 상태로 만들지만 VPN을 네임스페이스 안에 유지합니다 — 호스트 애플리케이션은 26.0.0.0/8에 도달할 수 없습니다. 헤더의 경고를 읽으세요).

서비스가 즉시 종료됨: /tmp/radmin_service.log에서 Wine 오류를 확인하세요. 일반적인 원인: 다른 Wine 버전의 오래된 wineprefix. ./wineprefix/를 삭제하고 다시 실행하세요.

피어 1개일 때 패킷 손실 0%, 많을 때 높은 손실: 이것이 원래 버그였습니다 — 드라이버의 MAC 기반 프레임 라우팅으로 수정되었습니다. 최신 빌드를 사용하고 있는지 확인하세요.

첫 ping이 느림(~1초): 최신 버전은 드라이버가 보는 모든 IP 패킷의 MAC 주소를 캐시합니다. 대상 IP가 드라이버 실행 중에 패킷을 하나라도 보냈다면 MAC은 이미 캐시되어 ARP 지연이 없습니다. 완전히 조용한 피어(패킷을 한 번도 보내지 않은)만 초기 ARP 해석이 필요하며, 여기에 약 1초가 추가됩니다.

LAN 게임이 다른 피어를 볼 수 없음 / "자동 검색" 작동 안 함: 대부분의 LAN 게임은 브로드캐스트 프로브(UDP 255.255.255.255) 또는 멀티캐스트(224.0.0.0/4)로 서로를 발견합니다. Windows에서는 Radmin TAP 드라이버가 이러한 흐름에 대해 선호 인터페이스로 자신을 광고합니다. Linux에서는 커널에 명시적으로 알려야 합니다. run.sh는 VPN이 올라올 때 두 개의 추가 경로를 설치합니다:

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

부작용: 물리적 LAN의 mDNS / Bonjour / SSDP(Chromecast, AirPrint, Sonos, 스마트 TV 등)가 VPN이 켜져 있는 동안 VPN을 통해 전달됩니다. 로컬 LAN 검색과 Radmin을 병렬로 사용해야 한다면 --no-broadcast-routes로 실행하세요:

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

경로는 TAP 디바이스에 범위가 지정되므로 run.sh가 종료 시 디바이스를 내려갈 때 자동으로 제거됩니다.

알려진 제한 사항

  • 한 번에 하나의 인스턴스만 실행 가능 (/tmp/의 공유 FIFO)
  • 26.0.0.0/8 온링크 경로는 실행 중에 전체 시스템에 영향을 줍니다 (종료 시 정리됨)
  • 기본 브로드캐스트(255.255.255.255/32) 및 멀티캐스트(224.0.0.0/4) 경로가 VPN으로 전달됩니다 — 로컬 LAN mDNS / SSDP를 병렬로 사용해야 한다면 --no-broadcast-routes로 비활성화
  • 이전 Wine 버전(< 11.0)은 드라이버를 깨뜨릴 수 있는 다른 중첩 I/O 동작을 가질 수 있습니다

참고 사항

Wine 버그 우회. RegSetKeySecurity 훅은 서비스가 SYSTEM SID(S-1-5-18)를 받지 못하는 알려진 Wine 제한을 우회합니다. 이는 향후 Wine 릴리스에서 업스트림으로 수정될 수 있습니다.

크레딧

리버스 엔지니어링 및 Wine 셰임: @baptisterajaut.

  • @ayozetr — "등록은 되지만 준비 안 됨" 상태가 호스트 리졸버에 의해 블랙홀 처리된 사설 주소의 역방향 DNS 조회 때문임을 추적하고, 네 가지 잘못된 이론(제 이론 포함)을 폐기한 후 bare-libc 재현으로 증명했으며 src/rvpn_dnsfix.ccontrib/run-in-netns.sh의 원본을 작성.
  • @gringoestrangeiro — Linux 안정성 작업: 패킷 필터, ARP 캐시, 크래시 복구, 헤드리스 및 데이터센터 모드.
  • @yuxiaole-bili — Wine의 SCM이 훅되지 않은 두 번째 서비스 인스턴스를 자동 시작하여 주입된 인스턴스와 어댑터를 두고 경쟁한다는 것을 발견.
  • @D1spell-tech, @Milkiway13 및 전체 진단 블록을 붙여넣은 모든 분들 — 버그를 찾을 수 있게 해주는 것은 두 대의 독립적인 호스트입니다.

라이선스

GPL-3.0. LICENSE 참조.

정신적으로 이 코드는 퍼블릭 도메인입니다 — 원하는 대로 사용하세요. GPL은 법적 안전망으로 여기에 있습니다: 이 프로젝트가 하는 일인 상호 운용을 위한 리버스 엔지니어링을 명시적으로 보호합니다. 이중 안전장치입니다.

Radmin VPN은 Famatech Corp.의 독점 소프트웨어입니다. 이 프로젝트는 상호 운용 도구만 제공합니다 — Famatech 코드는 포함되거나 배포되지 않습니다.

카테고리