使用Scapy时ICMP Ping包未生成回复

6 投票
2 回答
11261 浏览
提问于 2025-04-16 07:27

我最近开始研究Scapy,这真是一个很棒的工具!

不过我遇到了一个问题……当我用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请求,但没有显示它发送了回复。

2 个回答

0

试试这个

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

你没有正确地保存回复

8

这是一个常见问题

我无法对127.0.0.1进行ping测试。Scapy在127.0.0.1或回环接口上无法工作

回环接口是一个非常特殊的接口。通过它发送的数据包并不是像正常那样被组装和拆解。内核在数据包还存储在内部结构时,就已经将它路由到目的地。你在使用tcpdump -i lo看到的只是一个假象,让你觉得一切正常。内核并不知道Scapy在背后做了什么,所以你在回环接口上看到的也是假象。只是这个假象并不是来自本地结构。因此,内核永远不会接收到它。

要与本地应用程序进行通信,你需要在更高的层次上构建你的数据包,使用PF_INET/SOCK_RAW套接字,而不是PF_PACKET/SOCK_RAW(或其他系统中相应的类型):

>>> 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 |>>

撰写回答