We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Termux + Nmap и Masscan: автоматизированный сканинг сетей с последующим экспортом результатов в Elastic Stack

Профессиональный гайд по автоматизации сетевого сканирования в Termux с использованием Nmap и Masscan и экспортом результатов в Elastic Stack для централизованного анализа и мониторинга.

Termux стал удобной платформой для полевых работ и оперативной аналитики: небольшое устройство, терминал, скрипты и доступ к сетевым инструментам. В этой статье рассматривается практический подход к автоматизированному сканированию сетей с помощью Nmap и Masscan в среде Termux, а затем — к экспорту результатов в Elastic Stack (Elasticsearch/Logstash/Kibana) для последующего поиска, визуализации и корреляции.

Важно: выполняйте сканирование только в пределах полномочий и на объектах, где это разрешено. В рамках организации работ рекомендуется оформлять согласования и использовать сканирование для инвентаризации, аудита защищенности и мониторинга собственной инфраструктуры.

Архитектура решения

Предлагаемая схема состоит из трех частей:

  • Termux: запуск сканеров (Nmap / Masscan) по заданным диапазонам и сохранение результатов в файлы (XML/JSON/grepable format).
  • Экспорт и нормализация: преобразование результатов в удобный формат для загрузки в Elasticsearch (обычно через Logstash или напрямую через ingest pipeline).
  • Elastic Stack: централизованное хранение и анализ (Kibana dashboards, поиск по IP/порту/службе, корреляция по тегам и времени).

Такой подход помогает уйти от “разрозненных отчетов” и получить единое хранилище наблюдений: кто сканировал, когда, по каким диапазонам, какие порты/службы обнаружены.

Подготовка Termux

Перед установкой инструментов обновите пакеты и убедитесь, что у вас есть доступ к сети.

pkg update && pkg upgrade -y
pkg install -y nmap

Masscan в штатных репозиториях Termux может отсутствовать. На практике обычно используют один из вариантов: либо устанавливают prebuilt пакет (если доступен), либо компилируют из исходников, либо разворачивают массу аналогично через статическую сборку. Поскольку подход зависит от версии Termux/архитектуры устройства, рекомендуется заранее проверить доступность и обеспечить проверку целостности (SHA256) при загрузке бинарников.

Далее потребуется инструмент для работы с JSON (например, jq) и базовые средства для скриптинга.

pkg install -y jq python

Сценарии сканирования: Nmap

Nmap удобен для детальной проверки сервисов и получения структурированных данных. Для автоматизации важно использовать форматы вывода, которые легко парсить.

Пример: быстрый TCP-скан по диапазону с сохранением XML.

nmap -sS -T4 -p 1-1000 --open -oX scan_nmap_1000.xml 192.168.1.0/24

Пример: сканирование с определением версий (увеличивает длительность) и экспортом в удобный формат.

nmap -sS -sV -T4 -p 22,80,443 --open -oX scan_nmap_sv.xml 192.168.1.0/24

Для формирования “сырого” отчета без XML иногда используют output в grepable-формате, но для Elastic Stack чаще удобнее именно XML/JSON, чтобы исключить ошибки парсинга.

Сценарии сканирования: Masscan

Masscan рассчитан на высокоскоростной поиск “открыто/закрыто” по портам. Для массового инвентаринга важно понимать, что Masscan может выдавать большие объемы данных, а также требует аккуратной настройки лимитов скорости.

Пример: сканирование одного диапазона IP и набора портов с ограничением скорости (примерная настройка — выберите разумные значения под вашу сеть и регламент).

masscan 192.168.1.0/24 -p 1-1000 --rate 10000 -oL masscan_1k.txt

Если доступно в вашей сборке — используйте JSON-вывод (он упрощает обработку). Например:

masscan 192.168.1.0/24 -p 1-1000 --rate 10000 --output-format json -oJ masscan_1k.json

