You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:30:57