Представьте: у вас умный дом, куча IoT-устройств, и вы хотите быть уверены, что в вашей локальной сети нет посторонних. Вдруг сосед подключился к вашему Wi-Fi или кто-то вставил свой Raspberry Pi в свободный порт коммутатора?
Ваш сервер сам опрашивает сеть (через arp-scan) и ищет новые устройства.
Настройка роутера на отправку HTTP-запроса при выдаче IP-адреса новому устройству.
| Критерий | Активное сканирование | MikroTik + Webhook |
|---|---|---|
| Реальное время | ✗ (только по cron) | ✓ мгновенно |
| Нагрузка на сеть | ✗ высокая | ✓ нулевая |
| Сложность настройки | ✓ простая | ✗ средняя |
| Требует прав root | ✓ да | ✓ нет (только API) |
| Подходит для хостинга | ✗ нет | ✓ да |
# Для Ubuntu/Debian sudo apt-get update sudo apt-get install arp-scan # Для CentOS/RHEL sudo yum install arp-scan
sudo visudo
# Добавьте строку:
www-data ALL=(ALL) NOPASSWD: /usr/bin/arp-scan
<?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);
# Запуск каждые 5 минут
*/5 * * * * /usr/bin/php /var/www/scan_network.php >> /dev/null 2>&1
В терминале 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
}
/ip dhcp-server set [find] lease-script=dhcp-leech-script
<?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.
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); }
Комментарии
Пока нет комментариев. Будьте первым!