При выборе режима работы ориентируйтесь на политику организации: скорость сканирования должна соответствовать требованиям по нагрузке на сеть и оборудованию.

Автоматизация в Termux: скрипт запуска и каталогизация результатов

Чтобы не терять контекст (когда, что и по каким диапазонам сканировали), заведите единый каталог и сохраняйте метаданные.

mkdir -p ~/scanner-output/{nmap,masscan,meta}

Скрипт-обертка: запускает Nmap и Masscan, записывает дату/параметры в meta-файл и складывает результаты в соответствующие директории.

cat > ~/run-scan.sh <<'EOF'
#!/data/data/com.termux/files/usr/bin/bash
set -e

RANGE="192.168.1.0/24"
OUTDIR="$HOME/scanner-output"
TS="$(date -u +'%Y-%m-%dT%H-%M-%SZ')"

mkdir -p "$OUTDIR/nmap" "$OUTDIR/masscan" "$OUTDIR/meta"

echo "timestamp_utc=$TS" > "$OUTDIR/meta/run_$TS.txt"
echo "range=$RANGE" >> "$OUTDIR/meta/run_$TS.txt"

echo "[Nmap] start..."
nmap -sS -T4 -p 1-1000 --open -oX "$OUTDIR/nmap/nmap_1000_$TS.xml" "$RANGE"
echo "[Nmap] done"

echo "[Masscan] start..."
masscan "$RANGE" -p 1-1000 --rate 10000 -oL "$OUTDIR/masscan/masscan_1k_$TS.txt"
echo "[Masscan] done"
EOF
chmod +x ~/run-scan.sh

Запуск:

./run-scan.sh

Нормализация результатов для Elastic Stack

Elastic лучше работает с документами в формате JSON. Для этого обычно делают преобразование:

  • XML из Nmap превращают в JSON-структуры “host/port/service”.
  • Текст из Masscan (если нет JSON) парсят в структурированный вид.
  • Добавляют метаданные: timestamp, диапазон, сканер (nmap/masscan), версия/профиль (опционально).

Ниже пример простого “каркаса” логики на Python: вы читаете XML Nmap и формируете JSON-строки. Для промышленного применения потребуется расширить парсер (учесть state/service name, fingerprint и т.д.), но каркас показывает направление.

python - <<'PY'
import json
import xml.etree.ElementTree as ET
from datetime import datetime, timezone

xml_path = "~/scanner-output/nmap/nmap_1000_2026-06-14T00-00-00Z.xml"
# Замените на актуальный файл или организуйте чтение из аргументов командной строки.
xml_path = xml_path.replace('~', '')  # в примере упрощено

# Практичнее использовать os.path.expanduser, но оставим каркас.

def utc_now():
    return datetime.now(timezone.utc).isoformat()

# ВНИМАНИЕ: пример упрощен.
# Для реального парсинга используйте корректный путь и полную обработку.
try:
    tree = ET.parse(xml_path)
    root = tree.getroot()
except FileNotFoundError:
    print(json.dumps({"error": "XML not found. Update xml_path in script."}))
    raise

results = []
for host in root.findall('host'):
    addr = host.find('address')
    ip = addr.attrib.get('addr') if addr is not None else None
    for port in host.findall('ports/port'):
        portid = port.attrib.get('portid')
        proto = port.attrib.get('protocol')
        state = port.find('state')
        state_val = state.attrib.get('state') if state is not None else None

        doc = {
            "@timestamp": utc_now(),
            "source": "termux",
            "scanner": "nmap",
            "ip": ip,
            "port": int(portid) if portid and portid.isdigit() else portid,
            "protocol": proto,
            "state": state_val,
            "tags": ["inventory", "nmap"],
        }
        results.append(doc)

# Выведите JSON Lines (по одному документу на строку)
for d in results:
    print(json.dumps(d, ensure_ascii=False))
PY

