↩️ Назад

Категории

Монитор сети IoT

29.06.2026 | Статья из категории: Без категории

Представьте: у вас умный дом, куча IoT-устройств, и вы хотите быть уверены, что в вашей локальной сети нет посторонних. Вдруг сосед подключился к вашему Wi-Fi или кто-то вставил свой Raspberry Pi в свободный порт коммутатора?

🎯 Задача: автоматически отслеживать появление новых устройств в сети и получать уведомления об этом.

🧠 Два подхода к решению

🔍 Подход 1: Активное сканирование из PHP

Ваш сервер сам опрашивает сеть (через arp-scan) и ищет новые устройства.

📡 Подход 2: Пассивное прослушивание через MikroTik (рекомендуется)

Настройка роутера на отправку HTTP-запроса при выдаче IP-адреса новому устройству.

Критерий Активное сканирование MikroTik + Webhook
Реальное время (только по cron) мгновенно
Нагрузка на сеть высокая нулевая
Сложность настройки простая средняя
Требует прав root да нет (только API)
Подходит для хостинга нет да

💻 Реализация подхода 1: Активное сканирование

Шаг 1. Установка arp-scan

# Для Ubuntu/Debian
sudo apt-get update
sudo apt-get install arp-scan

# Для CentOS/RHEL
sudo yum install arp-scan

Шаг 2. Настройка прав для PHP

sudo visudo
# Добавьте строку:
www-data ALL=(ALL) NOPASSWD: /usr/bin/arp-scan

Шаг 3. PHP-скрипт сканирования

📄 scan_network.php
<?php

class NetworkScanner {
    private $knownDevicesFile = 'known_devices.json';
    private $logFile = 'network_events.log';
    
    public function scan() {
        $command = "sudo arp-scan --localnet";
        $output = shell_exec($command);
        
        $devices = $this->parseArpOutput($output);
        $known = $this->loadKnownDevices();
        $new = $this->findNewDevices($devices, $known);
        
        foreach ($new as $device) {
            $this->logEvent("🚨 NEW DEVICE: {$device['ip']} | {$device['mac']}");
            $this->sendTelegram($device);
        }
        
        $this->saveKnownDevices($devices);
        return $new;
    }
    
    private function parseArpOutput($output) {
        $pattern = '/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([0-9a-f:]{17})\s+(.*)/';
        preg_match_all($pattern, $output, $matches, PREG_SET_ORDER);
        // ... парсинг и возврат массива устройств
    }
}

// Использование
$scanner = new NetworkScanner();
$newDevices = $scanner->scan();

header('Content-Type: application/json');
echo json_encode($newDevices);

Шаг 4. Настройка Cron

# Запуск каждые 5 минут
*/5 * * * * /usr/bin/php /var/www/scan_network.php >> /dev/null 2>&1

📡 Реализация подхода 2: MikroTik + Webhook

✅ Рекомендуемый способ — работает в реальном времени, не нагружает сеть.

Шаг 1. Создаём скрипт на MikroTik

В терминале RouterOS:

/system script add name=dhcp-leech-script source={
    :global leaseBound
    :global leaseActMAC
    :global leaseActIP
    
    # Отправляем данные на ваш PHP-сервер
    /tool fetch url="http://ваш-сервер.ru/dhcp_logger.php?ip=$leaseActIP&mac=$leaseActMAC" keep-result=no
}

Шаг 2. Привязываем скрипт к DHCP-серверу

/ip dhcp-server set [find] lease-script=dhcp-leech-script

Шаг 3. PHP-обработчик на сервере

📄 dhcp_logger.php
<?php

$ip = $_GET['ip'] ?? null;
$mac = $_GET['mac'] ?? null;

if ($ip && $mac) {
    // Белый список известных MAC-адресов
    $whiteList = [
        'b8:29:0b:ed:e0:27',  // Raspberry Pi
        '00:1a:2b:3c:4d:5e',  // Smart TV
    ];
    
    if (!in_array($mac, $whiteList)) {
        $message = "🚨 НОВОЕ УСТРОЙСТВО!\nIP: $ip\nMAC: $mac";
        
        // Запись в лог
        file_put_contents('network.log', 
            date('Y-m-d H:i:s') . " - $message\n", 
            FILE_APPEND
        );
        
        // Отправка в Telegram
        sendTelegram($message);
    }
}

🔔 Уведомления в Telegram

В обоих подходах можно легко добавить отправку уведомлений в Telegram.

function sendTelegram($message) {
    $botToken = 'YOUR_BOT_TOKEN';
    $chatId = 'YOUR_CHAT_ID';
    
    $url = "https://api.telegram.org/bot{$botToken}/sendMessage";
    $data = [
        'chat_id' => $chatId,
        'text' => $message,
        'parse_mode' => 'HTML'
    ];
    
    $options = [
        'http' => [
            'header' => "Content-type: application/x-www-form-urlencoded\r\n",
            'method' => 'POST',
            'content' => http_build_query($data)
        ]
    ];
    
    $context = stream_context_create($options);
    file_get_contents($url, false, $context);
}



Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Посетителей сегодня: 0
о блоге | карта блога | 📡 Подписаться на RSS

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA