kilyabin a207890612
Build / Build Go Backend (push) Successful in 1m48s
Build / Build Nuxt Frontend (push) Failing after 13m16s
Build / Create Release (push) Has been skipped
fix(ci): upload artifact
2026-04-30 02:11:42 +04:00
2026-04-30 02:11:42 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:26:26 +04:00
2026-04-12 22:31:54 +04:00

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

Два сценария:

  1. DNS-туннелирование — проверяется длина каждой метки в имени запроса. Метка длиннее max_label_length символов — подозрение на туннелирование данных через DNS.
  2. Высокая частота — если один хост генерирует более query_threshold DNS-запросов за 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
S
Description
No description provided
Readme 623 KiB
Languages
Go 56.2%
Vue 38.8%
TypeScript 5%