Python实现局域网IP与MAC地址映射查询

雨后青山
雨后青山
发布时间:2026-10-14 | 3人浏览过
原创

本文介绍如何使用Python脚本在统一局域网内通过ARP协议扫描,将指定网段的IP地址映射为对应的MAC物理地址。文章详细解析了MAC地址的结构,并提供了基于Scapy库发送ARP请求包的具体代码实现,帮助开发者快速获取局域网内设备的硬件标识信息。

MAC地址与IP地址基础概念

MAC地址,亦称物理地址或硬件地址,是在网络设备制造阶段烧录于网卡(Network Interface Card)的EPROM芯片中的唯一标识。在计算机系统中,IP地址与MAC地址均以二进制形式存储,其中IP地址长度为32位,而MAC地址长度为48位 [3] 。

MAC地址由48位(即6个字节)组成,通常以12个十六进制数字表示,例如:00-16-EA-AE-3C-40。该地址的前3个字节(如00-16-EA)由IEEE(电气与电子工程师协会)分配给网络硬件制造商,用于标识厂商;后3个字节(如AE-3C-40)则由制造商分配给其生产的特定网络产品序列。只要未手动修改,MAC地址在全球范围内具有唯一性,类似于身份证号码。

Python实现局域网ARP扫描

我们可以通过编写Python代码来实现这一查询过程。


# arp扫描,定义一个函数,发送两层的arp包,请求同一局域网内其他IP地址的mac地址。
from scapy.all import *
import uuid,socket
# 获取本机的IP地址。
def get_ip_address():
  # 获取本机电脑名
  myname = socket.getfqdn(socket.gethostname())
  # 获取本机ip
  myaddr = socket.gethostbyname(myname)
  return myaddr
# 获取本机的mac地址。
def get_mac_address():
  mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
  return ":".join([mac[e:e + 2] for e in range(0, 11, 2)])

# arp扫描,获取统一局域网下的IP地址的mac地址。
def arp_scan(ip):
  # 获取本机的mac地址。
  local_mac = get_mac_address()
  # 获取本机的ip地址。
  local_ip = get_ip_address()
  # print(type(local_ip),type(local_mac))
  # 分隔IP地址。
  ip_split = ip.split('.')
  ip_list = []
  # 进行重新定义ip地址段。
  for i in range(1,25):
    ip_list.append(ip_split[0] + '.' + ip_split[1] + '.' + ip_split[2] + '.' + str(i))
  print(ip_list,local_ip,local_mac)
  # arp_result = srp(Ether(src = local_mac,dst = 'ff:ff:ff:ff:ff:ff')/ARP(op = 1,hw = '00:00:00:00:00:00',psrc = local_ip,pdst = ip_list),timeout = 1,verbose = False)
  # 构造二层包,写入以太网层,这里每一层包需要填什么字段,可以取scapy界面看一下。
  arp_result = srp(Ether(src=local_mac, dst='ff:ff:ff:ff:ff:ff')/ARP(op=1, hwsrc=local_mac, hwdst='00:00:00:00:00:00',psrc=local_ip, pdst=ip_list), timeout=1,verbose=False)
  # 进行解包操作。
  mac_result = arp_result[0].res
  mac_list = []
  # 找到对应的IP地址和MAC地址。
  for i in range(len(mac_result)):
    ip = mac_result[i][1][1].fields['psrc']
    mac = mac_result[i][1][1].fields['hwsrc']
    mac_list.append([ip,mac])
  return mac_list

if __name__ == "__main__":
  ip = '192.168.156.1'
  mac_list = arp_scan(ip)
  for i in range(len(mac_list)):
    print("IP地址:",mac_list[i][0],'MAC地址:',mac_list[i][1])

以上即为利用Python在统一局域网内查找IP对应MAC地址的完整方法,更多Python相关技术文章请持续关注本站后续更新。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表