CLI-инструмент на Bash для массовой сетевой диагностики: DNS/PTR, ICMP, TCP/UDP, ARP/NDP, измерение задержек и экспорт CSV/JSONL
  • Shell 83.5%
  • Python 16.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-01 14:35:42 +10:00
tests Улучшение TUI. Оптимизация работы на слабых системах. 2026-11-01 14:35:42 +10:00
.gitignore .gitignore init 2026-11-01 11:51:22 +10:00
LICENSE Initial commit 2026-10-10 14:32:08 +00:00
netsp.sh Улучшение TUI. Оптимизация работы на слабых системах. 2026-11-01 14:35:42 +10:00
README.md Первичная реализация TUI интерфейса. 2026-11-01 12:47:39 +10:00

NetSP: Reforged

Network Simple Probe — CLI-инструмент на Bash для проверки доступности хостов и сетевых сервисов. Поддерживает DNS/PTR, ICMP, TCP/UDP, ARP/NDP, измерение задержек, параллельные проверки и экспорт результатов.

NetSP работает с одиночными IP-адресами, DNS-именами, сетями IPv4/IPv6 в формате CIDR и смешанными списками целей. Для сетевых проверок использует доступные системные утилиты и выбирает подходящий backend.

Проект основан на michaell/netsp. Reforged — отдельная ветка развития с акцентом на точность диагностики, надёжность и удобство массовых проверок.

Содержание

Быстрый старт

Требования: Linux, Bash 4.3+. Для выбранных типов проверок нужны соответствующие системные утилиты (см. ниже). Установка самого NetSP не требуется.

git clone https://git.rootnode.ru/rolincero/netsp-reforged.git
cd netsp-reforged
chmod +x netsp.sh
./netsp.sh -h

Проверка сервера по ICMP и TCP:

./netsp.sh --ping -p 22,443 -t 2 srv-01.example.org

Проверка небольшой сети IPv4:

./netsp.sh --ping -P 16 --no-reverse -n 192.0.2.0/28

Зависимости по назначению:

Задача Основные команды Резервные варианты
DNS и PTR dig host, getent
ICMP fping ping
TCP nmap nc (--use-nc для принудительного выбора)
UDP nmap nc -u (неоднозначные результаты)
ARP/NDP arping ip neigh, arp
Вспомогательные операции coreutils, awk, стандартные системные утилиты Зависит от окружения

На Arch Linux рекомендуемый набор:

sudo pacman -S --needed bash bind nmap fping openbsd-netcat iputils iproute2 coreutils gawk

Это рекомендуемые пакеты, а не обязательные зависимости каждого запуска. Названия пакетов отличаются между дистрибутивами. Отдельные проверки ARP/UDP могут потребовать root или CAP_NET_RAW.

Терминальный интерфейс

В интерактивном терминале NetSP автоматически использует альтернативный экран: во время проверки показывает прогресс по фактически завершённым целям, число online/offline/unknown и последние результаты. После завершения экран закрывается, а итоговая таблица остаётся в обычной истории терминала. Предыдущий вывод не очищается.

# Меню настройки: цель или файл, ICMP, порты, ARP, таймаут, параллельность, DNS
./netsp.sh

# Прогресс для готовой команды (при запуске в TTY)
./netsp.sh --ping -P 16 --no-reverse 192.168.10.0/28

# Принудительное включение TUI / возврат к обычному CLI
./netsp.sh --tui --ping 192.168.10.1
./netsp.sh --no-tui --ping 192.168.10.1

В меню выбирайте пункты 1–9, вводите значения по подсказкам, затем нажмите Enter для запуска или q для выхода. По умолчанию в меню включён ICMP. При Ctrl+C во время диагностики NetSP восстанавливает основной экран и возвращает код 130.

Автоматизация не меняется: если stdout или stdin не является терминалом, установлен TERM=dumb, либо выбран --csv/--json, TUI не включается. Для машинного вывода используются прежние форматы без ANSI-последовательностей. Явный --tui без подходящего терминала или с машинным форматом завершается ошибкой. --no-tui также сохраняет старый построчный ввод EOF при запуске без целей.

