2014-10-09 56 views
6

我们可以使用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 
>>>     

回答

3

official API documentationsr功能:

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但在层2 conf.L2socket supersocket工作。

由于您ICMP一个包的2名中的字段填为好,如由ICMP.show2()输出,你应该使用srp功能。如果您没有将它们保持原样,如this tutorial所示,则可以使用sr函数。现在


,关于您的约ICMP的分类为第2层协议或第3层协议的问题。许多人认为它是第3层协议,例如here,因为它使用IP标题,并且“坐在”它的顶部。但是,其他人认为它是第2层协议,如hereThis 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。

+1

很好。我制作了一个ICMP数据包,但没有提供Ether(),我注意到sr()如上所述工作。我还注意到scapy中的路由表不同步。我重新启动了它,现在它正在为sr()正确退出iface。感谢您的及时回应。 – Pradeep 2014-10-09 17:27:47

相关问题