Проверка диапазона IP-адресов с помощью Scapy

Я пытаюсь написать скрипт Python, который использует модуль Scapy для проверки связи с внутренним диапазоном IP-адресов, чтобы определить, какие IP-адреса находятся в сети. У меня есть это до сих пор:

#!/usr/bin/python
from scapy.all import *
conf.verb = 0
for ip in range(0, 256):
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
    reply = sr1(packet)
    if "192.168." in reply.src:
         print reply.src, "is online"

И программа какое-то время простоит, ничего не делая, а потом если я ее убью CTRL+C, то получу сообщение об ошибке:

Traceback (most recent call last):
File "sweep.py", line 7, in <module>
if "192.168." in reply.src:
AttributeError: 'NoneType' object has no attribute 'src'

Однако, если я попробую с одним IP-адресом вместо диапазона, это сработает. Так:

#!/usr/bin/python
from scapy.all import *
conf.verb = 0
packet = IP(dst="192.168.0.195", ttl=20)/ICMP()
reply = sr1(packet)
if "192.168." in reply.src:
    print reply.src, "is online"

Кто-нибудь знает, как я могу решить эту проблему? Или у вас есть другие идеи о том, как я могу пропинговать диапазон IP-адресов с помощью Scapy, чтобы определить, какие хосты находятся в сети?


person user961124    schedule 24.09.2011    source источник
comment
Ваша проблема связана с назначением возвращаемого значения sr1(packet) для ответа. Я не знаком с scapy, поэтому больше ничем помочь не могу, но начнем с этого.   -  person brc    schedule 24.09.2011


Ответы (3)


Вам просто нужно убедиться, что reply не является NoneType, как показано ниже... sr1() возвращает None, если вы получаете тайм-аут ожидания ответа. Вы также должны добавить timeout к sr1(), тайм-аут по умолчанию совершенно абсурден для ваших целей.

#!/usr/bin/python
from scapy.all import *

TIMEOUT = 2
conf.verb = 0
for ip in range(0, 256):
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
    reply = sr1(packet, timeout=TIMEOUT)
    if not (reply is None):
         print reply.dst, "is online"
    else:
         print "Timeout waiting for %s" % packet[IP].dst
person This    schedule 19.10.2011
comment
не будет package[IP].src печатать исходный IP-адрес, т. е. если вы пингуете с 10.1.1.1 на 10.1.1.7, и это не удается - ответ будет «Тайм-аут ожидания 10.1.1.1» вместо «Тайм-аут ожидания 10.1.1.7»? - person Saurabh Hirani; 12.11.2013

Вы не можете показать поле answer.src, если возвращаемая переменная равна нулю. Другими словами, вам нужно проверить, вернула ли переменная какое-то значение (если пинг прошел успешно). Вы можете сделать условие IF, чтобы получить поле .src, только если переменная не равна нулю.

person StarkBR    schedule 21.04.2012

FTR, Scapy поддерживает неявные генераторы. Это работает:

ans, unans = sr(IP(dst="192.169.0.1-255")/ICMP(), timeout=2) 

Затем повторите ответы.

Наверное, так лучше :)

person Cukic0d    schedule 13.07.2019