Профессиональный анализатор доступности сетевых ресурсов с PostgreSQL и расширенными проверками безопасности.
Network Availability Monitor - приложение для мониторинга доступности сетевых ресурсов с поддержкой различных протоколов (HTTP/HTTPS, SSH, FTP, SMTP, PostgreSQL). Приложение использует PostgreSQL для хранения данных и истории проверок.
- Мониторинг различных протоколов: HTTP/HTTPS, SSH, FTP, SMTP, PostgreSQL, Custom TCP
- Комплексные проверки: DNS lookup, ICMP ping, TCP connect, SSL certificate validation
- Диагностика блокировок: DNS spoofing, IP blocking, port blocking, DPI detection
- Автоматический мониторинг: планировщик задач с настраиваемыми интервалами
- Прокси поддержка: HTTP и SOCKS5
- Docker интеграция: изолированная PostgreSQL БД в контейнере
- Linux (Ubuntu 22.04+, Debian 11+, Arch Linux)
- PostgreSQL 12+ (или Docker для изолированной БД)
- Qt 6.2+
- CMake 3.16+
- Компилятор C++17 (GCC 9+, Clang 10+)
- Docker & Docker Compose (опционально, но рекомендуется)
# Ubuntu/Debian
sudo apt update
sudo apt install -y \
build-essential \
cmake \
qt6-base-dev \
libqt6sql6-psql \
libpq-dev \
docker.io \
docker-compose
# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker
# Arch Linux
sudo pacman -S \
base-devel \
cmake \
qt6-base \
docker \
docker-compose
sudo systemctl enable --now docker# Автоматическая настройка
./docker-setup.sh
# Или вручную
docker-compose -f docker/docker-compose.yml up -d
# Сборка приложения
cmake -S . -B build
cmake --build build -j$(nproc)
# Запуск
./build/NetworkAvailabilityAnalyzerПреимущества:
- ✅ Не нужно настраивать системный PostgreSQL
- ✅ Изолированная БД в Docker контейнере
- ✅ Работает одинаково на всех машинах
- ✅ Легко удалить:
docker-compose -f docker/docker-compose.yml down -v
- Введите URL или IP адрес в поле ввода
- Выберите тип сервиса (HTTP, SSH, FTP, и т.д.)
- Укажите порт (опционально)
- Установите интервал мониторинга (в секундах)
- Нажмите "Add Resource"
- Разовая проверка: нажмите "Check All Resources"
- Автоматический мониторинг: нажмите "Start Monitoring"
- Тестирование одного ресурса: правый клик на ресурсе -> Test
coursework/
├── src/
│ ├── main.cpp # Точка входа
│ ├── controller/ # Контроллеры (MVC)
│ │ ├── AppController.cpp
│ │ └── AppController.h
│ ├── model/ # Модели данных
│ │ ├── DatabaseManager.cpp # PostgreSQL менеджер
│ │ ├── SimpleORM.h # Собственный ORM
│ │ ├── Resource.h # ORM модель ресурсов
│ │ ├── CheckHistory.h # ORM модель истории
│ │ ├── NetworkWorker.cpp # Сетевые проверки
│ │ ├── AnalysisEngine.cpp # Анализ результатов
│ │ └── MonitorScheduler.cpp # Планировщик задач
│ └── view/ # UI (MVC)
│ ├── MainWindow.cpp
│ └── MainWindow.h
├── docker/ # Docker конфигурация
│ ├── Dockerfile
│ └── docker-compose.yml
├── build/ # Артефакты сборки
├── CMakeLists.txt # Конфигурация CMake
└── setup_database.sh # Скрипт настройки БД
- Model: DatabaseManager, NetworkWorker, AnalysisEngine
- View: MainWindow (Qt Widgets)
- Controller: AppController (связь между Model и View)
CREATE TABLE resources (
id SERIAL PRIMARY KEY,
url VARCHAR(512) NOT NULL UNIQUE,
service_type VARCHAR(50) NOT NULL,
port INTEGER,
interval INTEGER DEFAULT 300,
is_enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE check_history (
id SERIAL PRIMARY KEY,
resource_id INTEGER REFERENCES resources(id) ON DELETE CASCADE,
timestamp TIMESTAMP NOT NULL,
url VARCHAR(512),
ip VARCHAR(45),
dns_match BOOLEAN,
ping_success BOOLEAN,
tcp80_success BOOLEAN,
tcp443_success BOOLEAN,
http_status_code INTEGER,
http_success BOOLEAN,
ssl_success BOOLEAN,
latency_ms INTEGER,
available BOOLEAN,
details TEXT
);Docker поддержка
# Запуск PostgreSQL в контейнере
docker-compose -f docker/docker-compose.yml up -d
# Приложение подключится автоматически к БД на localhost:5432
./build/NetworkAvailabilityAnalyzer- ✅ Изолированная БД: не затрагивает системный PostgreSQL
- ✅ Воспроизводимость: одинаковое окружение на любой машине
- ✅ Легкая очистка:
docker-compose down -vудалит всё - ✅ Персистентность: данные сохраняются в volume
postgres_data
# Остановка
docker-compose -f docker/docker-compose.yml stop
# Перезапуск
docker-compose -f docker/docker-compose.yml restart
# Просмотр логов PostgreSQL
docker-compose -f docker/docker-compose.yml logs -f postgres
# Подключение к БД в контейнере
docker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer
# Полная очистка (удалит данные!)
docker-compose -f docker/docker-compose.yml down -v# Запуск PostgreSQL в контейнере
docker-compose -f docker/docker-compose.yml up -d
# Приложение подключится автоматически к БД на localhost:5432
./build/NetworkAvailabilityAnalyzer- ✅ Изолированная БД: не затрагивает системный PostgreSQL
- ✅ Воспроизводимость: одинаковое окружение на любой машине
- ✅ Легкая очистка:
docker-compose down -vудалит всё - ✅ Персистентность: данные сохраняются в volume
postgres_data
# Остановка
docker-compose -f docker/docker-compose.yml stop
# Перезапуск
docker-compose -f docker/docker-compose.yml restart
# Просмотр логов PostgreSQL
docker-compose -f docker/docker-compose.yml logs -f postgres
# Подключение к БД в контейнере
docker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer
# Полная очистка (удалит данные!)
docker-compose -f docker/docker-compose.yml down -vcd build
cmake --build . -j$(nproc)rm -rf build
cmake -S . -B build
cmake --build builddocker-compose -f docker/docker-compose.yml logs -f postgresdocker-compose -f docker/docker-compose.yml exec postgres psql -U netanalyzer_user -d network_analyzer- Qt 6: GUI framework (Widgets, Network, SQL)
- PostgreSQL: реляционная СУБД с FOREIGN KEY и индексами
- CMake: система сборки
- C++17: стандарт языка
- Qt SQL ORM: Prepared Statements для защиты от SQL injection
- MVC Architecture: разделение Model, View, Controller
Проект реализует следующие меры безопасности в соответствии с требованиями информационной безопасности:
Проблема: Внедрение вредоносного SQL-кода через пользовательский ввод.
Решение: Собственный ORM с Prepared Statements во всех операциях с БД.
// Пример из Resource.h: bindInsertValues использует bindValue вместо конкатенации
void bindInsertValues(QSqlQuery &query) const override {
query.bindValue(":url", m_url); // Безопасная параметризация
query.bindValue(":service_type", m_serviceType);
query.bindValue(":port", m_port);
// Невозможно внедрить: "; DROP TABLE users; --"
}Защита: Все значения передаются как параметры, а не конкатенируются в строку запроса.
Проблема: Ошибки типов данных во время выполнения (runtime).
Решение: C++ статическая типизация + проверка на этапе компиляции.
// Компилятор не позволит передать строку вместо числа
bool addResource(const QString &url, ServiceType serviceType, int port, int interval);Проблема: Некорректные или вредоносные данные от пользователя.
Решение: Проверка на уровне UI и бизнес-логики.
// ConfigManager.cpp: валидация порта СУБД
int port = settings.value("Database/Port", 5432).toInt();
if (port < 1 || port > 65535) port = 5432; // Защита от переполнения
// MainWindow.cpp: проверка URL перед добавлением
if (urlInput.isEmpty()) {
QMessageBox::warning(this, "Error", "URL cannot be empty");
return;
}Изоляция пользователя:
- Отдельный пользователь
netanalyzer_user(неpostgres) - Доступ только к БД
network_analyzer - MD5 аутентификация
- Минимальные привилегии (только CRUD для своих таблиц)
# docker-compose.yml
environment:
POSTGRES_USER: netanalyzer_user # Не root!
POSTGRES_PASSWORD: secure_password # Из переменных окружения в продакшнеПроблема: Man-in-the-Middle атаки при HTTPS проверках.
Решение: Qt Network с проверкой сертификатов.
// NetworkWorker.cpp: проверка SSL сертификата
QSslCertificate cert = reply->sslConfiguration().peerCertificate();
if (cert.isNull() || cert.expiryDate() < QDateTime::currentDateTime()) {
result.sslSuccess = false;
result.details = "Invalid or expired SSL certificate";
}Диагностика блокировок:
- DNS Spoofing: Сравнение ожидаемого IP с реальным
- DPI (Deep Packet Inspection): TCP работает, HTTP блокируется
- IP Blocking: DNS работает, TCP не подключается
- MITM: Несовпадение SSL сертификатов
// AnalysisEngine.cpp: детектирование DNS spoofing
if (result.dnsMatch == false && !result.dnsIp.isEmpty()) {
return "DNS Spoofing: expected IP differs from resolved IP";
}Архитектурное решение: Весь SQL изолирован в ORM Entity классах.
// ❌ НЕТ такого кода в проекте:
db.exec("SELECT * FROM resources WHERE url = '" + userInput + "'"); // ОПАСНО!
// ✅ Вместо этого используется ORM:
Resource::findAll(db, "url = :url", {{":url", userInput}}); // БЕЗОПАСНО!Паттерн Active Record: SQL находится в Entity (Resource.h, CheckHistory.h), но это описание схемы, аналог Django Models. Все значения передаются через bindValue().
// ConfigManager поддерживает переменные окружения
QString password = qEnvironmentVariable("DB_PASSWORD", settings.value(...).toString());Рекомендация для продакшна:
export DB_PASSWORD="krutoy_parol_777"
./NetworkAvailabilityAnalyzer- PostgreSQL в изолированном контейнере
- Постоянность через Docker volumes (не bind mounts)
- Нет прямого доступа к файловой системе хоста
# Проверьте установку Qt
qmake --version
# Переустановите зависимости
sudo apt install --reinstall qt6-base-dev# Проверьте зависимости
ldd build/NetworkAvailabilityAnalyzer
# Установите недостающие библиотеки Qt
sudo apt install qt6-base-plugins