Netleaf: разрабатываем открытый сканер сети на Python и PySide6

от автора

Netleaf

Netleaf

Здравствуйте, Хабр! Сегодня я хочу представить свой проект 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()

Интерфейс программы

Программа имеет интерфейс с поддержкой светлой и темной тем. Основные элементы интерфейса:

  1. Основное окно с двумя вкладками: «IP Scan» и «Port Scan»

  2. Панель управления для ввода диапазона IP-адресов или параметров сканирования портов

  3. Таблица результатов для отображения найденных устройств или открытых портов

  4. Индикатор прогресса для отображения статуса сканирования

  5. Меню для доступа к дополнительным функциям

Интерфейс Netleaf

Интерфейс Netleaf

Как использовать Netleaf

Сканирование IP-адресов

  1. В поле «IP Range» введите начальный и конечный IP-адреса

  2. Нажмите кнопку «Scan Devices»

  3. Наблюдайте за прогрессом сканирования

  4. По завершении сканирования вы увидите список обнаруженных устройств

  5. Используйте фильтр для отображения только интересующих вас устройств

Сканирование портов

  1. Перейдите на вкладку «Port Scan»

  2. Введите IP-адрес целевого устройства

  3. Укажите диапазон портов для сканирования

  4. Нажмите кнопку «Scan Ports»

  5. По завершении сканирования вы увидите список открытых портов и сервисов

Экспорт результатов

  1. Выберите «Save to File» в меню «File»

  2. Укажите имя и расположение файла

  3. Результаты сканирования будут сохранены в CSV-формате

Планы по развитию проекта

В будущем я планирую расширить функциональность Netleaf:

  1. Сканирование ресурсов HTTP, HTTPS, FTP

  2. Сканирование Bluetooth устройств

Установка и запуск

Netleaf доступен для различных платформ:

  • Windows: NetleafSetup.exe

  • Linux (Debian/Ubuntu): .deb пакет

  • Linux (Fedora/openSUSE/RHEL): .rpm пакет

Для установки:

  1. Перейдите на страницу Releases

  2. Загрузите установщик для вашей операционной системы

  3. Установите программу, следуя инструкциям

Для запуска из исходного кода:

  1. Клонируйте репозиторий: git clone https://github.com/Niamorro/Netleaf

  2. Установите зависимости: pip install -r requirements.txt

  3. Запустите программу: python main.py

Заключение

Netleaf — это проект с открытым исходным кодом, который я развиваю в свободное время. Буду рад любым отзывам, предложениям по улучшению и, конечно же, вкладу в проект от сообщества.

Проект размещен на GitHub

Если у вас есть вопросы или предложения, не стесняйтесь создавать issues на GitHub или обращаться напрямую.

Спасибо за внимание!


ссылка на оригинал статьи https://habr.com/ru/articles/886544/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *