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: https://github.com/Niamorro/Netleaf

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

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

Источник: https://habr.com/ru/articles/886544/


Интересные статьи

Интересные статьи

Из бета-теста вышел обновленный виджет телефонии для Битрикс24 от платформы коммуникаций UIS. Проведем обзор его функционала. Перейти к обзору Рейтинг 0 Просмотры 1 Добавить в закладки 0
И снова здравствуйте, уважаемые читатели!Первая часть статьи касалась общей информации по главным аспектам путешествия на солнечной тяге, вторая - будет более узкоспециализированной, рассчитанной на с...
Общение с людьми всегда было моей профессией и увлечением. Сначала я училась на журналиста, потом работала пиарщиком, после — бизнес-аналитиком в IT. В работе с любой ауд...
Если честно, к Д7 у меня несколько неоднозначное отношение. В некоторых местах я попискиваю от восторга, а в некоторых хочется топать ногами и ругаться неприличными словами.
Практически все коммерческие интернет-ресурсы создаются на уникальных платформах соответствующего типа. Среди них наибольшее распространение получил Битрикс24.