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 -ypkg install -y nmapMasscan в штатных репозиториях 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”, настройке маппингов, шаблонов индексов и дашбордов под вашу инфраструктуру, команда РыбинскЛАБ выполнит внедрение и поддержку решения.