Termux предоставляет полноценную Linux‑среду прямо на Android‑устройстве. Это открывает возможности для сетевых специалистов: можно запускать скрипты на Python, использовать мощные библиотеки вроде Scapy и даже построить полноценный стек мониторинга с Grafana. В этой статье мы пошагово создадим интерактивный анализатор трафика, который будет собирать пакеты, извлекать ключевые метрики и отображать их в реальном времени.
Подготовка окружения в Termux
Для начала необходимо установить базовые пакеты и подготовить Python‑интерпретатор.
pkg update && pkg upgrade -y
pkg install python git wget curl -y
Убедитесь, что у вас установлен pip последней версии:
pip install --upgrade pip
Установка Scapy
Scapy — это гибкая библиотека для создания, отправки и анализа пакетов. Установим её вместе с зависимостями, необходимыми для работы в Android.
pip install scapy[complete]
Если при установке возникнут ошибки, связанные с отсутствием libpcap, установим его:
pkg install libpcap -y
Сбор пакетов в реальном времени
Создадим простой скрипт sniffer.py, который будет захватывать пакеты и выводить их в консоль.
cat > sniffer.py <<'EOF'
#!/usr/bin/env python3
from scapy.all import sniff, IP, TCP, UDP
import json
import time
# Функция обработки каждого пакета
def packet_handler(pkt):
if IP in pkt:
data = {
"timestamp": time.time(),
"src": pkt[IP].src,
"dst": pkt[IP].dst,
"proto": pkt[IP].proto,
"len": len(pkt)
}
if TCP in pkt:
data["sport"] = pkt[TCP].sport
data["dport"] = pkt[TCP].dport
elif UDP in pkt:
data["sport"] = pkt[UDP].sport
data["dport"] = pkt[UDP].dport
print(json.dumps(data))
# Запуск сниффера (весь трафик, без фильтра)
sniff(prn=packet_handler, store=False)
EOF
chmod +x sniffer.py
Запустим скрипт:
./sniffer.py
Каждая строка в stdout будет представлять собой JSON‑объект с базовыми полями пакета.
Экспорт метрик в InfluxDB
Для визуализации Grafana удобно использовать InfluxDB в качестве time‑series базы. На Android‑устройстве удобно запускать InfluxDB в Docker‑контейнере, однако в Termux проще установить его из готового бинарника.
# Скачиваем последнюю версию InfluxDB (v2) для ARM64
wget -O influxdb2.tar.gz https://dl.influxdata.com/influxdb/v2.7.0/influxdb2-2.7.0-linux-arm64.tar.gz
mkdir influxdb && tar -xzf influxdb2.tar.gz -C influxdb --strip-components=1
# Запускаем InfluxDB в фоне
./influxdb/influxd &
Создадим организацию и бакет через CLI:
./influxdb/influx setup \
--username admin \
--password admin123 \
--org myorg \
--bucket traffic \
--retention 30d \
--force
Теперь модифицируем sniffer.py, чтобы отправлять данные в InfluxDB через HTTP‑API.
cat > sniffer_influx.py <<'EOF'
#!/usr/bin/env python3
from scapy.all import sniff, IP, TCP, UDP
import json, time, requests, os
INFLUX_URL = "http://127.0.0.1:8086/api/v2/write?org=myorg&bucket=traffic&precision=s"
TOKEN = "admin123"
HEADERS = {"Authorization": f"Token {TOKEN}", "Content-Type": "text/plain"}
def packet_handler(pkt):
if IP in pkt:
line = f"packets,src={pkt[IP].src},dst={pkt[IP].dst},proto={pkt[IP].proto} length={len(pkt)}"
try:
requests.post(INFLUX_URL, data=line, headers=HEADERS, timeout=1)
except Exception as e:
print("[!] Influx error:", e)
sniff(prn=packet_handler, store=False)
EOF
chmod +x sniffer_influx.py
Запускаем скрипт и проверяем, что данные появляются в InfluxDB:
./sniffer_influx.py
Установка Grafana
Grafana также имеет ARM‑версии, которые работают в Termux. Скачиваем и распаковываем:
wget -O grafana.tar.gz https://dl.grafana.com/oss/release/grafana-10.2.3.linux-arm64.tar.gz
mkdir grafana && tar -xzf grafana.tar.gz -C grafana --strip-components=1
# Запускаем сервер Grafana
./grafana/bin/grafana-server --homepath ./grafana &
По умолчанию веб‑интерфейс доступен по http://127.0.0.1:3000. Войдите под admin / admin (пароль будет запрошен при первом входе).
Настройка источника данных InfluxDB в Grafana
- В Grafana перейдите в Configuration → Data Sources → Add data source.
- Выберите InfluxDB.
- Укажите URL
http://127.0.0.1:8086, токенadmin123, организациюmyorgи бакетtraffic. - Сохраните и проверьте подключение.
Создание дашборда для визуализации трафика
Добавим несколько панелей:
- Счётчик пакетов в секунду – запрос
SELECT count("length") FROM "packets" WHERE time > now() - 1m GROUP BY time(1s). - Топ‑10 IP‑адресов‑источников – запрос
SELECT sum("length") FROM "packets" GROUP BY "src" ORDER BY sum DESC LIMIT 10. - Протокольный микс – запрос
SELECT count("length") FROM "packets" GROUP BY "proto"(покажет долю TCP/UDP/ICMP).
Настраиваем автоподновление панелей (Refresh: 5s) – получаем почти «живую» картину сетевого трафика прямо на Android‑устройстве.
Дополнительные улучшения
Для более продвинутой аналитики можно добавить:
- Фильтрацию по интерфейсу (например,
sniff(iface="wlan0", …)). - Агрегацию по портам и построение топологии соединений.
- Отправку тревог в Telegram/Slack через Webhook, используя
requests. - Сохранение сырых пакетов в
pcapдля последующего offline‑анализа.
Тестирование и отладка
Проверьте работу в реальном времени, запустив iperf3 или открыв веб‑страницу в браузере телефона. В Grafana должны отразиться изменения в графиках без задержек.
Заключение
Мы построили полностью автономный анализатор трафика, работающий в Termux, использующий Scapy для захвата пакетов, InfluxDB для хранения метрик и Grafana для визуализации. Такой стек позволяет проводить быстрый аудит сети, отлаживать IoT‑устройства или обучать студентов практикам сетевой аналитики прямо на мобильном устройстве.
RybinskLab предлагает профессиональные услуги по настройке и кастомизации подобных решений, а также обучение персонала работе с Termux, Scapy и Grafana. Свяжитесь с нами, чтобы ускорить внедрение аналитики в ваш проект.