TUI использует ANSI, /dev/tty и stty, без dialog, whiptail или других дополнительных UI-зависимостей. Предупреждения о зависимостях выводятся до запуска экрана; во время сканирования таблица формируется после завершения всех задач в исходном порядке.

Возможности

  • DNS/PTR: прямое и обратное разрешение; выбор IPv4/IPv6 (-4/-6); собственный суффикс для коротких имён (--domain).
  • ICMP: проверка узла через fping или ping, настройка количества пакетов и таймаута.
  • TCP: проверка набора портов через nmap или nc.
  • UDP: проверка через nmap -sU или резервный nc -u с учётом неопределённости ответа.
  • ARP/NDP: проверка в локальном сегменте, опциональное обновление таблицы соседей.
  • RTT: измерение задержки доступными методами (auto, nmap, tcp, ping).
  • Массовая обработка: входной файл, интерактивное меню, IPv4/IPv6 CIDR, дедупликация и ограниченный параллелизм.
  • Экспорт: терминал, CSV (;), JSONL; сравнение статусов с предыдущим запуском (--diff).

Как определяется статус

Статус Смысл
online Выбранная проверка дала положительное подтверждение доступности.
offline Выбранные проверки не дали положительного или неоднозначного результата.
unknown Результат не определён: например, ошибка DNS, неопределённый ответ UDP или режим только DNS.

Важно: доступность хоста не означает, что конкретный порт или сервис работает. DNS-резолвинг также не доказывает доступности узла.

CIDR и списки целей

IPv4 и IPv6 CIDR разворачиваются в отдельные адреса до начала проверок. Дополнительные утилиты для раскрытия подсетей не нужны.

./netsp.sh --ping 192.168.10.0/30
./netsp.sh --ping -6 2001:db8::/126

Для сети 192.168.10.0/30 проверяются все четыре адреса: .0, .1, .2, .3. Адрес сети и broadcast не исключаются, поскольку NetSP выполняет проверку указанных IP, а не выдаёт список назначаемых хостам адресов. Для /31 и /32 действует то же правило.

Смешанный список targets.txt:

# Серверы и подсети
192.168.10.1
192.168.20.0/29
2001:db8::/126
srv-01.example.org
./netsp.sh -f targets.txt --ping -P 20 -t 2 --json -o results.jsonl

Правила обработки:

  • CIDR с адресом внутри сети (например, 192.168.10.5/30) нормализуется до границы сети (192.168.10.4/30).
  • IPv6-адреса в результате приводятся к сокращённой форме; IPv4-mapped IPv6 записываются в шестнадцатеричном виде.
  • Цели из разных строк и диапазонов дедуплицируются после раскрытия (отключается --no-dedup).
  • По умолчанию разрешено 4096 входных целей, с учётом всех раскрытых диапазонов до дедупликации. --max-targets N увеличивает предел максимум до 65536.
  • Если предел превышен, CIDR некорректен или семейство сети противоречит -4/-6, выполнение прерывается до сетевых проверок.

Для крупных сетей выбирайте осмысленный уровень параллелизма (-P) и таймаут (-t). Опция --max-targets управляет количеством целей, а не скоростью их обработки.

Примеры

Только DNS/PTR, без проверки доступности:

./netsp.sh --resolve-only -f targets.txt --json -o dns.jsonl

Проверка TCP/UDP-портов:

./netsp.sh -p 22,80,443 -u 53 -t 2 srv-01.example.org

Проверка локального сегмента через ARP/NDP:

./netsp.sh --arp --arp-refresh -f targets.txt -P 16

Измерение задержек:

./netsp.sh --ping --latency --latency-method ping 192.0.2.1

Массовый вывод в CSV без создания файла по умолчанию:

./netsp.sh --ping -f targets.txt -P 32 --csv -n

Повторная проверка с пометкой изменений статуса:

./netsp.sh --ping -f targets.txt --diff

Параметры CLI

Актуальная справка всегда доступна через ./netsp.sh -h.

