我们可以将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 documentation的sr
函数:
srp
函数:
由于ICMP
数据包的第2层字段也已填充,如ICMP.show2()
的输出所示,您应该使用srp
函数。如果您像this tutorial一样保持原样,则可以使用sr
函数。
现在,关于您对ICMP
的分类是第2层协议(protocol)还是第3层协议(protocol)的问题。许多人认为这是第3层协议(protocol),例如here,因为它使用了IP
header 并在其顶部“坐”。但是,其他人则认为它是第2层协议(protocol),例如here。 This 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/