我想知道如何在正在运行的系统上监听 wakeonlan paquets。
我知道我的问题可能看起来有点没用,因为如果系统正在运行,就没有必要唤醒它!
答案1
您nc
可以使用 UDP 端口进行监听。魔法包通常通过广播发送到端口 9。因此,命令将是:
nc -ul 9
根据 nc 的实现,您可能还需要提供标志-p
:
nc -ul -p 9
要测试它,请使用wakeonlan
命令...
wakeonlan <your-mac>
...并在 nc 终端中查看输出。
答案2
另一个答案仅适用于通过 UDP:9 传入的“唤醒!”数据包(例如来自wakeonlan
,而不是专用的数据包以太类型 0x0842(AMD 魔术包格式)(例如etherwake
)。
要获取这两种唤醒方法的有效载荷的相关部分:
tcpdump -UlnXi eth0 ether proto 0x0842 or udp port 9 2>/dev/null |
sed -nE 's/^.*20: (ffff|.... ....) (..)(..) (..)(..) (..)(..).*$/\2:\3:\4:\5:\6:\7/p'
输出是一MAC地址每行,行缓冲。
答案3
我知道我的问题可能看起来有点没用,因为如果系统正在运行,就没有必要唤醒它!
完全不是。在配置或故障排除时,您可能需要查看数据包是否确实到达。
使用此命令
$ sudo tcpdump -i eth0 -n -v -s0 udp port 9
您可以看到 eth0 接口上端口 9 的每个 UDP 数据包。输出将随着每个满足条件的数据包而更新(不同于nc
在第一个数据包后停止)。
你可以改变eth0到wlan0或任何您需要的东西(是的,您也可以使用无线接口唤醒设备)。
一个例子:
$ sudo tcpdump -i eth0 -n -v -s0 udp port 9
tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:09:33.209538 IP (tos 0x0, ttl 64, id 52416, offset 0, flags [DF], proto UDP (17), length 130)
192.168.1.110.39220 > 192.168.1.18.9: UDP, length 102
22:09:36.893741 IP (tos 0x0, ttl 64, id 22576, offset 0, flags [DF], proto UDP (17), length 130)
192.168.1.110.41489 > 192.168.1.255.9: UDP, length 102
22:09:38.227547 IP (tos 0x0, ttl 63, id 5077, offset 0, flags [DF], proto UDP (17), length 130)
public_IP.3796 > 192.168.1.18.9: UDP, length 102
根据我的实验,您可以将数据包发送至:
- Case0:广播地址(局域网内部,例如192.168.1.255)
- 情况 1:设备的 IP(在 LAN 内,例如 192.168.1.18)。为此,您的 Hub/路由器可能需要 ARP 表)
- 案例 2:路由器的 Public_IP(为此您需要配置 NAT 和可能的 ARP 表
*
)将转发到设备的 IP(案例 1)
*
需要 ARP 表是因为在设备断开连接约 15 分钟后,集线器/路由器将不会记住 IP 的 MAC 地址,因此它将拒绝发送数据包,因为它不知道将其发送给哪里/发送给谁。
如果我说错了什么,请评论(以更新)。