Moonlight+Sunshineで作る高速リモートデスクトップ
Moonlight+Sunshineで作る高速リモートデスクトップ

今回は Moonlight(クライアント) と Sunshine(ホスト) を使ったリモートデスクトップ環境のセットアップについてまとめます。
Moonlight+Sunshine は、Chrome Remote Desktop などと比べて 高レスポンス で、Windowsはもちろん “Mac / Linux / Android” など 多くのプラットフォームに対応 しています。
一方で、インストールやペアリング、ネットワーク設定(ポート開放や UPnP など)が必要になるため、最初の導入は少し手間がかかります。
ただ、Windows から Linux へ快適にアクセスしたい用途では、かなり便利に使えます。
役割の整理:Moonlight がクライアント、Sunshine がホスト
- Moonlight:アクセスする側(クライアント)
- Sunshine:配信する側(ホスト)
クライアント側は基本的に「入れて繋ぐだけ」なので、まずはホスト側(Sunshine)のセットアップから説明します。
Sunshine(ホスト)を Linux に入れる
Sunshine は GitHub にバイナリ(リリース)が用意されています。
Windows は比較的簡単ですが、Linux 側は依存関係やサービス化で少し手間が出やすいです。
今回は Ubuntu 25.04 を使っています。
大まかな流れ
- GitHub の Release から Sunshine のビルドをダウンロード
- systemd のサービスセットアップ
- ブラウザから Web UI にアクセスして初期設定(ユーザー/パスワード、PIN確認)
- ファイアウォール(必要ならポート開放)
- クライアント(Moonlight)から接続・ペアリング
Sunshineのインストール
# 最新リリースのdebパッケージを取得(GitHub Releasesから)
wget https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-ubuntu-24.04-amd64.deb
# インストール
sudo apt install -y ./sunshine-ubuntu-24.04-amd64.deb
---s
Ubuntu 25.04での注意点(Flatpak周り)
インストールの方法としてflatpakが利用できますが 25.04 環境では、Flatpak での導入がうまくいかない ケースがありました。
そのため、自分の環境では 24.04 向けのバイナリ/依存パッケージ を利用して進めました。
※ここは環境差が出やすいので、エラーが出たらエラーメッセージを検索するか、AIツールに投げて解決していく前提で進めるのが現実的です。
インストールが完了したらsunshineコマンドで実行です。
依存ライブラリ/シンボリックリンクの注意
バージョンや環境によっては、ライブラリの参照(シンボリックリンク)がうまく解決されずに起動できないことがあります。
例として lib… 系(音声/映像/入力周り)のライブラリで引っかかることがありました。
この場合は、エラーに出たライブラリ名を手がかりに、
- 不足ライブラリのインストール
- 必要ならシンボリックリンクの作成
を行っていきます。
自分の場合は以下のライブラリの不足エラーが発生して基本的にはシンボリックリンクの作成で解決していきました。
# 入っているバージョンを確認
ldconfig -p | grep miniupnpc
#以下の内容が出力されました。
(base) PC-Name:~$ ldconfig -p | grep miniupnpc
libminiupnpc.so.18 (libc6,x86-64) => /lib/x86_64-linux-gnu/libminiupnpc.so.18
#シンボリックリンクを作成して迂回
sudo ln -s /lib/x86_64-linux-gnu/libminiupnpc.so.18 /lib/x86_64-linux-gnu/libminiupnpc.so.17
#Sunshineを起動
(base) PC-Name:~$ sunshine
sunshine: error while loading shared libraries: libicuuc.so.74: cannot open shared object file: No such file or directory
#同様にシンボリックリンクを作成して迂回
sudo ln -s /lib/x86_64-linux-gnu/libicuuc.so.76 /lib/x86_64-linux-gnu/libicuuc.so.74
#この`libicuuc.so.74`はシンボリックリンクでは解決しなかったので以下のようにICUパッケージを直接インストールしました。
# LaunchpadからDL
wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu74_74.2-1ubuntu4_amd64.deb
# インストール
sudo dpkg -i libicu74_74.2-1ubuntu4_amd64.deb
その他のエラーが出た場合は適宜調べてインストールしてください。
Sunshine の起動と Web UI へのアクセス
Sunshine が入ったら、起動します。
- Sunshine は(Flatpak版ではない場合)
sunshineコマンドで起動できます。
起動できたら、ブラウザで Web UI にアクセスします。
- Web UI(デフォルト):
https://localhost:47990
初回アクセスでは ユーザー名とパスワードの設定 が必要です。
これは「このホストの管理画面に入るため」の認証なので、適切に設定しておきます。
Moonlight(クライアント)を Windows に入れてペアリングする
次に Windows 側へ Moonlight をインストールします。
- Moonlight を起動すると、LAN 内の Sunshine ホストを 自動検出 することがあります
- 見つかったホストを選ぶ(見つからない場合は後述)
- PINコード が表示される
- Sunshine の Web UI 側で PIN を入力してペアリング完了

