
Здравствуйте, Хабр! Сегодня я хочу представить свой проект 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 — это проект с открытым исходным кодом, который я развиваю в свободное время. Буду рад любым отзывам, предложениям по улучшению и, конечно же, вкладу в проект от сообщества.
Проект размещен на GitHub: https://github.com/Niamorro/Netleaf
Если у вас есть вопросы или предложения, не стесняйтесь создавать issues на GitHub или обращаться напрямую.
Спасибо за внимание!