Далее вы можете отправлять получившиеся JSON Lines в Elasticsearch (через Logstash или непосредственно). На практике часто удобнее:

  • либо использовать Logstash с входом “file” + фильтры;
  • либо создать ingest pipeline и отправлять документы через HTTP.

Вариант экспорта: загрузка в Elasticsearch через Logstash

Типовой путь: на сервере Elastic Stack настраивается Logstash-конвейер. Termux может передать результаты (например, по SSH/SCP, через общий каталог или облачное хранилище) — а Logstash уже прочитает и загрузит в Elasticsearch.

Пример конфигурации Logstash (концептуальный): вход читает JSON Lines, фильтры при необходимости дополняют поля, затем output отправляет в индекс.

input {
  file {
    path => "/var/log/scans/*.jsonl"
    start_position => "beginning"
    codec => json_lines
  }
}

filter {
  # При желании: добавить/нормализовать поля
  # mutate, date, geoip и т.п.
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "network-scans-%{+YYYY.MM.dd}"
  }
}

Такой подход хорошо масштабируется и позволяет централизованно управлять индексацией, шаблонами маппинга и жизненным циклом данных (ILM).

Маппинг и индексация: как сделать поиск удобным

Чтобы в Kibana комфортно искать по IP/портам/протоколам, рекомендуется продумать маппинг:

  • ip: тип ip (для корректных запросов и агрегаций).
  • port: integer.
  • protocol: keyword.
  • state: keyword.
  • @timestamp: date.

Если вы используете динамические маппинги — на старте всё равно лучше задать шаблоны, чтобы не получить “не те типы” и не блокировать индексацию.

Kibana: что визуализировать после загрузки

Практически полезные дашборды:

  • Топ открытых портов по диапазону/подсети.
  • График количества обнаружений по времени (с разбивкой по сканеру).
  • Список хостов, которые чаще всего меняют набор открытых портов.
  • Сравнение результатов Nmap и Masscan (как “грубая инвентаризация” vs “детальная проверка сервисов”).

С течением времени вы сможете строить корреляцию: обнаружили новый порт — проверьте, не совпадает ли это с изменениями в конфигурации или релизами.

Безопасность и соответствие требованиям

С точки зрения законодательства РФ и практик ИБ, сканирование и сбор информации должны выполняться законно и с согласованием. Рекомендуется:

  • иметь документально подтвержденные полномочия на обследование конкретных сегментов;
  • использовать сканирование в целях аудита/инвентаризации и мониторинга собственной инфраструктуры;
  • ограничивать скорость и объем запросов, чтобы не создавать недопустимую нагрузку;
  • вести журнал запусков: кто, где, когда, какие параметры, какие файлы результатов.

Если возникает необходимость изолировать рабочие контуры, VPN применяйте только для создания локальной сети между участниками работ (не для обхода блокировок).

Типовые ошибки

  • Нет структуры в результатах: если вы сохраняете “сырые” логи без унификации полей — экспорт в Elastic превращается в ручную работу.
  • Слишком высокая скорость Masscan: приводит к перегрузке сети или падению точности (учитывайте параметры rate и регламент).
  • Отсутствие timestamp/метаданных: без них сложно проводить корреляцию и строить тренды.
  • Неправильные типы полей в Elasticsearch: например, ip хранится как text, порт как keyword — и поиск становится менее удобным.

Заключение

Termux в связке с Nmap и Masscan позволяет быстро выполнять автоматизированный сбор сведений об открытых портах и сервисах. А экспорт результатов в Elastic Stack дает централизованное хранение и аналитические возможности: поиск по IP/портам, сравнение во времени и построение наглядных дашбордов в Kibana.

Если вам нужна помощь в разработке конвейера “Termux → нормализация → Elasticsearch/Logstash → Kibana”, настройке маппингов, шаблонов индексов и дашбордов под вашу инфраструктуру, команда РыбинскЛАБ выполнит внедрение и поддержку решения.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект