【发布时间】:2014-12-04 03:41:20
【问题描述】:
我们可以对第 3 层 ICMP 数据包使用 srp() 函数吗?我看到当我们制作一个 ICMP 回显请求数据包并使用 sr() 发送/接收时,我们没有看到它被发送出接口,因此没有来自目的地的响应。但是,如果我们使用 srp() 函数,我们会看到相同的数据包响应。什么时候应该使用 sr(),什么时候应该使用 srp()?在文档中,它声明 sr() 用于 L3 数据包,而 srp() 用于 L2?但就我而言,我不确定为什么 sr() 不适用于 ICMP 数据包?有高手能帮我理解一下吗?
如果总是需要“iface”参数,也有人可以告诉我。没有那个scapy怎么知道它应该通过哪个接口发送数据包?
案例 1:sr() 函数以 iface 作为参数:
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
>>>
【问题讨论】: