基于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
相关产品推荐
相关产品推荐

