3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【外出先から自宅PC起動】Wake on LANで自宅PCを起動する仕組みを Raspberry Pi 3 上に作った

3
Posted at

はじめに

外出先から自宅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

IMG_7512.png

起動対象 PC(WOL 対象)

  • マザーボード:MSI B450 GAMING PLUS MAX

    • OS:Windows
    • 接続有線 LAN

    380.png

クライアント

  • スマートフォン(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 のみ

raspi-wol - WOL1.jpg

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 を送信しても、ブロードキャスト配送の制約により 届かず失敗しやすい

raspi-wol - WOL2.jpg

さらに、WOL は 認証を伴わない仕組みであり、WOL 用の送信口(Web/API/UDP 等)をインターネットへ公開すると攻撃面が増える。そこで本記事では、外部公開を避けつつ安全に操作するために VPN 経由で自宅ネットワークへ接続し、自宅 LAN 内の Raspberry Pi から WOL を実行する方式を採用する。

以降では、この構成を前提に、Raspberry Pi 上で wakeonlan を用いて Magic Packet を送信し、外出先から PC を起動できるように設定していく。

手順

PC:BIOS設定

  1. PC起動時に Delete キーを連打して BIOS を開く
  2. ErP Ready を無効化(WOLのために待機電力を確保する)
    Advanced Mode → ErP Ready = Disabled
    MSI_SnapShot - コピー.png
  3. PCI-E からの復帰を有効化(NICはPCI-Eデバイス扱いのため)
    Settings → Advanced → Wake Up Event Setup → Resume By PCI-E Device = Enabled
    MSI_SnapShot_00 - コピー.png
  4. 保存して再起動

補足:シャットダウン(S5)からの WOL は省電力設定の影響を受けやすい。

PC:有線NIC(Realtek)のWOL設定

  1. デバイスマネージャ → ネットワーク アダプター を開いて対象NICのプロパティを開く
    この環境では Realtek PCIe GbE Family Controller #3 が有線NIC
    image.png

  2. 詳細設定から以下の項目を設定する

    • Shutdown Wake-On-Lan:Enabled
    • Wake on Magic Packet:Enabled
    • Wake on pattern match:Disabled
      image.png
  3. 電源の管理から画像の通りにチェックをつける
    image.png

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有効化・ネットワーク接続など)を行った。
セットアップ手順自体は他にも多数記事があるため、本記事では詳細は省く。

起動テスト

  1. wakeonlan をインストールする
    sudo apt update && sudo apt upgrade
    sudo apt install -y wakeonlan
    
  2. PCをシャットダウン(S5)させる
  3. 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
    
  4. 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 管理用の小さなコントロールパネル のようなものを目指した。

システム構成図

全体の構成は以下の通りである。

raspi-wol - システム構成図.jpg

この構成では、nginx がフロントエンド配信と API のリバースプロキシを担当し、FastAPI が WOL 実行や状態更新、SQLite が設定やログの保存を担当している。
Raspberry Pi は常時稼働ノードとしてこれらをまとめて動かす役割を持つ。

技術スタック

使用した技術スタックは以下の通りである。

raspi-wol - 技術スタック.jpg

  • 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 を送る
  • bootingonline になるのを確認する
  • その後にリモートデスクトップで接続する

という一連の流れを、コマンド無しで完結できるようにすること であった。

デプロイと運用

運用は Raspberry Pi 上で行っているが、Raspberry Pi 3 はそれほど高性能ではないため、重い処理を全部 Pi に寄せないようにした。

  • フロントエンドの build は手元 PC 側で実行
  • 生成した成果物だけを Raspberry Pi に配布
  • バックエンドは Raspberry Pi 上で systemd 管理
  • nginx で静的配信と API のリバースプロキシを担当

という形にしている。

また、OS 側でも公開範囲を絞るためにファイアウォールを設定し、HTTP や SSH は LAN / VPN からのアクセスに限定している。

実際の使い方

普段の使い方はかなり単純である。

  1. スマホから WireGuard で自宅 VPN に接続する
  2. ブラウザで Web ダッシュボードを開く
  3. 起動したい PC の WOL ボタンを押す
  4. ステータスが booting から online になるのを確認する
  5. リモートデスクトップなどで接続する

これで、外出先からでも「まず PC の電源を入れる」という最初の壁をかなり楽に超えられるようになった。

まとめ

今回やりたかったのは、単に WOL を成功させることではなく、外から安全に、迷わず、自宅 PC を起動できる仕組みを作ること であった。

  • WOL は LAN 内から送る
  • 外からは VPN 経由で入る
  • 操作は Web ダッシュボードにまとめる
  • 管理画面は直接公開しない

という形にすることで、仕組みとしても運用としても扱いやすい構成になったと思う。

今後は、起動確認や通知の改善を進めつつ、外出先からの PC 利用をよりスムーズにする機能も追加していきたい。
また、codexを積極的に使いながら開発したため、UI部分が生成AI特有のデザインとなってしまったので、修正したい。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?