使用Scapy时,ICMP Ping数据包不会生成回复

时间:2010-11-22 13:23:08

标签: python ping scapy

我最近开始探索Scapy。确实是一个很棒的工具

我遇到问题...当我使用Wireshark监控我的网卡并且我使用标准PING安装从系统命令提示符执行常规ping时,wireshark会弹出“Ping请求”然后“Ping reply”指示它发了回复。但是,当我在Scapy中手动执行此操作时,它不会回复任何回复..这怎么可能?我花了很多时间试图解决这个问题,所以我真的希望有人可以对我这个问题有所了解......

以下是我使用的代码:

>>> from scapy.all import IP, ICMP, send
>>> IP = IP(dst="127.0.0.1")
>>> Ping = ICMP()
>>> send(IP/Ping)

数据包发送成功,Wireshark显示收到的Ping请求,但并未发送回复。

2 个答案:

答案 0 :(得分:5)

这是FAQ item

  

我无法ping 127.0.0.1。 Scapy不适用于127.0.0.1或环回接口

     

loopback接口是一个非常特殊的接口。通过它的数据包并没有真正组装和拆解。内核将数据包路由到其目标,同时它仍然存储在内部结构中。您使用tcpdump -i lo看到的只是假的,让您认为一切正常。内核不知道Scapy在他背后做了什么,所以你在loopback接口上看到的也是假的。除此之外,并非来自当地的结构。因此内核永远不会收到它。

     

为了与本地应用程序对话,您需要使用PF_INET / SOCK_RAW套接字而不是PF_PACKET / SOCK_RAW(或其他Linux系统上的等效套接字)构建高一层的数据包:

>>> conf.L3socket
<class __main__.L3PacketSocket at 0xb7bdf5fc>
>>> conf.L3socket=L3RawSocket
>>> sr1(IP(dst="127.0.0.1")/ICMP())
<IP  version=4L ihl=5L tos=0x0 len=28 id=40953 flags= frag=0L ttl=64 proto=ICMP chksum=0xdce5 src=127.0.0.1 dst=127.0.0.1 options='' |<ICMP  type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |>>

答案 1 :(得分:0)

试试这个

def ping(host, repeat=3):
    packet = IP(dst=host)/ICMP()
    for x in range(repeat):
        response = sr1(packet)
        response.show2()

您没有正确存储回复