11 KiB
DIP-IDS — Система обнаружения вторжений на основе анализа сетевого трафика
Дипломная практическая работа. Сетевая IDS с веб-панелью управления и генерацией PDF-отчётов.
Быстрый старт
Требования
| Компонент | Версия |
|---|---|
| Go | ≥ 1.22 |
| Bun | ≥ 1.1 |
| libpcap | любая |
| Linux | — |
# Debian/Ubuntu
sudo apt install libpcap-dev gcc
# Arch
sudo pacman -S libpcap gcc
Бэкенд
cd /path/to/dip-ids
go mod tidy
go build -o nids ./cmd/ids
sudo ./nids # sudo нужен для live-захвата
По умолчанию API поднимается на http://0.0.0.0:8080.
Фронтенд (dev)
cd frontend
bun install
bun run dev # http://localhost:3000
Nuxt автоматически проксирует /api/* → localhost:8080.
Сборка для продакшена
cd frontend
bun run generate # статические файлы в frontend/.output/public/
Готовые файлы можно раздавать любым статическим сервером или встроить в Go-бинарник через //go:embed.
Архитектура
┌──────────────────────────────────────────────────────────────┐
│ Nuxt 3 Frontend │
│ Dashboard · Alerts · Capture · Stats │
│ Nuxt UI · Chart.js · vue-chartjs │
└─────────────────────────┬────────────────────────────────────┘
│ HTTP / REST API
┌─────────────────────────▼────────────────────────────────────┐
│ Go Backend │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Capture │──▶│ Engine │──▶│ Storage │ │
│ │ │ │ │ │ SQLite (GORM) │ │
│ │ Live │ │ PortScan │ └──────────────────────┘ │
│ │ PCAP │ │ BruteForce │ │
│ └──────────┘ │ DoS │ ┌──────────────────────┐ │
│ │ ARPSpoof │──▶│ PDF Report │ │
│ │ DNSAnomaly │ │ (maroto v2) │ │
│ └──────────────┘ └──────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
REST API
Алерты
| Метод | Путь | Описание |
|---|---|---|
GET |
/api/alerts |
Список алертов (фильтрация, пагинация) |
DELETE |
/api/alerts |
Удалить все алерты |
DELETE |
/api/alerts/:id |
Удалить алерт по ID |
Параметры GET /api/alerts:
| Параметр | Тип | Описание |
|---|---|---|
type |
string | Тип атаки (port_scan, brute_force...) |
severity |
string | Уровень (critical, high, medium, low) |
src_ip |
string | IP-адрес источника |
page |
int | Номер страницы (по умолч. 1) |
page_size |
int | Размер страницы (по умолч. 50) |
Статистика
| Метод | Путь | Описание |
|---|---|---|
GET |
/api/stats/summary |
Сводка: total, by_severity, by_type |
GET |
/api/stats/timeline |
Алерты по часам (?hours=24) |
GET |
/api/stats/top-ips |
Топ источников (?limit=10) |
Захват
| Метод | Путь | Описание |
|---|---|---|
GET |
/api/capture/interfaces |
Список сетевых интерфейсов |
GET |
/api/capture/status |
Статус текущей сессии |
GET |
/api/capture/sessions |
История сессий |
POST |
/api/capture/start |
Начать live-захват |
POST |
/api/capture/stop |
Остановить захват |
POST |
/api/capture/upload |
Загрузить и анализировать PCAP |
POST /api/capture/start body:
{ "interface": "eth0" }
Отчёты
| Метод | Путь | Описание |
|---|---|---|
GET |
/api/reports/generate |
Скачать PDF-отчёт |
Конфигурация
Файл configs/config.yaml:
server:
host: "0.0.0.0"
port: 8080
database:
path: "nids.db" # путь к SQLite файлу
capture:
default_interface: "eth0"
snaplen: 65535
promiscuous: true
detectors:
port_scan:
enabled: true
threshold: 15 # уникальных портов за window_seconds
window_seconds: 10
severity: "high"
brute_force:
enabled: true
threshold: 10 # попыток подключения за window_seconds
window_seconds: 30
severity: "critical"
ports: [22, 21, 23, 3389, 5900, 25, 110, 143]
dos:
enabled: true
pps_threshold: 1000 # пакетов в секунду
window_seconds: 1
severity: "critical"
arp_spoof:
enabled: true
severity: "critical"
dns_anomaly:
enabled: true
max_label_length: 50 # макс. длина DNS-метки
query_threshold: 200 # запросов за window_seconds
window_seconds: 60
severity: "medium"
Алгоритмы обнаружения
Port Scan (Сканирование портов)
Детектор ведёт таблицу srcIP → {dstPort → []timestamp}. Для каждого входящего TCP SYN-пакета регистрируется новое обращение к порту назначения. Устаревшие записи (старше window_seconds) удаляются (sliding window). Если количество уникальных портов назначения превышает threshold — генерируется алерт.
Brute Force (Перебор паролей)
Мониторятся только соединения к портам из списка ports (SSH, FTP, RDP и др.). Счётчик SYN-пакетов от одного источника к одному порту назначения ведётся в скользящем окне. Превышение threshold за window_seconds — алерт.
DoS/DDoS
Считается общий поток пакетов от каждого источника в окне window_seconds. При превышении pps_threshold пакетов в секунду генерируется алерт категории critical.
ARP Spoofing
Ведётся таблица соответствия IP → MAC. При получении ARP Reply проверяется, не изменился ли MAC для уже известного IP-адреса. Изменение MAC — признак подмены ARP-записей (Man-in-the-Middle).
DNS Anomaly
Два сценария:
- DNS-туннелирование — проверяется длина каждой метки в имени запроса. Метка длиннее
max_label_lengthсимволов — подозрение на туннелирование данных через DNS. - Высокая частота — если один хост генерирует более
query_thresholdDNS-запросов заwindow_seconds— алерт.
Тестирование
Для тестирования можно использовать инструкции из документации /docs/testing.md
Структура проекта
dip-ids/
├── cmd/ids/main.go # точка входа
├── internal/
│ ├── config/config.go # загрузка конфигурации
│ ├── storage/
│ │ ├── models.go # GORM модели
│ │ └── db.go # CRUD операции
│ ├── capture/capture.go # live и pcap захват
│ ├── analyzer/
│ │ ├── engine.go # основной движок
│ │ ├── detector.go # интерфейс детектора
│ │ ├── portscan.go
│ │ ├── bruteforce.go
│ │ ├── dos.go
│ │ ├── arp.go
│ │ └── dns.go
│ ├── api/
│ │ ├── server.go # Gin HTTP сервер
│ │ └── handlers/ # обработчики маршрутов
│ └── report/pdf.go # генерация PDF (maroto v2)
├── frontend/ # Nuxt 3 + Nuxt UI
│ ├── pages/
│ │ ├── index.vue # дашборд
│ │ ├── alerts.vue # журнал алертов
│ │ ├── capture.vue # управление захватом
│ │ └── stats.vue # статистика
│ ├── components/
│ ├── composables/
│ ├── layouts/default.vue
│ ├── nuxt.config.ts
│ └── package.json
├── configs/config.yaml
└── README.md