WOL起動の設定 debian12

■環境

```
$ 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 アドレスではない」らしいという謎の記述があり、ちょっと何のことだかわからなかったため
 
 >https://ja.wikipedia.org/wiki/Wake-on-LAN

■一応、ふつうの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
```