自動検出されない場合
検出されない場合は、次を疑います。
- 同一ネットワークにいない
- ルータ/セグメントの都合でブロードキャストが届かない
- ファイアウォールで遮断されている
- IP を直接指定する必要がある
この場合は、Moonlight 側で ホストのIPアドレスを直接指定 して追加します。
ファイアウォール(ポート開放)の確認
接続できない場合は、まずホスト側のファイアウォール状態を確認します。
- Linux 側:
ufwやfirewalldの設定確認 - Windows 側:同一LAN内の疎通確認(ping等)
必要であれば、Sunshine が使用するポートを許可します。
(どのポートを開けるかは Sunshine の設定やドキュメントに依存するので、自分の設定画面に表示されている値 を基準にします)
取り敢えず以下の関連ポートを解放して接続しました。
# 必要な関連ポートを開ける
sudo ufw allow 47984/tcp # HTTPS Web UI
sudo ufw allow 47989/tcp # HTTP Web UI
sudo ufw allow 47990/tcp # Web UI
sudo ufw allow 48010/tcp # RTSP
sudo ufw allow 48010/udp
sudo ufw allow 48000/udp # Video stream
sudo ufw allow 48002/udp # Audio stream
sudo ufw allow 47999/udp
sudo ufw allow 47998:48010/udp
sudo ufw allow 47984:47990/tcp
sudo ufw allow 5353/udp # mDNS
画質設定の目安(例)
手元環境では、ざっくり以下のあたりが扱いやすい印象でした。
- コーデック:H.265(環境対応しているなら)
- ビットレート:50〜80 Mbps 目安
ネットワーク品質や解像度によって最適値は変わるので、まずはこの辺から調整すると良いと思います。
Sunshine を自動起動(systemd)
運用するなら、Sunshine をサービス化して自動起動させるのがおすすめです。
(systemd サービスに登録して enable する)
ただし注意点があります。
注意:GUIセッションが準備できる前に起動するとコケることがある
Linux 環境では、グラフィックセッション(ログイン後の表示環境)が準備できる前に Sunshine が起動すると、
- モニター検出エラー
- 表示周りの初期化失敗
などが起きることがあります。
対策としては、
- ログイン後に起動されるように順序を制御する
- あるいは ユーザーセッション側で起動する(ログイン後に起動)
など、起動タイミングを調整します。
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/sunshine.service << 'EOF'
[Unit]
Description=Sunshine Game Stream Server
After=graphical-session.target
Wants=graphical-session.target
[Service]
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/sunshine
Restart=on-failure
RestartSec=10
[Install]
WantedBy=graphical-session.target
EOF
systemctl --user daemon-reload
systemctl --user enable sunshine
systemctl --user restart sunshine
さらに外から繋ぐなら:Tailscale(VPN)
外部ネットワークからアクセスしたい場合は、Tailscale を併用すると楽です。
Tailscale は Google アカウント等でログインでき、アカウントベースで VPN を張れるので以下のようなメリットがあります。
- ルータのポート開放を最小化できる
- 複数拠点から安全にアクセスしやすい
以下のコマンドでインストールしました。
# Tailscaleインストール
curl -fsSL https://tailscale.com/install.sh | sh
# 起動・ログイン
sudo tailscale up
#tailscaleのIPを確認。
tailscale ip -4
まとめ
- Moonlight+Sunshine は初期設定が少し手間だが、レスポンスが非常に良い
- まずは Sunshine(ホスト)側を固めて Web UI を開けるようにする
- Moonlight(クライアント)で PIN ペアリング
- 接続できない場合は「検出」「ファイアウォール」「ポート」「セグメント」を疑う
- systemd 自動起動は便利だが、GUIセッション前起動による不具合に注意
- 外部からの接続は Tailscale を使うと運用が楽になる