使用Scapy捕获网络流时出现Socket错误,求排查方案
解决Scapy嗅探时的Socket错误问题
错误原因
你代码里的UDP数据包打印逻辑存在错误:UDP协议层只有sport(源端口)属性,没有src(源IP)属性,你误将packet[IP].src写成了packet[UDP].src,这会导致Scapy解析数据包时触发异常,进而引发Socket关闭的警告。
修复方案
直接修正UDP打印行的错误代码即可,同时可以优化代码的严谨性:
修正后的完整代码
def spck_clbk(packet): global ip_cnt if IP in packet: save_pkDATA(packet) ip_cnt += 1 ip_src = packet[IP].src ip_trg = packet[IP].dst print(f"{ip_cnt}. IP Source found.... {ip_src}") print(f"Target IP spottet... ( -_•)︻デ═一 {ip_trg} ") if TCP in packet: print(f"TCP Paket: {ip_src}:{packet[TCP].sport} -> {ip_trg}:{packet[TCP].dport}") if UDP in packet: # 修正:UDP层没有src属性,改用IP层的源IP print(f"UDP Packet: {ip_src}:{packet[UDP].sport} -> {ip_trg}:{packet[UDP].dport}") if ICMP in packet: print(f"ICMP Paket: {ip_src} -> {ip_trg}") def str_sn(interface): print(f"Sniffing on {interface}....") sniff(iface = interface, prn = spck_clbk, store = 0, filter="ip", timeout=5)
额外注意事项
- 因为你设置了
filter="ip",捕获到的数据包都包含IP层,所以把TCP/UDP/ICMP的判断放在IP判断内部,可避免重复访问packet[IP] - 若不确定Scapy协议层的属性,可在命令行中用
ls(IP)、ls(UDP)等命令查看对应层的所有可用属性
内容的提问来源于stack exchange,提问作者derCollegeblock
相关产品推荐
相关产品推荐

