Пакет ICMP Ping не генерирует ответ при использовании Scapy - PullRequest
4 голосов
/ 22 ноября 2010

Я недавно начал изучать Scapy.Действительно замечательный инструмент!

У меня проблема ... Когда я отслеживаю свою сетевую карту с помощью Wireshark и выполняю обычный пинг из командной строки системы со стандартной установкой PING, wireshark выскакивает с «Ping request», а затем «Pingответить "указание, что он отправил ответ.Но когда я делаю это вручную в Scapy, он не отправляет ответ обратно. Как это может быть?Я потратил много времени, пытаясь выяснить это, поэтому я действительно надеюсь, что кто-то сможет пролить свет на мою проблему ...

Вот код, который я использовал:

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

пакет успешно отправлен, и Wireshark показывает полученный запрос Ping, но не отправляет ответ.

Ответы [ 2 ]

5 голосов
/ 22 ноября 2010

Это элемент FAQ :

Я не могу пропинговать 127.0.0.1.Scapy не работает с 127.0.0.1 или с интерфейсом обратной связи

Интерфейс обратной связи является очень специальным интерфейсом.Проходящие через него пакеты на самом деле не собираются и не разбираются.Ядро направляет пакет к месту назначения, пока оно все еще хранится во внутренней структуре.То, что вы видите с tcpdump -i lo, является лишь подделкой, чтобы заставить вас думать, что все нормально.Ядро не знает, что делает Scapy за его спиной, поэтому то, что вы видите на интерфейсе обратной связи, также является подделкой.Кроме этого не из местной структуры.Таким образом, ядро ​​никогда не получит его.

Чтобы общаться с локальными приложениями, вам нужно собрать свои пакеты на один уровень выше, используя сокет 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 голосов
/ 22 ноября 2010

Попробуйте это

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

Вы не правильно храните ответ

...