■環境
$ grep _NAME /etc/*release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
■WOL起動できる設定になっているか確認
$ dpkg -l ethtool | grep ^ii || sudo apt-get install -y ethtool
$ ls /sys/class/net/ | awk '{print "ethtool "$0}' | sudo sh | grep "^[A-Za-z0-9]\|Wa"
Settings for br0:
Settings for br1:
Settings for docker0:
Settings for enp2s0:
Supports Wake-on: pumbg
Wake-on: g
Settings for enx00e04c6867c2:
Supports Wake-on: pumbg
Wake-on: g
Settings for lo:
Settings for virbr0:
■無効化(Disable)と有効化(MagicPacket)
$ man ethtool | lsec -sep "^\$" Wake on
p Wake on PHY activity
u Wake on unicast messages
m Wake on multicast messages
b Wake on broadcast messages
a Wake on ARP
g Wake on MagicPacket™
s Enable SecureOn™ password for MagicPacket™
f Wake on filter(s)
d Disable (wake on nothing). This option clears all previous
options.
■有効にするなら、 d を gに変更、無効ならその逆
$ sudo ethtool -s enx00e04c6867c2 wol d
$ sudo ethtool enx00e04c6867c2 | grep Wa
Supports Wake-on: pumbg
Wake-on: d
$ sudo ethtool -s enx00e04c6867c2 wol g
$ sudo ethtool enx00e04c6867c2 | grep Wa
Supports Wake-on: pumbg
Wake-on: g
■2つめのawk文はマスク用、マジックパケットを投げる先となる物理NICのMACアドレスを調べておく
$ ls /sys/class/net/ | awk '{print "ip a s "$0}' | sudo sh | \
awk '{if($1 ~ /^[0-9]/){gsub(":","",$2);printf "%s,",$2}else{if($1 ~ /link.ether/){print $2}}}' | \
awk '{gsub("[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]$","XX:XX:XX",$0);print $0}'
br0,f2:78:c4:XX:XX:XX
br1,f2:0a:5b:XX:XX:XX
docker0,02:42:2f:XX:XX:XX
enp2s0,00:16:96:XX:XX:XX
enx00e04c6867c2,00:e0:4c:XX:XX:XX
lo,virbr0,52:54:00:XX:XX:XX
■WOLで起こす側(WOLクライアント)の確認
$ dpkg -l wakeonlan | grep ^ii || sudo apt-get install wakeonlan
$ wakeonlan 00:16:96:XX:XX:XX
Sending magic packet to 255.255.255.255:9 with 00:16:96:XX:XX:XX
■WOLで起動するか試す前に、パケットキャプチャして届いていることを確認する
マジックパケットは、ff:ff:ff:ff:ff:ffに続けて、
起動したい装置のMACアドレスを16回繰り返したデータパターン(AMD Magic Packet Format) が
ペイロードに含まれているパケット
「YYYY YYYY」はマジックパケットを送信したIP
「ffff ffff」はブロードキャストの宛先IP(のはず)
「d4e3」は「54499」送信元ポート番号
「0009」は宛先wolポート番号
$ dpkg -l tcpdump | grep ^ii || sudo apt-get install -y tcpdump
$ sudo tcpdump -X -vvv -i enp2s0 -n '(proto 0x0842 or udp port 9) and src [client-ip] '
tcpdump: listening on enp2s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
23:01:14.157395 IP (tos 0x0, ttl 64, id 8124, offset 0, flags [DF], proto UDP (17), length 130)
[client-ip].54499 > 255.255.255.255.9: [udp sum ok] UDP, length 102
0x0000: 4500 0082 1fbc 4000 4011 4f34 YYYY YYYY E.....@.@.O4...\
0x0010: ffff ffff d4e3 0009 006e 01bd ffff ffff .........n......
0x0020: ffff 0016 96XX XXXX 0016 96XX XXXX 0016 ......>.....>...
0x0030: 96XX XXXX 0016 96XX XXXX 0016 96XX XXXX ..>.....>.....>.
0x0040: 0016 96XX XXXX 0016 96XX XXXX 0016 96XX ....>.....>.....
0x0050: XXXX 0016 96XX XXXX 0016 96XX XXXX 0016 >.....>.....>...
0x0060: 96XX XXXX 0016 96XX XXXX 0016 96XX XXXX ..>.....>.....>.
0x0070: 0016 96XX XXXX 0016 96XX XXXX 0016 96XX ....>.....>.....
0x0080: XXXX >.
■「ffff ffff」はブロードキャストの宛先IP(のはず)としたのは、
「あて先 MAC アドレスではない」らしいという謎の記述があり、ちょっと何のことだかわからなかったため
■一応、ふつうのpingで宛先IPになることを確認した上で、
同位置にブロードキャストの宛先IPの16進数が入るということは確認した
$ ping -b 255.255.255.255
23:31:16.009130 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
172.31.31.92 > 255.255.255.255: ICMP echo request, id 9719, seq 2, length 64
0x0000: 4500 0054 0000 4000 4001 6f2e YYYY YYYY E..T..@.@.o....\
0x0010: ffff ffff 0800 a8f3 25f7 0002 b4b2 e667 ........%......g
0x0020: 0000 0000 cf25 0000 0000 0000 1011 1213 .....%..........
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
■パケットが届いているのに起動しないなら、BIOSでWOLが無効になっていないか確認する
■WOL起動することを確認したら、再起動後も反映する設定を入れる
interface でも nmcli でも「rc.local」に直接指示するでも、手動で実行しなくても良い方法で動けば良い
$ grep -B 1 -A 1 "inet manual" /etc/network/interfaces.d/br0
auto enp2s0
iface enp2s0 inet manual
ethernet-wol g
$ nmcli con show | awk '!/br|docker|lo|vnet/'
NAME UUID TYPE DEVICE
Wired connection 1 797521d2-3bb9-4ff4-9a0c-5eae29844446 ethernet --
$ nmcli con show "Wired connection 1" | grep wake-on-lan
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
$ sudo nmcli c modify "Wired connection 1" 802-3-ethernet.wake-on-lan magic
$ nmcli con show "Wired connection 1" | grep wake-on-lan
802-3-ethernet.wake-on-lan: magic
802-3-ethernet.wake-on-lan-password: --
$ cat /etc/rc.local
#!/bin/bash
ethtool -s enp2s0 wol g
exit 0
$ sudo chmod +x /etc/rc.local