无法收到碎片化的 ICMP 回应请求的答复

unable to receive the answer of a fragmented ICMP Echo Request

我正在尝试手动发送一个大的 ICMP Echo 请求,因此我编写了以下 scapy 代码:

frags = fragment(IP(dst=dst)/ICMP()/Raw(load=('x')*50000))


s = conf.L3socket(iface=iface)      #improve Sending performance (https://byt3bl33d3r.github.io/mad-max-scapy-improving-scapys-packet-sending-performance.html)

count = len(frags)                  #Count fragments
i = 0
maximum = count - 1                 
print "maximum: " + str(maximum)

#Send all Frags but the last
while i < maximum:
    print "i: " + str(i)
    s.send(frags[i]) 
    i = i + 1
answer = s.sr(frags[i]) # using sr(), to receive an answer
print(ans[0])

无法接收 ICMP Echo 响应。 我得到的答案总是类似于

Received 9 packets, got 0 answers, remaining 1 packets

有人知道吗,我的代码有什么问题?

这行不通的原因有很多:

  • sr() 代表“发送接收”。此函数已经发送数据包,所以您不需要之前发送它
  • sr() returns 多个答案,意思是你不^C它或者它超时它不会停止。您正在寻找第一个答案
  • 上的 sr1() 哪个 returns
  • scapy 不能(还)对“流中”的数据包进行碎片整理。当您调用 sr/sr1 时,它会检查每个数据包是否有可能的答案,但不会有任何答案,因为它不会对流进行碎片整理。对于这个答案,你需要自己实现所有的“答案检查”,或者另辟蹊径。

反正不知道很多服务器会不会回答这样的ICMP