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

基于Python/Scapy使用sniff抓包存储源IP与源MAC功能验证咨询

代码正确性核验结果

现有代码存在的问题

  • 无IP、MAC存储逻辑:仅将所有捕获报文存入列表,未提取源IP、源MAC字段做结构化存储,也未实现同IP多MAC的追加存储能力
  • 无实时展示能力:所有报文打印逻辑在sniff()停止(按Ctrl+C终止监听)后才执行,无法在运行过程中实时更新已发现主机列表
  • 缺少流量过滤规则:注释里提到要过滤ARP响应(op=2),但实际未添加任何过滤逻辑,所有类型的流量都会被捕获
  • 存在冗余代码:开头定义的ethernetHeader、ipHeader、icmpHeader、pkt变量未在后续逻辑中使用

符合需求的实现代码

from scapy.all import sniff, ARP, Ether
from collections import defaultdict
import os

# 存储IP对应的MAC集合,自动去重
ip_mac_map = defaultdict(set)

def clear_terminal():
    # 适配不同系统清屏
    os.system('cls' if os.name == 'nt' else 'clear')

def packet_handler(pkt):
    # 只处理ARP报文,可根据需求扩展处理IP报文
    if pkt.haslayer(ARP):
        src_ip = pkt[ARP].psrc
        src_mac = pkt[Ether].src
        # 过滤掉0.0.0.0这类无效源IP
        if src_ip != '0.0.0.0':
            ip_mac_map[src_ip].add(src_mac)
        # 清屏后实时打印当前已发现的主机列表
        clear_terminal()
        print("已发现的主机列表:")
        print("-"*40)
        for ip, macs in ip_mac_map.items():
            print(f"IP地址:{ip} 关联MAC:{', '.join(macs)}")
        print("-"*40)

def main():
    # 监听enp0s3接口,只抓ARP流量,回调函数实时处理,store=0不缓存报文节省内存
    sniff(iface="enp0s3", prn=packet_handler, store=0)

if __name__ == "__main__":
    main()

实现效果说明

运行上述脚本后,测试流量中192.168.1.10先后出现两个MAC地址10:11:12:ab:ab:ab和de:ad:be:ef:de:ad时,会自动追加存储,终端会实时刷新展示该IP对应的两个MAC地址,完全匹配需求。

内容的提问来源于stack exchange,提问作者JohnMc1010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:03