はじめに
外出先から自宅PCを使いたい場面が増えたが、単にリモートデスクトップを入れるだけでは「PCが落ちていると接続できない」という問題が残る。そこで本記事では、Raspberry Pi を常時稼働の入口(VPNの中継点)として自宅LANに設置し、外出先からVPN経由で自宅LANへ安全に入り、Raspberry Pi から Wake-on-LAN(WOL)を送信してPCを遠隔起動する構成を作る。
ポイントは、SSHやWeb管理画面をインターネットに直接公開せず、外部公開を最小限にしてLAN内の操作はVPN内からのみ行うことだ。なおWOLは「外から直接投げる」構成だとネットワーク要因でハマりやすいため、本記事では「Raspberry Pi がLAN内でWOLを送信する」方式を採用する。
VPN(WireGuard)の構築手順(鍵生成、ルータのポートマッピング、クライアント設定など)は別記事でまとめている。
本記事では「VPNで自宅LANに入れる状態ができている」ことを前提に、WOL側の手順に焦点を当てる。
使用機材・環境
ネットワーク機器
-
ルータ:NEC Aterm WG2600HS2
- 使用機能:ポートマッピング(ポート開放) / DHCP(固定 IP 割当・予約)
VPN サーバ(自宅側)
-
Raspberry Pi 3 Model B+
- 役割:VPNの入口(常時稼働) / WOL送信元
- 接続:有線 LAN
起動対象 PC(WOL 対象)
クライアント
- スマートフォン(WireGuardクライアント)
- 本記事ではiPhoneを使用
使用ソフト・パッケージ
-
WOL 送信:
wakeonlan(Raspberry Pi 上で実行) - VPN:WireGuard
ネットワーク構成
-
Raspberry Pi(WOL送信元) と 起動対象PC は 同一セグメント(同一ブロードキャストドメイン) 接続されていること(理由は次章で)
- 例:192.168.10.0/24 配下に両方が存在する(ブロードキャスト 192.168.10.255 を共有)
補足:機材の互換性について
本記事は「常時稼働ノード + VPN + WOL」という構成であり、記載の機材に限らず、以下が揃っていれば同様の手順で再現できる。
- VPNを動かせる常時稼働マシン(例:Raspberry Pi / mini PC / NAS / VPS など)
- 外部からVPNへ到達できるようにポート転送ができるルータ
- WOLに対応した有線接続のPC
ただし設定画面の名称・配置は機種により異なるため、本記事では自分の環境での画面遷移を例として示す。
前置き
Wake-on-LAN(WOL)とは?
Wake-on-LAN(WOL)は、ネットワーク経由で送信する Magic Packet を PC のネットワークインタフェース(NIC)が受信することで、PC を起動(または復帰)させる仕組みである。
PC が電源 OFF のように見える状態でも、NIC が待機電力(+5VSB)で最低限動作している場合に成立する。
本記事で扱う WOL は、自宅 LAN 内から Magic Packet を送信して PC を起動することを目的とする。LAN 内での動作イメージは以下の通りである。
- Magic Packet は UDP で送信されることが多く、同一セグメント内ではブロードキャストとして LAN 全体に配送
- ただし起動するのは、パケット内に含まれる MAC アドレスが一致した PC のみ
Magic Packet 自体は「特殊なパケット種別」ではなく、NIC が検出できる 決まったバイト列を持つデータである。一般的な形式は以下で、先頭に FF を 6 バイト、その後に起動対象の MAC アドレスを 16 回繰り返したデータ列を送る。
-
FF× 6 bytes - 起動対象 MAC(6 bytes)× 16 回
(任意)SecureOn などの追加要素がある実装もあるが、基本は上記で成立する
ここで重要なのは、WOL が「どこからでも」成立するわけではない点である。WOL は主に 同一 LAN(同一セグメント)内での利用を想定しており、Magic Packet(ブロードキャスト)は通常 ルータ(L3境界)を越えて転送されない。
そのため、起動対象 PC が別セグメント(VLAN/ゲスト Wi-Fi など)にいる場合、同じ Raspberry Pi から Magic Packet を送信しても、ブロードキャスト配送の制約により 届かず失敗しやすい。
さらに、WOL は 認証を伴わない仕組みであり、WOL 用の送信口(Web/API/UDP 等)をインターネットへ公開すると攻撃面が増える。そこで本記事では、外部公開を避けつつ安全に操作するために VPN 経由で自宅ネットワークへ接続し、自宅 LAN 内の Raspberry Pi から WOL を実行する方式を採用する。
以降では、この構成を前提に、Raspberry Pi 上で wakeonlan を用いて Magic Packet を送信し、外出先から PC を起動できるように設定していく。
手順
PC:BIOS設定
- PC起動時に
Deleteキーを連打して BIOS を開く -
ErP Ready を無効化(WOLのために待機電力を確保する)
Advanced Mode → ErP Ready = Disabled
-
PCI-E からの復帰を有効化(NICはPCI-Eデバイス扱いのため)
Settings → Advanced → Wake Up Event Setup → Resume By PCI-E Device = Enabled
- 保存して再起動
補足:シャットダウン(S5)からの WOL は省電力設定の影響を受けやすい。
PC:有線NIC(Realtek)のWOL設定
-
デバイスマネージャ → ネットワーク アダプターを開いて対象NICのプロパティを開く
この環境では Realtek PCIe GbE Family Controller #3 が有線NIC

