如何在Linux下用Python从以太网帧中提取并转换MAC地址?
提取以太网帧中的MAC地址
首先要明确:你当前使用的socket.AF_INET类型原始套接字,只能捕获IP层及以上的数据包,拿不到包含MAC地址的以太网帧头。要获取完整以太网帧,必须改用AF_PACKET类型的套接字。
核心步骤
- 创建正确的套接字:用
socket.AF_PACKET、socket.SOCK_RAW,协议指定为ETH_P_ALL(捕获所有类型的以太网帧) - 解析帧结构:以太网帧前6字节是目的MAC地址,接下来6字节是源MAC地址,后续2字节为以太网类型(比如0x0800代表IP协议)
- 字节转MAC格式:将每个字节格式化为两位十六进制字符串,用冒号
:连接成标准MAC格式
完整代码示例
import socket # 创建捕获以太网帧的原始套接字 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) while True: packet = s.recvfrom(65565) data = packet[0] # 提取目的MAC(前6字节)和源MAC(接下来6字节) dest_mac_bytes = data[:6] src_mac_bytes = data[6:12] # 转换为XX:XX:XX:XX:XX:XX格式 dest_mac = ':'.join(f'{b:02x}' for b in dest_mac_bytes) src_mac = ':'.join(f'{b:02x}' for b in src_mac_bytes) print(f"目的MAC: {dest_mac.upper()}") print(f"源MAC: {src_mac.upper()}") print("-" * 30)
注意事项
- 运行代码需要root权限,原始套接字要求系统级权限
socket.htons(0x0003)等价于ETH_P_ALL,若只需捕获IP帧,可改为socket.htons(0x0800)- 用
upper()可将十六进制字母转为大写,符合常见MAC地址显示习惯
内容的提问来源于stack exchange,提问作者Alex Lazar
相关产品推荐
相关产品推荐

