Termux предоставляет полноценную Linux‑среду на Android, что открывает возможности для разработки сетевых инструментов непосредственно на смартфоне. В этой статье мы создадим небольшой, но функциональный инструмент, который будет:
- Перехватывать пакеты в режиме реального времени.
- Парсить
.pcap‑файлы на лету. - Визуализировать трафик (графики, таблицы).
- Отправлять алерты при обнаружении подозрительных паттернов.
Все шаги выполняются в Termux без необходимости «root»‑прав.
Подготовка среды
Установим необходимые пакеты и зависимости.
pkg update && pkg upgrade -y
pkg install python git clang make -y
pip install --upgrade pip setuptools wheel
pip install scapy matplotlib pandas tqdm
Для захвата пакетов понадобится tcpdump. Он доступен в репозиториях Termux:
pkg install tcpdump -y
Убедитесь, что у Termux есть доступ к сети (разрешения READ_PHONE_STATE, ACCESS_NETWORK_STATE и INTERNET).
Перехват трафика в реальном времени
Запускаем tcpdump и сохраняем вывод в файл traffic.pcap. Флаг -U гарантирует запись пакетов по мере их появления.
tcpdump -i any -w traffic.pcap -U &
Процесс будет работать в фоне. При необходимости остановить его, используйте pkill tcpdump.
Парсинг pcap‑файла на лету
Создадим скрипт analyzer.py, который будет читать файл в режиме «tail» и обрабатывать новые пакеты с помощью Scapy.
#!/usr/bin/env python3
import os
import time
from scapy.all import PcapReader
import pandas as pd
from tqdm import tqdm
PCAP_PATH = "traffic.pcap"
OUTPUT_CSV = "traffic_log.csv"
# Если CSV уже существует – загрузим его, иначе создадим новый DataFrame
if os.path.exists(OUTPUT_CSV):
df = pd.read_csv(OUTPUT_CSV)
else:
df = pd.DataFrame(columns=["timestamp", "src_ip", "dst_ip", "proto", "len"])
def parse_packet(pkt):
ts = pkt.time
src = pkt[0][1].src if pkt.haslayer('IP') else "-"
dst = pkt[0][1].dst if pkt.haslayer('IP') else "-"
proto = pkt[0][1].proto if pkt.haslayer('IP') else "-"
length = len(pkt)
return {"timestamp": ts, "src_ip": src, "dst_ip": dst, "proto": proto, "len": length}
print("[+] Запуск парсера. Ожидание новых пакетов...")
while True:
if not os.path.exists(PCAP_PATH):
time.sleep(1)
continue
try:
with PcapReader(PCAP_PATH) as pcap_reader:
for pkt in pcap_reader:
record = parse_packet(pkt)
df = df.append(record, ignore_index=True)
# Сохраняем промежуточный результат каждые 100 записей
if len(df) % 100 == 0:
df.to_csv(OUTPUT_CSV, index=False)
except Exception as e:
# Ошибки могут возникать, пока файл «перезаписывается» tcpdump‑ом
time.sleep(0.5)
time.sleep(0.2)
Скрипт непрерывно читает traffic.pcap, добавляя новые строки в traffic_log.csv. Для экономии ресурсов рекомендуется запускать его в отдельном tmux‑сеансе:
pkg install tmux -y
tmux new -s analyzer
python3 analyzer.py
Визуализация трафика
Для построения графиков удобно использовать matplotlib или plotly. Ниже пример скрипта visualizer.py, который генерирует интерактивный HTML‑дешборд.
#!/usr/bin/env python3
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
CSV_PATH = "traffic_log.csv"
HTML_OUT = "dashboard.html"
df = pd.read_csv(CSV_PATH, parse_dates=["timestamp"])
# Трафик по протоколам за последние 5 минут
recent = df[df["timestamp"] > (pd.Timestamp.now() - pd.Timedelta(minutes=5))]
fig_proto = px.bar(recent.groupby("proto").size().reset_index(name="count"),
x="proto", y="count", title="Протоколы за последние 5 минут")
# Объём трафика во времени
fig_time = px.line(df.resample("1T", on="timestamp").sum().reset_index(),
x="timestamp", y="len", title="Объём трафика (байты) по минутам")
fig = go.Figure()
for f in [fig_proto, fig_time]:
for trace in f.data:
fig.add_trace(trace)
fig.update_layout(height=800, title_text="Дешборд сетевого трафика")
fig.write_html(HTML_OUT)
print(f"[+] Дешборд сохранён в {HTML_OUT}")
Запуск:
python3 visualizer.py
Полученный dashboard.html можно открыть в мобильном браузере и наблюдать за изменениями в реальном времени (обновляйте вручную или автоматизируйте через watch).
Алерты и уведомления
Для мгновенного реагирования удобно использовать push‑уведомления через сервисы Pushover или Telegram Bot. Ниже пример простейшего детектора DDoS‑потоков, отправляющего сообщение в Telegram при превышении порога в 1000 пакетов за секунду.
#!/usr/bin/env python3
import pandas as pd
import time
import requests
CSV_PATH = "traffic_log.csv"
TELEGRAM_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
THRESHOLD = 1000 # пакетов/сек
last_check = pd.Timestamp.now()
while True:
df = pd.read_csv(CSV_PATH, parse_dates=["timestamp"])
recent = df[df["timestamp"] > last_check]
pkt_per_sec = recent.shape[0] / max((pd.Timestamp.now() - last_check).seconds, 1)
if pkt_per_sec > THRESHOLD:
msg = f"⚠️ Высокий трафик: {pkt_per_sec:.1f} пакетов/сек"
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
requests.post(url, data={"chat_id": CHAT_ID, "text": msg})
print("[ALERT]", msg)
last_check = pd.Timestamp.now()
time.sleep(5)
Не забудьте заменить YOUR_TELEGRAM_BOT_TOKEN и YOUR_CHAT_ID на свои значения.
Оптимизация и рекомендации
- Для снижения нагрузки используйте фильтры
tcpdump(например,tcpdump -i any port 80 -w traffic.pcap). - Если нужен более глубокий анализ, подключите
nfdumpиSiLK‑библиотеки. - Запускайте скрипты в
tmuxилиscreen, чтобы они сохранялись при закрытии терминала. - Регулярно очищайте старые
.pcapи CSV‑файлы, чтобы не переполнять память.
Заключение
С помощью Termux, Python и наборов библиотек (Scapy, pandas, plotly) можно собрать полностью автономный инструмент анализа сетевого трафика, работающий прямо на Android‑устройстве. Такой подход полезен для полевых инженеров, специалистов по информационной безопасности и тех, кто хочет быстро отладить сетевые проблемы без доступа к настольному ПК.
Если вам нужен более масштабируемый сервис, кастомные правила детектирования, интеграция с SIEM‑системами или профессиональная настройка инфраструктуры мониторинга, обратитесь в RybinskLab. Мы предоставляем услуги разработки под Android, настройку безопасных сетевых решений и обучение персонала. Свяжитесь с нами, чтобы вывести ваш мониторинг на новый уровень.