我们可以将srp()函数用于第3层ICMP数据包吗?我看到当我们制作ICMP回显请求数据包并使用sr()进行发送/接收时,我们没有看到它从接口(interface)中发送出去,因此没有来自目标的响应。但是如果使用srp()函数,则在同一数据包中,我们会看到响应。什么时候应该使用sr()?什么时候应该使用srp()?在文档中,它指出sr()用于L3数据包,而srp()用于L2?但是对于我来说,我不确定为什么sr()对于ICMP数据包不起作用?可以请一些专家帮助我理解吗?

也有人可以让我知道是否始终需要“iface”参数。否则,船长将如何知道应该通过哪个接口(interface)发送数据包?

情况1:以iface作为参数的sr()函数:

sr(icmp,iface="eth0")

开始发射:
WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
^C
Received 0 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

上面我没有看到来自IP 192.168.25.1的任何ICMP响应

情况2:不带iface的sr()函数:
sr(icmp)
.Begin emission:
......WARNING: Mac address to reach destination not found. Using broadcast.
.Finished to send 1 packets.
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 887 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

如果您在上方看到所接收的数据包,但我看不到任何ICMP响应。

情况3:使用srp()而不是sr()发送ICMP数据包:
srp(icmp,iface="eth0")
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)

在这里,我使用srp()函数而不是sr()函数,现在我看到ICMP回显请求已正确发送,并且也收到了响应。
>>> icmp.show2()
###[ Ethernet ]###
  dst: 02:00:00:11:01:03
  src: 02:00:20:ee:64:01
  type: 0x800
###[ IP ]###
     version: 4L
     ihl: 5L
     tos: 0x0
     len: 28
     id: 1
     flags:
     frag: 0L
     ttl: 64
     proto: icmp
     chksum: 0xc78c
     src: 192.168.25.2
     dst: 192.168.25.1
     \options\
###[ ICMP ]###
        type: echo-request
        code: 0
        chksum: 0xf7ff
        id: 0x0
        seq: 0x0
>>>

最佳答案

每个official API documentationsr函数:


srp函数:



由于ICMP数据包的第2层字段也已填充,如ICMP.show2()的输出所示,您应该使用srp函数。如果您像this tutorial一样保持原样,则可以使用sr函数。

现在,关于您对ICMP的分类是第2层协议(protocol)还是第3层协议(protocol)的问题。许多人认为这是第3层协议(protocol),例如here,因为它使用了IP header 并在其顶部“坐”。但是,其他人则认为它是第2层协议(protocol),例如hereThis is a question在此问题上有一些不错的答案,但请注意,它们是指OSI模型,因此分层方案编号略有不同。这是我设法从here找到的最好的:



编辑-我刚刚遇到了this link,并认为值得一提:



RFC 792也非常明确:



RFC 1122也是如此:



关于您最后一个关于显式指定接口(interface)的问题,请参见 scapy 's tutorial:



官方API文档更加详细:



具体来说,iface参数用于设置输入接口(interface)(如果未使用iface_hint,则还设置输出接口(interface)):



为了提示output接口(interface),请对第2层函数使用iface_hint:

关于python - 在Scapy中发送ICMP数据包并选择正确的接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26274524/

10-11 02:24