首先确定网卡名

shitou@aishitou:~$ ifconfig
br-13d583223114: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 172.19.255.255
        inet6 fe80::6482:bcff:fe85:5fe5  prefixlen 64  scopeid 0x20<link>
        ether 66:82:bc:85:5f:e5  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-3386b07e1abc: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255
        ether 86:11:c3:6c:fd:9f  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-86f3083f5f8b: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 4a:e6:7f:88:2b:17  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-8e4b4726eda0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.21.0.1  netmask 255.255.0.0  broadcast 172.21.255.255
        ether fa:46:43:b5:07:00  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-e5ead93c2189: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.250.1  netmask 255.255.255.0  broadcast 192.168.250.255
        ether 82:96:d9:ca:32:41  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether ba:ea:24:df:1e:7d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.2  netmask 255.255.255.0  broadcast 192.168.31.255
        inet6 fd00:6868:6868:0:2e0:66ff:fec3:553a  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2e0:66ff:fec3:553a  prefixlen 64  scopeid 0x20<link>
        inet6 fd00:6868:6868::155  prefixlen 128  scopeid 0x0<global>
        ether 00:e0:66:c3:55:3a  txqueuelen 1000  (Ethernet)
        RX packets 2492  bytes 548410 (548.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 542  bytes 98393 (98.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2112  bytes 141624 (141.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2112  bytes 141624 (141.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth5022443: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::7492:deff:febd:31cd  prefixlen 64  scopeid 0x20<link>
        ether 76:92:de:bd:31:cd  txqueuelen 0  (Ethernet)
        RX packets 63  bytes 3446 (3.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 120  bytes 5948 (5.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth5d3bb87: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::8cb4:ddff:fec4:cccd  prefixlen 64  scopeid 0x20<link>
        ether 8e:b4:dd:c4:cc:cd  txqueuelen 0  (Ethernet)
        RX packets 229  bytes 63468 (63.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 338  bytes 81003 (81.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

然后输入下列命令,

sudo ethtool enp2s0 | grep -i 'wake-on'

shitou@aishitou:~$ sudo ethtool enp2s0 | grep -i 'wake-on'
        Supports Wake-on: pumbg
        Wake-on: d

方法1,局域网内ubuntu唤醒其他主机

 sudo apt update && sudo apt install wakeonlan -y
  wakeonlan 00:e0:4d:a4:47:41

方法2,docker安装网络唤醒容器,后,(怎么安装参考下面 使用 docker compose安装

version: '3'
services:
  wakeonlan:
    image: linuxserver/wakeonlan
    container_name: wakeonlan-web
    restart: unless-stopped  #  保持一致的重启策略
    network_mode: "host"     # 必须使用主机网络,否则无法发送广播包
    environment:
      - PUID=1000            # 运行用户ID(默认1000,与常见用户ID一致)
      - PGID=1000            # 运行用户组ID(默认1000)
      - TZ=Asia/Shanghai     # 时区设置(使用上海时区)
    volumes:
      # 持久化配置(设备列表、设置等),
      - /vol1/1000/docker/wakeonlan/config:/config
    # 无需端口映射(host模式直接使用主机端口7900)

访问 Web 界面:
浏览器打开 http://宿主机IP:7900,即可添加设备(输入 MAC 地址、名称)并发送唤醒包

1. 使用 Docker 容器内的 wakeonlan 命令

bash

# 进入容器(容器名沿用之前的 `wakeonlan-web`)
docker exec -it wakeonlan-web sh

# 发送唤醒包(替换为目标设备的MAC地址)
wakeonlan 00:1a:2b:3c:4d:5e

# 跨网段唤醒(指定广播地址,如192.168.2.255)
wakeonlan -i 192.168.2.255 00:1a:2b:3c:4d:5e

2. 主机直接使用 wakeonlan 工具

bash

# 安装工具(Ubuntu/Debian)
sudo apt update && sudo apt install wakeonlan -y

# 发送唤醒包(无需Docker)
wakeonlan 00:1a:2b:3c:4d:5e

二、关键配置验证(确保设备支持 WOL)

1. 目标设备 BIOS 设置

  • 进入 BIOS(通常按 DelF2 或 F12),找到 Power Management 或 Network Settings

    • 启用 Wake on LAN 或 PCI-E Device Wake(不同主板名称可能不同)。

    • 部分主板需同时启用 Resume by PCI-E Device 或 Wake on Magic Packet

2. 操作系统设置(Windows/Linux)

  • Windows

    1. 右键 此电脑 → 管理 → 设备管理器 → 网络适配器 → 右键网卡 → 属性 → 电源管理

      • 勾选 允许此设备唤醒计算机 和 仅允许魔法数据包唤醒计算机

    2. 禁用 快速启动(路径:控制面板 → 电源选项 → 选择电源计划 → 更改计划设置 → 更改高级电源设置 → 关机设置 → 关闭快速启动)。

  • Linux

    bash

    # 查看网卡名称(如 enp2s0)
    ip link show
    
    # 启用 WOL(`g` 表示支持魔术包唤醒)
    sudo ethtool -s enp2s0 wol g
    
    # 验证(输出 `Wake-on: g` 表示成功)
    sudo ethtool enp2s0 | grep "Wake-on"
    

3. 验证网卡供电

  • 目标设备关机后,观察网口指示灯是否亮起:

    • :表示网卡仍通电,WOL 配置正常。

    • :需检查主板 BIOS 的 USB/PCI-E 供电 选项(可能需要设置为 Always On)。

三、跨网段 / 广域网唤醒方案

1. 跨局域网唤醒(同路由器下不同子网)

  • 路由器配置

    1. 登录路由器后台,找到 IP 转发 或 广播转发 选项,启用 IP Directed Broadcast

    2. 发送唤醒包时指定目标子网的广播地址:

      bash

      wakeonlan -i 192.168.2.255 00:1a:2b:3c:4d:5e
      

2. 广域网远程唤醒(Internet)

  • 方案一:端口映射 + 静态绑定

    1. 在路由器中设置 端口转发:将公网端口(如 9999)映射到局域网内某台设备的 9 端口(WOL 默认端口)。

    2. 在路由器中绑定目标设备的 MAC 地址与静态 IP,确保关机后 IP 不变。

    3. 在外网使用命令:

      bash

      wakeonlan -i 公网IP -p 9999 00:1a:2b:3c:4d:5e
      

  • 方案二:VPN 连接到局域网

    1. 在家中部署一台始终在线的设备(如树莓派、NAS),搭建 VPN 服务器。

    2. 在外网通过 VPN 连接到局域网,直接使用 wakeonlan 命令。

    3. 优点:无需暴露公网端口,安全性更高。

四、故障排查与工具推荐

1. 验证魔术包是否发送

  • 抓包工具(Linux)

    bash

    # 安装 tcpdump
    sudo apt install tcpdump -y
    
    # 监听 WOL 端口(9 或 7)
    sudo tcpdump -i any port 9 or port 7 -n
    


    • 发送唤醒包后,若出现类似 IP 0.0.0.0.9 > 255.255.255.255.9: UDP, length 102 的记录,说明广播成功。

2. 可视化工具(Windows)

  • Wireshark

    1. 过滤条件:udp.port == 9 || udp.port == 7

    2. 检查是否有包含 FF:FF:FF:FF:FF:FF 前缀的数据包(魔术包特征)。

3. 移动端工具

  • Android/iOS

    • 搜索 Wake On Lan 应用(如 WOL - Wake On Lan),输入 MAC 地址和广播地址即可发送唤醒包。

五、自动化脚本示例

1. 定时唤醒(Linux 计划任务)

bash

# 编辑 crontab
crontab -e

# 每天 8:00 唤醒设备(MAC地址为 00:1a:2b:3c:4d:5e)
0 8 * * * /usr/bin/wakeonlan 00:1a:2b:3c:4d:5e

2. 结合 Docker 容器的 API

bash

# 通过 Docker API 发送命令(需启用 Docker 远程访问)
curl -X POST "http://宿主机IP:2375/containers/wakeonlan-web/exec" \
  -H "Content-Type: application/json" \
  -d '{"AttachStdin": false, "AttachStdout": true, "Cmd": ["wakeonlan", "00:1a:2b:3c:4d:5e"]}'

六、安全注意事项

  1. 公网暴露风险

    • 避免直接暴露 WOL 端口到公网,优先使用 VPN 方案。

  2. MAC 地址泄露

    • 若通过公网发送唤醒包,建议使用 HTTPS 加密或 VPN 隧道。

  3. 防火墙设置

    • 确保宿主机防火墙允许 7900 端口(Web 界面)和 9/7 端口(WOL 协议)。

    bash

    # Ubuntu 示例
    sudo ufw allow 7900/tcp
    sudo ufw allow 9/udp
    sudo ufw allow 7/udp