-
詳細設定から以下の項目を設定する
PC:MACアドレスを控える
PowerShellでMACアドレスを確認する。
Get-NetAdapter | Select-Object Name, Status, MacAddress, LinkSpeed
出力例
Name Status MacAddress LinkSpeed
---- ------ ---------- ---------
VPN - VPN Client Disconnected XX-XX-XX-XX-XX-XX 100 Mbps
VPN2 - VPN Client Disconnected XX-XX-XX-XX-XX-XX 100 Mbps
VirtualBox-Ethernet Up XX-XX-XX-XX-XX-XX 1 Gbps
Bluetooth ネットワーク接続 Disconnected XX-XX-XX-XX-XX-XX 3 Mbps
Default-Ethernet Up AA-BB-CC-DD-EE-FF 1 Gbps
WOLで使うのは「起動対象PCの有線NIC(物理Ethernet)のMACアドレス」である。
この出力では、Status=Up かつ LinkSpeed=1 Gbps になっている Default-Ethernet が物理の有線NICなので、MACアドレス の AA-BB-CC-DD-EE-FF をメモしておく。
ラズパイ:LAN内でWOL送信して起動確認
ラズパイのセットアップ
自分は以下のサイトを参考に、Raspberry Pi OSの初期セットアップ(SSH有効化・ネットワーク接続など)を行った。
セットアップ手順自体は他にも多数記事があるため、本記事では詳細は省く。
起動テスト
-
wakeonlanをインストールするsudo apt update && sudo apt upgrade sudo apt install -y wakeonlan - PCをシャットダウン(S5)させる
- Raspberry PiからWOL(Magic Packet)を送信する
Windowsで控えたMACアドレスがAA-BB-CC-DD-EE-FFのように ハイフン区切りだったので、AA:BB:CC:DD:EE:FFのように コロン区切りに変換して実行するwakeonlan AA:BB:CC:DD:EE:FF - PCが起動したことを確認する
PCの電源が入ればLAN内WOLは成功である。
ここで起動できない場合は、MACアドレス(有線NICのものか)、PC側のErP/高速スタートアップ、NICのWOL設定を優先して見直す。
VPNについて
外出先から自宅LANへ安全に入るためにVPNを使う。VPN方式は何でもよく、要件は「外出先端末が自宅LANに参加でき、Raspberry Pi に到達できる」ことだけである。
なお自分の環境では WireGuard でVPNを構築した。構築手順の一例として以下にまとめている(本記事はWOL側に集中するため、VPN手順の詳細は割愛する)。
以降の手順は、外出先端末がVPN接続できる状態を前提に進める。
Web ダッシュボード化
ここまでで、Raspberry Pi から自宅 LAN 内に Magic Packet を送れば PC を起動できること、そして外出先からは VPN 経由で安全に自宅 LAN へ入れることを確認した。
ただ、このままだと普段使いでは毎回 SSH で Raspberry Pi に入り、wakeonlan コマンドを打つ必要があり少し面倒である。
そこで、自分は VPN 接続後にブラウザから操作できる Web アプリ を作成した。
GitHub / デモ動画
GitHub
実装コードは以下に公開している。
デモ動画
作った Web アプリでできること
このアプリでは主に以下のことができる。
- PC 一覧の表示、登録、更新、削除
- Web 画面からの WOL 実行
- PC の起動状態の更新
- 操作ログの確認
- 稼働時間の可視化
- API トークンによる認証
つまり、単なる「WOL ボタン」ではなく、自宅 PC 管理用の小さなコントロールパネル のようなものを目指した。
システム構成図
全体の構成は以下の通りである。
この構成では、nginx がフロントエンド配信と API のリバースプロキシを担当し、FastAPI が WOL 実行や状態更新、SQLite が設定やログの保存を担当している。
Raspberry Pi は常時稼働ノードとしてこれらをまとめて動かす役割を持つ。
技術スタック
使用した技術スタックは以下の通りである。
- Frontend: React + Vite + TypeScript
- Backend: FastAPI(Python)
- Database: SQLite
- Infrastructure: Raspberry Pi 3 / nginx / WireGuard
実装で意識したポイント
1. WOL を「押したら終わり」にしなかった
WOL はボタンを押して終わりではなく、
- Magic Packet の送信に成功したか
- 送信後に本当に起動したか
- まだ起動中なのか
- 到達不能なのか
といった途中状態がある。
そのため、このアプリでは WOL をジョブとして受け付けるようにし、送信後はいったん booting として扱い、一定間隔で起動確認を行うようにした。
これにより、画面上で「今どういう段階か」を追えるようになり、単なる送信ボタンではなく実際に使いやすい UI にできた。
2. WOL は VPN 側ではなく LAN 側から送る
今回の構成でも重要なのは、WOL 自体は Raspberry Pi の LAN 側から送る という点である。
VPN はあくまで「外から安全に自宅 LAN に入るための入口」であり、Magic Packet を送る場所そのものは LAN 内である。
この切り分けを明確にすることで、WOL の届きにくさや構成のややこしさを避けている。
3. Web 管理画面も直接公開しない
このアプリは便利ではあるが、インターネットにそのまま公開するつもりはない。
WOL は認証付きの強固な仕組みではないため、公開面を増やしすぎると管理が難しくなるからだ。
そのため運用方針としては、
- 管理画面は VPN 内アクセス前提
- API は Bearer トークンで認証
- 必要に応じて管理用トークンと通常利用用トークンを分ける
という形にしている。
UI の方針
UI は「外出先のスマホから使う」ことをかなり意識した。
PC 版では一覧とログを見やすくし、モバイル版ではタップしやすさを優先している。
特にやりたかったのは、
- 外からスマホで VPN 接続
- ブラウザで画面を開く
- 起動したい PC を選ぶ
- WOL を送る
-
booting→onlineになるのを確認する - その後にリモートデスクトップで接続する
という一連の流れを、コマンド無しで完結できるようにすること であった。
デプロイと運用
運用は Raspberry Pi 上で行っているが、Raspberry Pi 3 はそれほど高性能ではないため、重い処理を全部 Pi に寄せないようにした。
- フロントエンドの build は手元 PC 側で実行
- 生成した成果物だけを Raspberry Pi に配布
- バックエンドは Raspberry Pi 上で systemd 管理
- nginx で静的配信と API のリバースプロキシを担当
という形にしている。
また、OS 側でも公開範囲を絞るためにファイアウォールを設定し、HTTP や SSH は LAN / VPN からのアクセスに限定している。
実際の使い方
普段の使い方はかなり単純である。
- スマホから WireGuard で自宅 VPN に接続する
- ブラウザで Web ダッシュボードを開く
- 起動したい PC の WOL ボタンを押す
- ステータスが
bootingからonlineになるのを確認する - リモートデスクトップなどで接続する
これで、外出先からでも「まず PC の電源を入れる」という最初の壁をかなり楽に超えられるようになった。
まとめ
今回やりたかったのは、単に WOL を成功させることではなく、外から安全に、迷わず、自宅 PC を起動できる仕組みを作ること であった。
- WOL は LAN 内から送る
- 外からは VPN 経由で入る
- 操作は Web ダッシュボードにまとめる
- 管理画面は直接公開しない
という形にすることで、仕組みとしても運用としても扱いやすい構成になったと思う。
今後は、起動確認や通知の改善を進めつつ、外出先からの PC 利用をよりスムーズにする機能も追加していきたい。
また、codexを積極的に使いながら開発したため、UI部分が生成AI特有のデザインとなってしまったので、修正したい。







