外出先から自宅PCを使いたくても、PCを常時起動したままにはしたくありませんでした。僕が使ったPCでは、スリープさせるとWindows上のTailscaleも止まりました。PC自身のTailscale IPへ接続して、自分を起こさせることはできません。
そこで、同じ自宅LANで起動し続けるAndroid端末を中継役にしました。外出先のスマホからAndroidまではTailscaleで到達し、最後はWake on LANのマジックパケットをPCのネットワークアダプターへ届けます。
「Tailscaleでスリープ中PCを起こす構成を、通信経路から順に整理する」では、通信経路、スリープ中の役割分担、Androidの運用確認を一つのスレッドにまとめました。この記事では、構成を分けた理由と実際の確認順を扱います。
まず全体像
スリープ中のPCはTailscaleで接続できない
最初に整理したのは、スリープ中にどの部分が動けるかです。TailscaleはWindows上のプロセスなので、OSとアプリの実行が止まるスリープ状態では新しい通信へ応答できません。
一方、Wake on LANに対応したネットワークアダプターは、対応する低電力状態でもマジックパケットを監視できます。パケットを検知するとPCへ復帰を要求します。
停止したアプリと、低電力で待機するハードウェアを分ける必要がありました。
ただし、WoLが使える電源状態はPCごとに異なります。確認する条件は次のとおりです。
- ネットワークアダプターとドライバー
- UEFIとWindowsの電源設定
- 有線または無線の接続方法
僕の構成をそのまま前提にせず、対象PCがLAN内からのWoLで起動できるところを最初に確認します。
常時起動するAndroidを中継に使う
自宅LAN側には、外から到達できて、PCへWoLを送れる起動中の端末が必要です。Raspberry PiやNASも候補になりますが、僕は手元にあった使っていないAndroid端末を使いました。
Android版TailscaleにはSubnet Routerとして経路を知らせる機能があります。Androidを自宅LANへ接続し、TailscaleアプリからLANのアドレス範囲を知らせます。このIPアドレス範囲の表記をCIDRと呼びます。その後、管理画面側で経路を承認します。
次は、実在しない説明用の値です。実際には、自宅LANの範囲と対象機器のMACアドレスを確認して設定します。
広告するLAN範囲:192.168.50.0/24
WoL対象のMAC :02:00:00:00:00:01
IPアドレスには、一般的なプライベートアドレスの一例を置いています。WoLアプリには、対象PCのWake on LAN対応ネットワークアダプターのMACアドレスを設定します。LAN側の宛先は構成に応じて設定します。
IPの経路とWoLの到達を同じものにしない
Subnet Routerは、広告したIP範囲への経路を作ります。Wake on LANでよく使われるUDPブロードキャストは、同じLAN内のネットワークアダプターへマジックパケットを届けるための処理です。
二つの場所を一つのEthernet LANとしてつなぐ機能ではないため、サブネット経路が有効になっただけで「ブロードキャストも必ず届く」とは判断しません。
外出先のスマホからWoLアプリを操作し、Tailscaleへ接続したAndroidを経由するとPCが起動しました。ただし、Android版TailscaleとWoLアプリの内部で、通信がどの処理を経てLAN側へ送られたかまでは確認していません。
そのため、ここでは「Subnet RouterならWoLブロードキャストを透過転送する」と一般化しません。観測できたのは、この端末とアプリの組み合わせで最終的にPCが起動したことです。
動作確認を段階に分ける
一度に外出先から試すと、どこで止まったか分かりません。僕は確認対象を次の順に分けます。
1. PC単体のWoLを確認する
まず、同じLANにいる別の起動中端末からマジックパケットを送り、PCがスリープから起動するかを確認します。ここで失敗するなら、TailscaleやAndroidを加える前に、PC側のWoL設定を見直します。
Windowsでは、利用できるスリープ状態を次のコマンドで確認できます。
powercfg /a
ネットワークアダプターが復帰を許可されているかは、次のコマンドで確認します。
powercfg /devicequery wake_armed
二つのコマンドで、利用可能なスリープ状態と復帰を許可されたデバイスを別々に確認できます。
2. Androidのサブネット経路を確認する
次にAndroidをTailscaleへ接続し、サブネット経路を広告します。管理画面で経路を承認します。
その後、外出先側のTailscale端末から到達性を確かめます。Android自身だけでなく、広告したLAN内の機器まで接続できるかを確認します。
ここではWoLをまだ合否に使いません。TailscaleからLANまでのIP経路が成立しているかだけを見ます。
3. WoL操作からPC起動までを確認する
経路を確認した後、PCをスリープさせます。外出先のスマホからWoLアプリを操作し、PCのネットワークアダプターがマジックパケットを受け取って起動するかを見ます。
PCが起動した後は、PC上のTailscaleが再接続し、目的のサービスへ到達できるところまで確認します。WoL成功と、その後の遠隔利用成功も別の段階です。
4. 画面消灯後と再起動後を確認する
Androidは画面を消すと、省電力機能であるDozeやApp StandbyによってバックグラウンドのCPU処理とネットワーク利用を制限する場合があります。端末メーカー独自の省電力制御もあります。
そのため、設定直後に一度成功しただけでは常時中継できると判断できません。設定画面の名前はOS版とメーカーで変わるため、動作結果を合格条件にします。
画面を消して時間を置いた後に同じ操作を繰り返します。失敗した場合は、次の順に確認します。
- Wi-Fi接続
- Tailscale接続
- 省電力設定の対象
- TailscaleとWoLアプリの状態
Androidを再起動した後も、利用可能な状態へ戻るかを試します。
この構成に残る制約
Androidが停止すれば、外出先から自宅LANへ接続できなくなります。確認する条件は次のとおりです。
- Androidの充電とWi-Fi接続
- OS更新とTailscaleの認証状態
- TailscaleとWoLアプリのバックグラウンド制限
AndroidをSubnet Routerとして動かすことはバッテリー消費にも影響します。Tailscaleの公式資料では、電源へ接続して使うAndroid TVなどを主な用途として挙げています。
この結果は当時の構成で観測したものです。AndroidやTailscaleのバージョンが変わると設定や挙動が変わる可能性があるため、特定バージョンの手順としては扱いません。
また、WoLのマジックパケット自体はPCへのログインを代行しません。PCが起動した後の認証、Tailscaleのアクセス制御、OSやアプリの更新は別に必要です。
この構成では、外出先から自宅LANへ接続する常時起動端末と、必要なときだけ起動する作業用PCを分けます。
まとめ
スリープ中のPCではTailscaleが応答できないため、PC自身にはTailscale経由で接続できません。僕は自宅LANで起動し続けるAndroidへTailscaleのサブネット経路を持たせ、外出先の操作からWoLでPCを起動する構成にしました。
確認は、PC単体のWoL、Androidのサブネット経路、外出先からのPC起動、画面消灯後と再起動後の維持に分けます。外出先からの操作でPCが起動するところまでは確認しましたが、Android内部の転送方式までは未確認です。その範囲を分けることで、観測した成功を無条件な仕組みの説明へ広げないようにしました。