答案1
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'
这可以捕捉到唤醒etherwake
,以太类型 0x0842(AMD魔包格式), 和wakeonlan
(UDP:9),但需要接口运行在promiscuous mode
。
此示例的输出如下:
44:55:33:11:56:66
11:22:33:66:56:af
11:be:33:ef:56:af
要从不同的计算机进行测试,例如:
wakeonlan 12:de:ad:be:ef:56
etherwake -i wlp2s0 -b 31:32:33:34:35:36
要仅捕获通过 UDP 发送的数据(例如wakeonlan
命令),您可以使用不需要混杂模式的脚本:
nc -dknl -p 9 -u |
stdbuf -o0 xxd -c 6 -p |
stdbuf -o0 uniq |
stdbuf -o0 grep -v 'ffffffffffff' |
while read ; do
echo ${REPLY:0:2}:${REPLY:2:2}:${REPLY:4:2}:${REPLY:6:2}:${REPLY:8:2}:${REPLY:10:2};
done
您可以启动其他操作来代替while read ... echo blabla
。
答案2
维基百科关于 LAN 唤醒数据包的结构有这样的说法(强调我的):
魔术数据包是一个广播帧,其有效负载中的任何位置都包含 255 个字节中的 6 个字节(十六进制的 FF FF FF FF FF FF FF),后面跟着 16 个重复的目标计算机的 48 位 MAC 地址,总共 102 个字节。
由于魔术包仅扫描上面的字符串,并且实际上并没有被完整的协议栈解析,它可以作为任何网络层和传输层协议发送,尽管它通常作为 UDP 数据报发送到端口 0、7 或 9,或者直接通过以太网作为 EtherType 0x0842 发送。
因此,您当前的捕获过滤器不能保证捕获所有 WOL 数据包。和根据文档,看来 WakeMeOnLan 应用程序有多种方式来发送 WOL 数据包,因此您可能需要进行一个简短的未过滤测试捕获,以找出应用程序发送的 WOL 数据包类型,然后相应地定制您的过滤器。