結論だけ先に
EdgeRouter には /usr/sbin/etherwake
というコマンドが入っているのでそれ使ったら送れる\(^o^)/
[追記 2021.01] EdgeOS 2.x だと etherwake 入っていないっぽい
ここ から落としてきて入れた。
$ curl -o etherwake.deb http://ftp.jp.debian.org/debian/pool/main/e/etherwake/etherwake_1.09-4+b1_$(dpkg --print-architecture).deb
$ sudo dpkg -i ./etherwake.deb
$ rm ./etherwake.deb
WoL パケットの NAT 越え
外出先から自宅に VPN で繋いで、自宅ネットワーク内にあるサーバを Wake on LAN (WoL)1 で起動したい。
VPN 接続した状態で普通に手元のマシンから WoL パケットを送れば起動するかと思ったら起動しない。VPN 接続した状態だと手元のマシンと自宅ネットワーク内のサーバとでネットワークアドレスが違うので、WoL パケットがルータを超えてサーバまで届くようにしないといけないらしい。
なんとかする方法はふたつあって、
- 外部から WoL パケットが飛んできたら LAN のブロードキャストアドレスに流すようにルータを設定する
- 同じネットワークに所属している機器から WoL パケットを送る
前者はあまりセキュアじゃなさそうなので、とりあえず後者ができるか考えてみる。
ルータの種類によっては GUI から WoL パケットを送る機能があるらしい。2
残念ながら我が家の EdgeRouter X の GUI にはそのような機能はついてなかったので他の方法を考える。
EdgeRouter から WoL パケットを送る
自宅ではルータの他にファイルサーバも動いているので、ファイルサーバに SSH ログインして WoL パケットを投げるのが一番簡単なのだけど、ファイルサーバにファイルサーバじゃない役割を担わせるのが申し訳なくて (?) まずはルータから WoL パケットが送れるかどうかを検討する。
CentOS は wol
, Ubuntu は wakeonlan
というコマンドを入れれば WoL パケットを送れるらしいが、EdgeRouter の OS は Vyatta ベースなのでそのへんのコマンドは簡単には使えなさそうな雰囲気がある・・・。
ていうかネットワーク系の OS なんだからどうせデフォで入ってるでしょ、と思って探していたら /usr/sbin/etherwake
というそれっぽいのがあった。
$ sudo etherwake -u
usage: etherwake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55
This program generates and transmits a Wake-On-LAN (WOL)
"Magic Packet", used for restarting machines that have been
soft-powered-down (ACPI D3-warm state).
It currently generates the standard AMD Magic Packet format, with
an optional password appended.
The single required parameter is the Ethernet MAC (station) address
of the machine to wake or a host ID with known NSS 'ethers' entry.
The MAC address may be found with the 'arp' program while the target
machine is awake.
Options:
-b Send wake-up packet to the broadcast address.
-D Increase the debug level.
-i ifname Use interface IFNAME instead of the default 'eth0'.
-p <pw> Append the four or six byte password PW to the packet.
A password is only required for a few adapter types.
The password may be specified in ethernet hex format
or dotted decimal (Internet address)
-p 00:22:44:66:88:aa
-p 192.168.1.1
(ヘルプ表示が --help
じゃなくて -u
なのわかりづらい)
コレを使えばできそうな気がするが、単純に
$ sudo etherwake <MACアドレス>
とやってみても起動しない。
デフォルトでは eth0 にパケットを飛ばすようになっているので、我が家の設定だと eth0 は WAN 側なので起動したいサーバまで届かない。
$ sudo etherwake -i eth3 <MACアドレス>
起動したいサーバは eth3 に直接繋がっていたので、こうすると見事起動した。
最低限コレでもいいけど、NIC を直接指定するのなんか気持ち悪いのでもうちょっといいやり方にしたい。
$ sudo etherwake -b -i switch0 <MACアドレス>
我が家の設定だと switch0 が作られていた3ので、ここにブロードキャストすれば LAN 全体に送れるかな、と思ってやってみたらできた。
これで外出先からでも自宅のサーバを起動できるようになった。
めでたしめでたし。