
radmin-vpn-linux v1.0.0
Radmin VPN を Linux で Wine 経由で実行 — カスタムドライバー、TAP ブリッジ、パケットロスゼロ
Linux 向け Radmin VPN
Radmin VPN を Wine 経由で Linux 上で実行します。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 の互換性問題(アダプタ名、レジストリ権限)を処理します。その結果、Wine 上でネイティブに動作する完全な機能を持つ Radmin VPN クライアントが実現します。
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 パスワードプロンプトが1回必要です。
永続状態(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 shim では接続が完了せず、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
コマンドラインオプション
| Flag | Description |
|---|---|
--installer <path> | Radmin_VPN_*.exe インストーラへのパス(初回のみ)。 |
--no-ui | Radmin GUI を起動せずにサービスを実行します。 |
--no-broadcast-routes | ブロードキャスト/マルチキャスト → TAP ルートを追加しません。 |
--filter-ui | オプションの GTK4 パケットフィルタ UI を起動します(デフォルトではオフ)。 |
--fix-chat | Qt の qwindows.dll にパッチを当てて、Wine でのチャットウィンドウクラッシュを修正します(デフォルトではオフ)。 |
--filter-ui と --fix-chat はどちらもオプトインです。フィルタ UI には rvpn_filter_ui バイナリ(make でビルド)が必要です。チャット修正には patch_qwindows_font.py と Python 3 インタプリタが必要です。
ヘッドレス / サーバーモード
追加の2つのランチャーは、ローカルデスクトップなしで 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
| Flag | Default | Description |
|---|---|---|
--vnc-port <n> | 5900 | x11vnc サーバーのポート。 |
--web-port <n> | 6080 | noVNC Web エンドポイントのポート。 |
--vnc-password <pw> | (なし) | VNC / Web セッションのパスワード。 |
--web-bind <addr> | 127.0.0.1 | noVNC が待ち受けるアドレス。 |
デフォルトでは 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 と一緒に指定してください — そうしないと、Web ポートに到達した誰もが認証なしの root 権限を持つデスクトップにアクセスできてしまいます。パスワードなしで公開バインドした場合、スクリプトは大きな警告を表示します。
run_vps.sh — サービスのみ、固定 GUID
ハードコードされた TAP GUID を使用してサービスをヘッドレスで起動し(Wine WMI は不要)、GUI はまったく起動しません。カスタムネットワーク列挙子(rv_net_enum.exe、このリポジトリには同梱されていません)が1つ上のディレクトリにあれば起動されます。それ以外の場合、サービスは Ctrl+C するまで実行され続けます。受け付けられるのは --installer のみです。
./run_vps.sh --installer ~/Downloads/Radmin_VPN_*.exe
ソースからのビルド
mingw-w64 クロスコンパイラが必要です。mingw をインストールしたくない場合は、Releases(タグ付けされた各バージョンで CI がビルド)からビルド済みバイナリを入手できます。
make # build everything to build/
make clean # remove build artifacts
生成物:
build/rvpnnetmp.sys— Wine カーネルドライバ(64ビット PE)build/adapter_hook.dll— Hook 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 スタブ(issue #12)build/tap_bridge— ネイティブ Linux TAP ブリッジbuild/rvpn_dnsfix.so— ネイティブ LD_PRELOAD shim。サービスのみにプリロード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 ビルド(約100 MB)と appimagetool をダウンロードし、両方を packaging/dist/ にキャッシュします。curl と ImageMagick(convert)が必要です。
run.sh の動作
- 初回実行: Wine 経由で Radmin VPN をインストール(
/VERYSILENT)、実際の NDIS ドライバ(Wine と互換性がない)を削除し、カスタムドライバを登録 - 毎回の実行: TAP デバイスを作成し、TAP-to-FIFO ブリッジを起動し、Wine レジストリを設定(アダプタ GUID、ドライバサービス)し、Radmin VPN サービスと GUI を起動
- 終了時(Ctrl+C または GUI を閉じる): Wine を終了し、TAP デバイスを削除し、クリーンアップ
wineprefix は ./wineprefix/(ソース実行)または ~/.local/share/radmin-vpn-linux/wineprefix/(AppImage)に保存されます。初回実行時に永続的な MAC アドレスが生成され、wineprefix に保存されます。
アーキテクチャ
| Component | Description |
|---|---|
rvpnnetmp.sys | Wine カーネルドライバ。Radmin NDIS ミニポートをエミュレートします。IOCTL(VERSION、STATUS、SETUP、PEERMAC)、TLV フレームのエンコード/デコード、オーバーラップ I/O 用の IRP キュー、マルチピアサポートのための MAC ベースのフレームルーティングを処理します。 |
adapter_hook.dll | RvControlSvc.exe と一緒にロードされるコンパニオン DLL。IAT フック: TAP アダプタを Radmin が期待する名前に変更し、RegSetKeySecurity を no-op にして、サービスが SYSTEM SID を持たない Wine SCM のバグを回避します。 |
tap_bridge | ネイティブ Linux バイナリ。TAP デバイスと、Wine ドライバが読み書きする名前付きパイプ(FIFO)との間でイーサネットフレームを中継します。 |
netsh.exe / netsh64.exe | Wine の netsh スタブを置き換えます(32ビットは SysWOW64、64ビットは System32)。Windows の netsh interface ip コマンドを、ファイルベースのリレーを介して Linux の ip addr/ip link コマンドに変換し、アドレスが root リレーに到達する前に検証します。 |
rvpn_launcher.exe | CreateRemoteThread + LoadLibrary を介して adapter_hook.dll を Radmin サービスプロセスにインジェクションします。 |
drvinst.exe | Radmin の実際の NDIS ドライバインストーラを置き換える no-op スタブ。Radmin は実行時に NetMP60_1_1_64.sys をロードするためにこれを実行しますが、これは NdisInitializeReadWriteLock を介して Wine 11.x を異常終了させます(issue #12)。当社のドライバがすでにそのアダプタを置き換えているため、実際のドライバをロードしてはなりません。 |
rvpn_dnsfix.so | ネイティブ LD_PRELOAD shim。サービスの起動時のみにインジェクションされます。glibc 層でプライベート IPv4/IPv6 の逆引き DNS(getnameinfo/gethostbyaddr)をショートサーキットします。Radmin は収集したすべてのローカル候補アドレスを PTR 解決します。リゾルバが RFC1918 PTR クエリをブラックホールするホストでは、数分間停止し、サービスは登録されても ready になりません(issue #16)。ルックアップは Wine の Unix 側から発行されるため、adapter_hook.dll 内のフックでは到達できません。 |
rvpn_filter_ui | ブリッジを通過するパケットを検査およびフィルタリングするためのオプションの GTK4 UI。デフォルトではオフ。--filter-ui で起動。 |
トラブルシューティング
GUI が「Waiting for adapter」で停止する: ドライバがロードされていません。/tmp/radmin_driver.log が存在し、内容があることを確認してください。空の場合は、ドライバサービスの登録が欠けている可能性があります — wineprefix を削除して再実行してください。
「Registered」のまま「ready」にならない: サービスは Registered as #… まで到達してそこで停止します。既知の原因は2つあり、どちらもタイムアウト時に出力される診断ブロックで報告されます。(a) 独自のルーティングポリシーを持つ透過プロキシやトンネル(sing-box、clash/mihomo、v2ray…)が外部接続を横取りしている — このようなスタックは TCP ハンドシェイクにローカルで応答するため、ソケットは ESTABLISHED と読み取られる一方で、何も中継されません。そのルートから 26.0.0.0/8 を除外し、直接到達できる場合は *.radminte.com も除外してください。(b) プライベートアドレスの逆引きをブラックホールするリゾルバ(172.17.0.1 の docker0 がよくある引き金です)。rvpn_dnsfix.so はこれを処理しますが、これは64ビットの shim です。old-wow64 としてビルドされたシステム Wine はこれを無視します。その場合の回避策 — アドレスの行を /etc/hosts に追加するか、contrib/run-in-netns.sh を使用します(これによりサービスは「ready」になりますが、VPN は名前空間内に保持されます。ホストアプリケーションは 26.0.0.0/8 に到達できません。ヘッダーの警告を読んでください)。
サービスがすぐに停止する: Wine エラーがないか /tmp/radmin_service.log を確認してください。よくある原因: 異なる Wine バージョン由来の古い wineprefix。./wineprefix/ を削除して再実行してください。
ピアが1台の場合はパケットロス0%、多数の場合は高いロス: これが元のバグでした — ドライバの MAC ベースのフレームルーティングで修正済みです。最新ビルドを使用していることを確認してください。
最初の ping が遅い(約1秒): 最新バージョンは、ドライバが参照するすべての IP パケットの MAC アドレスをキャッシュします。ターゲット IP がドライバ実行中に少なくとも1つのパケットを送信していれば、MAC はすでにキャッシュされており、ARP 遅延はゼロです。完全に沈黙しているピア(パケットを一度も送信していないピア)だけが、最初の ARP 解決を必要とし、約1秒追加されます。
LAN ゲームが他のピアを認識しない / 「自動検出」が機能しない: ほとんどの LAN ゲームはブロードキャストプローブ(255.255.255.255 への UDP)またはマルチキャスト(224.0.0.0/4)でお互いを検出します。Windows では Radmin TAP ドライバがこれらのフローの優先インターフェースとして自らを宣伝しますが、Linux ではカーネルに明示的に伝える必要があります。run.sh は VPN が起動したときに2つの追加ルートをインストールするようになりました:
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 が終了時にデバイスを破棄すると自動的に削除されます。
既知の制限事項
- 同時に実行できるのは1インスタンスのみ(
/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 リリースで upstream で修正される可能性があります。
クレジット
リバースエンジニアリングと Wine shim: @baptisterajaut。
- @ayozetr — 「Registered のまま ready にならない」ハングを、ホストのリゾルバによってブラックホールされるプライベートアドレスの逆引き DNS にまで追跡し、4つの誤った仮説(私のものも含む)が破棄された後、ベア libc の再現でそれを証明し、
src/rvpn_dnsfix.cとcontrib/run-in-netns.shのオリジナルを書きました。 - @gringoestrangeiro — Linux 安定性の作業: パケットフィルタ、ARP キャッシュ、クラッシュリカバリ、ヘッドレスモードとデータセンターモード。
- @yuxiaole-bili — Wine の SCM が、フックされていない2つ目のサービスインスタンスを自動起動し、それがインジェクションされたインスタンスとアダプタをめぐって競合することを発見。
- @D1spell-tech、@Milkiway13、そして完全な診断ブロックを貼り付けてくれたすべての人 — バグを発見可能にするのは2つの独立したホストです。
ライセンス
GPL-3.0。LICENSE を参照してください。
趣旨としては、このコードはパブリックドメインです — 好きなように使ってください。GPL は法的なセーフティネットとしてここにあります。これは、相互運用性のためのリバースエンジニアリングを明示的に保護するものであり、このプロジェクトが行っていることです。二重の備えです。
Radmin VPN は Famatech Corp. によるプロプライエタリソフトウェアです。このプロジェクトは相互運用ツールのみを提供します — Famatech のコードは含まれておらず、配布もされません。