2010-11-22 250 views
4

我最近开始探索Scapy。确实是一个很棒的工具使用Scapy时,ICMP Ping数据包未生成回复

我有一个问题...当我使用Wireshark监控网卡时,我使用标准PING安装从系统命令提示符执行常规ping,wireshark弹出“Ping请求”,然后“Ping回复”表示它已发送回复。但是当我在Scapy手动执行它时,它不会回复回复。这怎么可能?我花了很多时间试图弄清楚这一点,所以我真的很希望有人能阐明我这个问题的一些轻......

这里是我使用的代码:

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

数据包发送成功Wireshark显示收到的Ping请求,但不是它已发送回应。

回答

5

存储的答复这是一个FAQ item

我无法ping 127.0.0.1。 Scapy不能与127.0.0.1或环回接口配合使用

环回接口是一个非常特殊的接口。经过它的包不是真正的组装和拆卸。内核将数据包路由到它的目的地,同时仍然存储内部结构。你所看到的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 |>> 
+0

我在那里找到了我的答案。显然,回送接口是“假的”,我不知道。谢谢! – Andesay 2010-11-22 15:44:07

+0

他们所说的“假”是指它永远不会构建以太网数据包。相反,IP分组直接从发送方“传送”(即复制)到接收方。这是回送接口的全部要点。 – 2010-11-22 15:52:34

0

试试这个

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

您无法正常

+0

仍然没有工作.. Wireshark只显示请求..这里是一个scapy ping的截图:http://tinypic.com/r/27z9ru9/7 和这里的一个正常的标准安装ping: http://tinypic.com/r/m7rleb/7 – Andesay 2010-11-22 14:12:25

+0

你确定有东西没有阻止回应吗? – 2010-11-22 14:12:59

+0

嗯,我不知道当正常的ping工作时应该是什么..我使用标准的ttl,标志等​​是否可以呢? – Andesay 2010-11-22 14:16:35