我想在SystemA
的接口上侦听数据包。由于看起来我没有看到绝大多数传入的数据包,因此我以最简单的形式使用了scapy
:
import scapy.all as scapy
def filtre(p):
if p.haslayer(scapy.IP):
print(p[scapy.IP].src)
# Disable scapy verbosity
scapy.conf.verb = 0
scapy.sniff(iface="eth0", prn=filtre, store=0)
这是在SystemA
上运行,输出发送到文件。
与此同时,我运行
tcpdump
和SystemA
上SystemB
nmap SystemA -P0
SystemB
我们的想法是在nmap
会话期间查看有多少数据包离开SystemB
并到达SystemA
。结果是
tcpdump
,1000个数据包离开SystemB
并到达SystemA
SystemB
scapy
注册了SystemA
的来源IP 仅约150到200个
我做了几次测试,tcpdump
次会话没有(他们没有改变结果AFAICT),并通过scapy
获得不同数量的数据包 - 在150-200范围内。< / p>
这是在局域网上,SystemB
是debian,SystemA
是RPi3。我可以期待一些数据包不能注册,但不是80%到90%。同时tcpdump
系统地在两个系统上注册预期的1000个数据包。
我有什么遗失的吗?
编辑:50个数据包(nmap SystemA -p1-50 -P0
)的相同测试很好,scapy注册所有50个数据包。
答案 0 :(得分:0)
您可能想尝试使用不使用输出的东西(因为这可能是瓶颈)。此外,如果线路上有不需要的数据包,您可以使用BPF过滤器。此外,由于您不需要剖析IP有效负载,因此可以防止Scapy解析整个数据包层。
from collections import Counter
import scapy.all as scapy
sources = Counter()
def count_pkts(p):
global sources
if scapy.IP in p:
sources[p[scapy.IP].src] += 1
# Disable scapy verbosity
scapy.conf.verb = 0
# Prevent Scapy from dissecting IP payloads
scapy.IP.payload_guess = []
# Optionally, use filter="ip and src x.y.z.t"
scapy.sniff(iface="eth0", prn=count_pkts, store=0, filter="ip")
print sources