RaspberryPiを使ってWake on Wireless LANっぽいことをする

概要

有線接続できないパソコンを、RaspberryPiを使ってWake on LAN(WoL)で起動してリモートデスクトップ接続します。

背景

こちらの記事の派生です。

せっかくVPNを設置したので、外出先からパソコンを起動してリモートデスクトップ接続します。
私の環境ではパソコンはWifiでLANに接続しているので、Wake on Wireless LAN (WoWLAN) で起動させないといけないのですが、試したところあまり安定しなかったので、余っていたRaspberryPiとパソコンを直接LANケーブルで繋いでRaspberryPiからWoLのマジックパケットを投げることにしました。

やりかた

RaspberryPiとパソコンを直結する

WoWLANも可能なパソコンのはずなのですが安定しませんでした。
有線ポートが空いているので、RaspberryPiとパソコンを直接LANケーブルで繋いで常時起動させているRaspberryPiからWoLさせます。

RaspberryPi3くらいであればパソコンのUSB給電でも動きます。

クソダサ構成

中継器を買う財力のある方は買ったほうがいいと思います。

中継器買いました。

Wake On Lanを有効にする

マザーボード側とOS側で設定する必要があります。

お使いのBIOSによりけりですが、大概、詳細設定モード(Advanced mode)のAPM Configurationとかにあります。
私の使っているマザーボードでは[Power On By PCI-E]という名前でありました。

PCI-EはPCI-Expressという接続規格のことです。オンボードのLANポートって内部的にはPCI-Eで繋がってるんでしょうか。

OS(Windows)での設定は、NICのドライバでWoLを有効にする、高速スタートアップを無効にする、の2つです。

デバイスマネージャを開き、[ネットワークアダプター]配下のNICを選択します。

[詳細設定]タブの[Wake On Magic Packet]を[有効]にします。

[コントロールパネル]を開きます。[システムとセキュリティ]をクリックします。

Windows 8以降になって従来のコントロールパネルがどこにいったかわからなくなった方向けの小ネタです。[ファイル名を指定して実行]で”control”と入力すると呼び出せます。

[電源ボタンの動作の変更]をクリックします。

[現在利用可能ではない設定を変更します]をクリックします。

[高速スタートアップを有効にする]のチェックを外します。

RaspberryPiからWoLのマジックパケットを送る

RaspberryPiの初期設定については省略します。
WifiでLANに接続しており、SSHで繋げられ、常時起動していることを前提とします。(外出時だけ起動するでもいいですがラズパイの電気代はたかがしれているのでそのうち常時起動になると思います)

今回の構成ではパソコンとRaspberryPiを直結させているので、有線で通信できるように固定IPを設定します。

まずWindowsの方から設定します。
コントロールパネルを開き、[ネットワークとインターネット]をクリックします。

[ネットワークと共有センター]をクリックします。

[アダプターの設定の変更]をクリックします。

RaspberryPiと繋がっているNICをダブルクリックします。

[プロパティ]をクリックします。

[インターネットプロトコル バージョン4]をダブルクリックします。

[次のIPアドレスを使う]を選択し、LAN内で使われていない適当なレンジのIPを振ります。
デフォルトゲートウェイは設定しないほうがいいです。DNSも使わないので空白で大丈夫です。

[OK]で設定を保存したら、ついでにMACアドレスも調べておきます。
[詳細]をクリックします。

[物理アドレス]と書かれている行の値がWoLの時に使用するMACアドレスです。

次はRaspberryPiで設定します。

/etc/dhcpcd.conf を編集することでIPアドレスの設定をします。
viなどでdhcpcd.confを開き、eth0にパソコンに設定したIPアドレスと同じネットワークのIPアドレスを振ります。

interface eth0
static ip_address=192.168.200.2/24

これでパソコンとRaspberryPiで192.168.200.0/24のネットワークで通信できるようになりました。

RaspberryPi用のOSにはだいたいPythonが付属しているので、WoLはPythonで行ないます。適当なツールをダウンロードしてきても大丈夫です。

ホームディレクトリなどに次のファイルを配置します。
“MACADDR”は先手順で調べたパソコンのMACアドレス、BCADDRはWoL用ネットワークのブロードキャストアドレスを設定します。

import socket
import binascii
 
MACADDR = 'AA:BB:CC:11:22:33'
BCADDR = '192.168.200.255'
PORT = 7
 
macstr = ''.join(MACADDR.split(':'))
magicp = 'FF' * 6 + macstr * 16
magicp = binascii.unhexlify(magicp)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 
sock.sendto(magicp, (BCADDR, PORT))
sock.close()

動作確認

外出先から手持ちのスマートフォン(Android)でリモートデスクトップ接続することを想定しているので、スマートフォンに必要なアプリをインストールします。
OpenVPNクライアント、SSHクライアント、RemoteDesktopの役割をこなせるものであれば、紹介するもの以外を使っていただいて問題ありません。

OpenVPN Connect – OpenVPN App - Google Play のアプリ
Access Server、OpenVPN Cloud、および OpenVPN 対応サービスの公式アプリ。
ConnectBot - Google Play のアプリ
シンプルでパワフルなオープンソースのSSHクライアント
Remote Desktop - Google Play のアプリ
リモート デスクトップを使用すると、リモート PC とアプリに接続できます。

VPN接続した後、SSHクライアントでRaspberryPiにログインします。
ホームディレクトリに配置したwol.pyを実行してパソコンを起動します。
Remote Desktopアプリでパソコン接続できれば完了です。

おまけ

Microsoft純正のRemote Desktopは入力を直接パソコンに送ってくれないので、物理キーボードを使っての操作はしにくいです。私は物理キーボードを使う場合は下のアプリ、仮想マウス等で十分な場合はMicrosoft純正のRemote Desktopアプリを使っています。

aRDP: Secure RDP Client - Google Play のアプリ
SSHを使用したWindowsおよびLinux用の安全で高速なオープンソースのリモートデスクトップクライアント

コメント