发送scapy中的ICMP数据包并选择正确的接口
我们可以使用srp()函数来处理第3层ICMP数据包吗?我看到,当我们制作ICMP回显请求数据包并使用sr()发送/接收时,我们看不到它从接口发出,因此没有来自目的地的响应。但是如果我们使用srp()函数,我们可以看到相同的数据包。什么时候应该使用sr()和何时使用srp()?在文档中,它声明sr()用于L3数据包,srp()用于L2?但在我的情况,我不知道为什么sr()不适用于ICMP数据包?有些专家可以帮我理解吗?发送scapy中的ICMP数据包并选择正确的接口
也有人可以让我知道,如果总是需要“iface”参数。没有了scapy如何知道它应该发送数据包的接口?
案例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任何ICMP应答192.168.25.1
案例2:sr()函数无iface:
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的ICMP数据包()代替SR():
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
功能:
sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)
发送和使用所述
conf.L3socket
supersocket在第3层接收分组。
的srp
功能:
srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)
同
srp
但在层2conf.L2socket
supersocket工作。
由于您ICMP
一个包的2名中的字段填为好,如由ICMP.show2()
输出,你应该使用srp
功能。如果您没有将它们保持原样,如this tutorial所示,则可以使用sr
函数。现在
,关于您的约ICMP
的分类为第2层协议或第3层协议的问题。许多人认为它是第3层协议,例如here,因为它使用IP
标题,并且“坐在”它的顶部。但是,其他人认为它是第2层协议,如here。 This is a question在这个问题上有一些很好的答案,但是请注意它们指的是OSI
模型,所以分层方案编号有点不同。这是我已经成功地定位,从here最好:
IP本身没有机制作为直接的有用数据建立和维护一个连接,甚至包含数据。互联网控制消息传递协议仅仅是IP的一个附加部分,用于承载错误,路由和控制消息和数据,并且通常被认为是网络层的协议。
编辑 - 我刚刚遇到this link,并认为这是值得一提:
ICMP是存在的主要提供控制,故障排除和错误消息的TCP/IP协议栈中的协议。它运行在IP上,就像TCP和UDP一样,但是像IP那样是一个网络层协议,而不是象TCP和UDP这样的传输层协议。 (是的,这是一种奇怪的,即ICMP是内IP封装,同时在同一层IP上,但还是那句话,你可以在IP封装在IP为好。)
RFC 792也相当明确:
ICMP,使用IP的基本支持,就好像它是更高级别的协议,但是,ICMP实际上是IP的组成部分。
所以是RFC 1122:
ICMP是被认为是IP的一个组成部分的控制协议,尽管它是在IP架构分层,即,其使用IP来承载数据端到端就像TCP或UDP这样的传输协议。
...
尽管ICMP消息被封装在IP数据报中,但ICMP处理被认为是IP层的一部分(通常被实现为)。
关于你的最后一个问题关于明确指定接口,见scapy
's tutorial:
的
send()
功能将在层3也就是说它会处理路由和第2层的数据包发送您。sendp()
函数将在第2层工作。您可以选择正确的接口和正确的链路层协议。
官方的API文档是一个比较详细:
当Scapy的推出,其路由表与主机的路由表同步。对于在第3层发送的数据包,目标IP将确定要使用的输出接口,源地址和网关。对于第2层数据包,可以对输出接口进行精确定义,或者可以以IP形式给出提示以确定输出接口。如果没有给出输出接口和提示,则使用
conf.iface
。
具体地说,iface
参数用于设置输入接口(也设置输出接口,如果不使用iface_hint
):
IFACE:仅在所提供的接口听答案
对于暗示的output
接口上,使用iface_hint
用于层2的功能:
还有一个附加参数
iface_hint
,它提供了一个提示,可以帮助选择正确的输出接口。默认情况下,如果未指定iface
,则选择conf.iface
。该提示采取IP层的形式,第2层数据包可能会被注册到该IP。 Scapy路由表(conf.route
)用于确定使用哪个接口来访问此IP。
很好。我制作了一个ICMP数据包,但没有提供Ether(),我注意到sr()如上所述工作。我还注意到scapy中的路由表不同步。我重新启动了它,现在它正在为sr()正确退出iface。感谢您的及时回应。 – Pradeep 2014-10-09 17:27:47