VPN経由で眠った自宅PCを起こす:パケットはどこから来るのか
トンネルは自分が終端するマシンを起こせない。magic packet を自宅LANに置き、アダプターと電源状態を確認してから接続する。
接続するとルーターが応答し、デスクトップは暗いままです。トンネルは正常で、マシンを起こすはずだったパケットは、マシンが待ち受けているセグメントに届いていません。ルーターから逆に経路をたどると、どこで途切れるかが見えます。
三つの機器に三つの役割があります。これを混同することが、起動の試みが永遠にループする通常の理由です。
リモートクライアントから始めて経路をたどる
ホテルのネットワークから、図の中で唯一常時稼働している端点である自宅ルーターに接続します。ノートPCで入力した起動要求は通常のトンネル通信になり、指定した宛先に送られます。その宛先が、その後のすべてを決めます。
自宅ルーターのLANアドレスの magic-packet ポートに送った場合、ルーターはデータグラムを受け取っても、そこにはそのポートを待ち受けているものがないため、自宅セグメントにフレームを出すことはありません。トンネルの中でブロードキャストすると、トンネルインターフェースで止まります。ルーティングされたトンネルは家の配線のレイヤー2拡張ではありません。経路をホップごとにたどれば、行き止まりは明らかになります。
これを決着させる確認には、遠隔側からのコマンドが一つと自宅側からのコマンドが一つ必要です。要求を送り、それから自宅セグメントでフレームを観察します。
送信元を自宅セグメントへ移す
トンネル経由で認証が済めば、ルーター自身が起動を行えます。OpenWrt はデバイス上で動作しフレームをローカルに送出する Wake-on-LAN サービスを文書化しており、これは外では遠隔認証、内側ではローカルブロードキャストという、まさに必要な形です。
この構成は起動機能を公開インターネットから遠ざけます。すでに信頼しているVPNに乗ってトリガーが流れるため、インターネットに新たに公開されるものはありません。代替案であるポート転送による起動サービスは、小さな利便性と引き換えに、誰でも探れるインターネット向きの端点を晒します。
循環依存は率直に名指しする価値があります。デスクトップにインストールしたVPNクライアントは、クライアントのプロセスにはマシンが動いている必要があるため、そのデスクトップを起こせません。遠隔の入口はルーターか、別の常時稼働する箱に置き、デスクトップはあくまで標的にしてください。
トンネルを責める前に標的を確認する
この部分を決めるのはVPNではなくハードウェアで、しかも電源状態が先に決めます。アダプターが起動をサポートし、ファームウェアがスリープ中もアダプターに給電し、OSがそれを許可するよう設定されている必要があります。中断状態のマシンは電源を切ったマシンとは別のケースで、どちらも壁の電源を切ったマシンとは異なります。一覧の残りに取りかかる前に、この状態を決着させてください。
実際にフレームを受け取るアダプターからハードウェアアドレスを読み取ります。Ethernet と Wi-Fi の両方を持つデスクトップにはアドレスが二つあることが多く、そのうち片方だけが起動に対応しているかもしれません。無線での起動は独自のファームウェア要件を持つ別の機能なので、Ethernet での起動が動いても Wi-Fi での起動については何も言えません。
まずローカルの経路を証明します。同じスイッチ上の別の機器から magic packet を送り、マシンが起動するのを見ます。これが失敗すれば、トンネルのデバッグをどれだけやっても役に立たず、障害はファームウェア、アダプター設定、電源状態のいずれかにあります。
復帰したら、目的のサービスに接続する
起動はリモートアクセスではありません。マシンが復帰しても、サービスを起動し、アドレスを取得し、本当に必要なセッションを受け入れる必要があります。起動が失敗したと結論づける前に、その状態に達する時間を与えてください。
# remote side: trigger the wake through the already-authenticated tunnel
ssh [email protected] 'wol -i br-lan 3c:7a:8f:2b:11:04'
# home side: is the target answering on the LAN?
ping -c 3 10.10.0.42
arp -n 10.10.0.42
arp の行が役に立ちます。未完了から実際のハードウェアアドレスに変わったエントリは、マシンが復帰して応答したことを意味し、決して解決しない要求は、到達しようとしていたサービスではなく、起動の段階を指し示します。
メモでは「起動、ブート、サービス」と段階を分けてください。第二段階の失敗は、チャット画面から見ると第一段階の失敗とまったく同じに見え、それを区別できるのはローカルの証拠だけです。