Здравствуйте, Хабр! Сегодня я хочу представить свой проект Netleaf — открытый инструмент для сканирования сети, написанный на Python с использованием PySide6 для графического интерфейса. Проект создавался с целью предложить простой, но функциональный инструмент для сканирования устройств локальной сети.
Что такое Netleaf и зачем он нужен
Netleaf — это кроссплатформенный инструмент для обнаружения устройств в локальной сети и сканирования портов. Основная идея заключалась в создании инструмента, который сочетает в себе простоту использования и достаточный функционал для решения базовых повседневных задач администрирования сети.
Ключевые особенности Netleaf:
-
Сканирование диапазона IP-адресов для обнаружения активных устройств в сети
-
Идентификация устройств включая получение MAC-адресов, имен устройств и производителей
-
Сканирование портов для выявления открытых служб на целевых устройствах
-
Гибкая настройка протоколов (ARP, ICMP, TCP, UDP)
-
Поддержка многопоточности для ускорения процесса сканирования
-
Темная и светлая темы интерфейса
-
Экспорт результатов в CSV-формат для дальнейшего анализа
Как устроен Netleaf
Проект построен модульно, что позволяет легко поддерживать и расширять его функциональность. Основные компоненты:
1. Архитектура приложения
Проект разделен на несколько модулей:
-
main.py — точка входа в приложение
-
devicescanner.py — основной класс графического интерфейса
-
scanner.py — реализация сканирования IP-адресов
-
port_scanner.py — реализация сканирования портов
-
settings_window.py — окно настроек
-
about_window.py — окно «О программе»
2. Технологии и библиотеки
Основные технологии, используемые в проекте:
-
Python — основной язык программирования
-
PySide6 — библиотека для создания графического интерфейса (Qt для Python)
-
Scapy — мощная библиотека для работы с сетевыми пакетами
-
Threading и concurrent.futures — для многопоточной работы
-
qdarktheme — для создания современного интерфейса с темной и светлой темами
3. Основные функциональные особенности
Сканирование диапазона IP-адресов
Сканирование IP выполняется с помощью класса ScannerThread, который использует несколько методик обнаружения устройств:
def run(self): ips = self.generate_ips(self.ip_start, self.ip_end) total_ips = len(ips) progress_step = 100 / total_ips with concurrent.futures.ThreadPoolExecutor(max_workers=self.settings['Scanning'].get('Threads', 100)) as executor: # Scanning list futures = [] for ip in ips: protocol_futures = [] if self.settings['Scanning']['Protocols']['ARP']: protocol_futures.append(executor.submit(self.arp_scan, ip)) if self.settings['Scanning']['Protocols']['ICMP']: protocol_futures.append(executor.submit(self.ping_device, ip)) # ...
Для каждого IP-адреса выполняется сканирование с использованием выбранных протоколов. Пользователь может включить или отключить отдельные протоколы через настройки.
Сканирование портов
Сканирование портов реализовано в классе PortScanner:
def scan_port(self, port): try: tcp_request = IP(dst=self.ip) / TCP(dport=port, flags="S") with self.lock: response = sr1(tcp_request, timeout=self.timeout, verbose=False) if response and response.haslayer(TCP): if response[TCP].flags & 0x12: # SYN-ACK service = self.get_service_name(port) return port, "Open", service elif response[TCP].flags & 0x14: # RST-ACK return port, "Closed", "" return port, "Filtered", "" except Exception as e: return port, f"Error: {str(e)}", ""
Для сканирования используется TCP SYN-сканирование, что позволяет быстро и относительно надежно определить состояние порта.
Особенности реализации и интересные моменты
Многопоточность
Одной из ключевых особенностей программы является использование многопоточности для ускорения сканирования. Пользователь может настроить количество потоков через интерфейс:
def start_scanning(self): self.progress_bar.setValue(0) self.devices_table.setRowCount(0) ip_start = self.ip_range_start.text() ip_end = self.ip_range_end.text() self.scanner_thread = ScannerThread(ip_start, ip_end, self.settings) self.scanner_thread.result_signal.connect(self.update_results) if not self.scanner_thread.isRunning(): self.scan_count += 1 self.scanner_thread.start()
Определение производителя по MAC-адресу
Для улучшения идентификации устройств я использовал библиотеку mac_vendor_lookup, которая позволяет по MAC-адресу определить производителя устройства:
def get_manufacturer(self, mac): if not mac: return "" try: return self.mac_lookup.lookup(mac) except: return ""
Настройка параметров сканирования
В программе предусмотрены настройки которые позволяют настроить процесс сканирования:
-
Выбор протоколов (ARP, ICMP, TCP, UDP)
-
Настройка таймаутов
-
Количество попыток
-
Порты TCP для сканирования
-
Количество потоков
Все настройки сохраняются в JSON-файл и загружаются при запуске программы:
def load_settings(self): if os.path.exists('settings.json'): with open('settings.json', 'r') as f: return json.load(f) else: return self.create_default_settings()
Интерфейс программы
Программа имеет интерфейс с поддержкой светлой и темной тем. Основные элементы интерфейса:
-
Основное окно с двумя вкладками: «IP Scan» и «Port Scan»
-
Панель управления для ввода диапазона IP-адресов или параметров сканирования портов
-
Таблица результатов для отображения найденных устройств или открытых портов
-
Индикатор прогресса для отображения статуса сканирования
-
Меню для доступа к дополнительным функциям
Как использовать Netleaf
Сканирование IP-адресов
-
В поле «IP Range» введите начальный и конечный IP-адреса
-
Нажмите кнопку «Scan Devices»
-
Наблюдайте за прогрессом сканирования
-
По завершении сканирования вы увидите список обнаруженных устройств
-
Используйте фильтр для отображения только интересующих вас устройств
Сканирование портов
-
Перейдите на вкладку «Port Scan»
-
Введите IP-адрес целевого устройства
-
Укажите диапазон портов для сканирования
-
Нажмите кнопку «Scan Ports»
-
По завершении сканирования вы увидите список открытых портов и сервисов
Экспорт результатов
-
Выберите «Save to File» в меню «File»
-
Укажите имя и расположение файла
-
Результаты сканирования будут сохранены в CSV-формате
Планы по развитию проекта
В будущем я планирую расширить функциональность Netleaf:
-
Сканирование ресурсов HTTP, HTTPS, FTP
-
Сканирование Bluetooth устройств
Установка и запуск
Netleaf доступен для различных платформ:
-
Windows: NetleafSetup.exe
-
Linux (Debian/Ubuntu): .deb пакет
-
Linux (Fedora/openSUSE/RHEL): .rpm пакет
Для установки:
-
Перейдите на страницу Releases
-
Загрузите установщик для вашей операционной системы
-
Установите программу, следуя инструкциям
Для запуска из исходного кода:
-
Клонируйте репозиторий: git clone https://github.com/Niamorro/Netleaf
-
Установите зависимости: pip install -r requirements.txt
-
Запустите программу: python main.py
Заключение
Netleaf — это проект с открытым исходным кодом, который я развиваю в свободное время. Буду рад любым отзывам, предложениям по улучшению и, конечно же, вкладу в проект от сообщества.
Если у вас есть вопросы или предложения, не стесняйтесь создавать issues на GitHub или обращаться напрямую.
Спасибо за внимание!
ссылка на оригинал статьи https://habr.com/ru/articles/886544/
Добавить комментарий