首先确定网卡名
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(通常按
Del
、F2
或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:
右键 此电脑 → 管理 → 设备管理器 → 网络适配器 → 右键网卡 → 属性 → 电源管理:
勾选 允许此设备唤醒计算机 和 仅允许魔法数据包唤醒计算机。
禁用 快速启动(路径:控制面板 → 电源选项 → 选择电源计划 → 更改计划设置 → 更改高级电源设置 → 关机设置 → 关闭快速启动)。
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. 跨局域网唤醒(同路由器下不同子网)
路由器配置:
登录路由器后台,找到 IP 转发 或 广播转发 选项,启用 IP Directed Broadcast。
发送唤醒包时指定目标子网的广播地址:
bash
wakeonlan -i 192.168.2.255 00:1a:2b:3c:4d:5e
2. 广域网远程唤醒(Internet)
方案一:端口映射 + 静态绑定:
在路由器中设置 端口转发:将公网端口(如 9999)映射到局域网内某台设备的 9 端口(WOL 默认端口)。
在路由器中绑定目标设备的 MAC 地址与静态 IP,确保关机后 IP 不变。
在外网使用命令:
bash
wakeonlan -i 公网IP -p 9999 00:1a:2b:3c:4d:5e
方案二:VPN 连接到局域网:
在家中部署一台始终在线的设备(如树莓派、NAS),搭建 VPN 服务器。
在外网通过 VPN 连接到局域网,直接使用
wakeonlan
命令。优点:无需暴露公网端口,安全性更高。
四、故障排查与工具推荐
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:
过滤条件:
udp.port == 9 || udp.port == 7
。检查是否有包含 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"]}'
六、安全注意事项
公网暴露风险:
避免直接暴露 WOL 端口到公网,优先使用 VPN 方案。
MAC 地址泄露:
若通过公网发送唤醒包,建议使用 HTTPS 加密或 VPN 隧道。
防火墙设置:
确保宿主机防火墙允许 7900 端口(Web 界面)和 9/7 端口(WOL 协议)。
bash
# Ubuntu 示例 sudo ufw allow 7900/tcp sudo ufw allow 9/udp sudo ufw allow 7/udp