Группа Параметры Назначение
Вход хост, CIDR, файл, -f ФАЙЛ Одна цель, сеть или файл; без аргументов в TTY меню, без TTY построчный ввод до EOF.
Проверки --ping, --arp, --arp-refresh ICMP, ARP/NDP и обновление таблицы соседей.
Порты -p ПОРТЫ, -u ПОРТЫ TCP и UDP; порты через запятую.
Задержки --latency, --latency-method (auto, nmap, tcp, ping) Показ RTT и способ измерения.
Таймауты -t СЕК, --nmap-timeout СЕК, -c N Таймауты и число ICMP-пакетов.
DNS --resolve-only, --domain ДОМЕН, --no-default-domain, --no-reverse Управление разрешением имён.
IP -4, -6, -I ИНТЕРФЕЙС Семейство адресов и сетевой интерфейс.
Массовость -P N, --force-parallel, --delay СЕК Параллелизм (обычный максимум 64) и задержка запуска.
Цели --max-targets N, --no-dedup Лимит раскрытых целей и отключение дедупликации.
Вывод -o ФАЙЛ, -n, -l ФАЙЛ, --csv, --json, --diff, --tui, --no-tui Файл результата, лог, формат, сравнение статусов и управление TUI.
Backend --use-nc Использовать nc для TCP вместо предпочтительного nmap.
Диагностика -v, --debug, -h Подробные ошибки DNS, отладка, справка.

Форматы ввода: для имени без точки по умолчанию добавляется встроенный корпоративный DNS-суффикс tn.tngrp.ru. Для работы в другой сети укажите --domain example.org; для отключения автоматической подстановки используйте --no-default-domain (при вводе коротких имён потребуется указать домен). Это унаследованное поведение текущей версии.

Результаты и коды завершения

По умолчанию выводится имя, IP, статус и детали проверок:

srv-01.example.org                  192.0.2.10                              online     ping tcp_open:22/tcp

Результат JSONL (--json):

{"name":"srv-01.example.org","ip":"192.0.2.10","status":"online","details":"ping tcp_open:22/tcp","changed":false}

Результат CSV (--csv, разделитель ;, без заголовка):

srv-01.example.org;192.0.2.10;online;ping tcp_open:22/tcp

Примеры иллюстрируют формат, а не реальный результат проверки. При использовании входного файла без -n программа по умолчанию создаёт файл результатов рядом с запуском; -o позволяет задать путь явно. Лог ошибок разрешения имён по умолчанию: errors.log. Кэш --diff: ${XDG_CACHE_HOME:-$HOME/.cache}/netsp/cache.

Код Значение
0 Нет offline/unknown, нет деградации зависимостей.
1 Ошибка параметров или запуска (в том числе некорректный CIDR/превышение лимита).
2 Есть хотя бы одна цель offline.
3 Есть хотя бы одна цель unknown, если не было offline.
4 Использован fallback/degraded backend без offline и unknown.

При --resolve-only успешно разрешённый адрес в текущей реализации получает деталь resolved, но агрегированный статус unknown, поэтому код завершения может быть 3. Это не означает, что DNS-запрос завершился ошибкой.

Проверка изменений

Наборы регрессионных тестов CIDR и TUI работают локально без сетевых запросов (для TUI используется псевдотерминал и подменённый fping). Для запуска нужен Python 3 только в среде разработки; при выполнении netsp.sh Python не используется.

bash -n netsp.sh
python3 -m unittest discover -s tests -v

Ограничения

  • Проверки выполняются только по выбранным механизмам. offline не обязательно означает, что устройство выключено: фильтры и ACL могут блокировать ответы.
  • Результаты UDP, особенно при nc -u, часто неоднозначны. open|filtered нельзя безоговорочно считать открытым портом.
  • --diff сравнивает агрегированный статус по имени. При --no-reverse IP-адреса могут отображаться с именем unknown, из-за чего сравнение нескольких IP не следует считать надёжным.
  • Использование ip neigh как fallback для ARP/NDP может опираться на существующие записи соседей, а не на новый ответ устройства.
  • Начиная с текущей версии для TCP требуются nmap или nc; прежний backend Bash /dev/tcp удалён.
  • Скрипт рассчитан на Linux и использует Linux-ориентированные команды. Совместимость со всеми Unix-подобными ОС не заявляется.

Лицензия

MIT. Оригинальная реализация: michaell, 2026. Авторские уведомления исходного проекта сохранены.