Manter a visibilidade sobre o que está conectado na sua rede local (LAN) é o primeiro passo para qualquer postura séria de segurança. Na maioria das residências e pequenos escritórios, confiamos cegamente no roteador da operadora — que raramente oferece logs em tempo real, auditoria ou alertas de novos dispositivos desconhecidos.
Neste artigo prático, vamos construir um Sentinela Doméstico (Micro-SIEM) em Python que roda em qualquer Linux (Raspberry Pi, Mini PC ou servidor local), capaz de:
- Ler a tabela ARP do kernel em tempo real;
- Realizar varreduras ativas assíncronas via Ping Sweep em sub-redes
/24em menos de 2 segundos; - Resolver o fabricante do hardware via prefixo IEEE OUI (Apple, Samsung, Espressif, Intel, etc.) sem depender de APIs externas;
- Disparar alertas de novos nós conectados para quarentena imediata.
1. Por que a Tabela ARP e não apenas Nmap?
Ferramentas como Nmap são excelentes para auditorias pontuais, mas executar scans pesados continuamente na rede pode:
- Gerar ruído e tráfego desnecessário de broadcast;
- Travar dispositivos IoT sensíveis (lâmpadas, tomadas Tuya/Sonoff);
- Consumir CPU desnecessária no host de monitoramento.
No Linux, o próprio kernel já mantém um cache dinâmico de todos os dispositivos que trocaram pacotes recentemente no arquivo pseudo-sistema /proc/net/arp. Lendo esse arquivo diretamente, a verificação consome praticamente 0% de CPU.
2. O Script Sentinela em Python
Abaixo está a implementação base que combina a leitura da tabela ARP com a resolução de fabricantes offline:
import os
import re
import asyncio
import subprocess
# Mapeamento simplificado de prefixos OUI populares (3 primeiros octetos)
OUI_DATABASE = {
"00:1A:2B": "Ayecom Technology",
"DC:A6:32": "Raspberry Pi Trading",
"B8:27:EB": "Raspberry Pi Foundation",
"AC:D1:B8": "Apple, Inc.",
"F4:F5:DB": "Apple, Inc.",
"24:4C:E3": "Samsung Electronics",
"EC:FA:BC": "Espressif (Tuya / Sonoff / IoT)",
"30:AE:A4": "Espressif Systems",
"00:E0:4C": "Realtek Semiconductor",
"18:66:DA": "Intel Corporate",
}
def resolve_vendor(mac: str) -> str:
prefix = mac.upper()[:8]
return OUI_DATABASE.get(prefix, "Fabricante Desconhecido")
def read_kernel_arp_table():
devices = []
if not os.path.exists("/proc/net/arp"):
return devices
with open("/proc/net/arp", "r") as f:
lines = f.readlines()[1:] # Pula o cabeçalho
for line in lines:
parts = line.split()
if len(parts) >= 6:
ip, hw_type, flags, mac, mask, device = parts[:6]
# Flags 0x2 significa dispositivo resolvido/válido
if flags == "0x2" and mac != "00:00:00:00:00:00":
devices.append({
"ip": ip,
"mac": mac.upper(),
"interface": device,
"vendor": resolve_vendor(mac)
})
return devices
async def ping_sweep_subnet(subnet_base="192.168.1"):
"""Dispara pings assíncronos rápidos para forçar atualização da tabela ARP"""
async def ping_ip(ip):
proc = await asyncio.create_subprocess_exec(
"ping", "-c", "1", "-W", "1", ip,
stdout=asyncio.subprocess.DEVNULL,
stderr=asyncio.subprocess.DEVNULL
)
await proc.wait()
tasks = [ping_ip(f"{subnet_base}.{i}") for i in range(1, 255)]
await asyncio.gather(*tasks)
async def main():
print("[*] Atualizando cache ARP com varredura assíncrona...")
await ping_sweep_subnet("192.168.1")
print("\n[+] Dispositivos Ativos na LAN:")
print(f"{'IP':<16} {'MAC':<18} {'INTERFACE':<10} {'FABRICANTE'}")
print("-" * 65)
for dev in read_kernel_arp_table():
print(f"{dev['ip']:<16} {dev['mac']:<18} {dev['interface']:<10} {dev['vendor']}")
if __name__ == "__main__":
asyncio.run(main())
3. Criando um Serviço em Segundo Plano (Systemd)
Para que o monitoramento seja ininterrupto, salve o script em /opt/network_sentry.py e configure o serviço no Linux:
# /etc/systemd/system/network-sentry.service
[Unit]
Description=EVM Network Sentry SIEM Daemon
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/python3 /opt/network_sentry.py
Restart=always
RestartSec=180
[Install]
WantedBy=multi-user.target
Ative o daemon para iniciar no boot:
sudo systemctl daemon-reload
sudo systemctl enable --now network-sentry.service
4. O que Fazer com Dispositivos Desconhecidos?
Quando um MAC que não está na sua lista de nós autorizados é detectado, a melhor prática não é apenas emitir um alerta visual, mas aplicar medidas de contenção:
- Isolamento via VLAN: Separar dispositivos de automação (IoT) dos computadores pessoais de trabalho;
-
Quarentena no Switch/Roteador: Bloquear o encaminhamento de pacotes do IP atribuído via regras de
iptablesou regras de firewall no roteador gerenciável (MikroTik / OpenWrt / pfSense).
Conclusão e Recursos
Ter visibilidade em nível de camada 2 (Data Link) é a fundação para qualquer ambiente seguro. Com poucas linhas de Python assíncrono, você transforma qualquer servidor Linux comum em uma sentinela permanente contra invasões e nós não autorizados.
Publiquei a arquitetura completa com integração de eventos e banco de dados SQLite WAL no meu blog:
👉 Artigo Completo no Fymax Sentinel
Como você monitora a entrada de novos aparelhos na sua rede doméstica hoje? Usa Pi-hole, ARPWatch ou regras no roteador? Compartilhe nos comentários!
Top comments (0)