Aplicacion de escaner de red desarrollada en Node.js con Express para detectar dispositivos activos, identificar puertos abiertos y almacenar la información en una base datos.
- Node.js 16+ - Descargar Node.js
- MySQL 5.7+ o MariaDB 10.3+
- Windows/Linux/macOS
Si no tienes Node.js instalado:
- Descarga desde: https://nodejs.org/
- Instala la versión LTS recomendada
- Verifica la instalación:
node --version
npm --versionnpm installEjecutar el script SQL para crear la base de datos:
mysql -u root -p < database.sqlO importar manualmente el archivo database.sql usando MySQL Workbench, phpMyAdmin, etc.
Copiar el archivo de ejemplo y editarlo:
copy .env.example .envEditar .env con tus configuraciones:
# Base de datos MySQL
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=tu_contraseña
DB_NAME=escaner_red
# Servidor API
PORT=3000
# Configuración del escáner
SCAN_NETWORK=192.168.1.0/24
SCAN_TIMEOUT=2000
SCAN_CONCURRENCY=50npm run scanEste comando:
- Escanea la red configurada en
SCAN_NETWORK - Detecta hosts activos mediante ping
- Obtiene Sistema Operativo (por TTL)
- Identifica Fabricante del dispositivo (por MAC)
- Detecta Hostname del equipo
- Escanea puertos comunes en cada host
- Valida conflictos de IP/MAC
- Aplica regla de 10 minutos para puertos
- Guarda toda la información en MySQL
- Muestra los resultados en consola
Salida esperada:
============================================================
ESCANER DE RED
============================================================
Red a escanear: 192.168.1.0/24
Timeout: 2000ms
Concurrencia: 50
============================================================
Escaneando 254 direcciones IP...
Progreso: 254/254 IPs escaneadas (100%)...
Escaneo completado. 5 hosts activos encontrados.
──────────────────────────────────────────────────
IP: 192.168.1.10
🏷Hostname: DESKTOP-ABC123
MAC Address: 00-1A-2B-3C-4D-5E
Fabricante: Intel Corporate
Sistema Operativo: Windows
Tipo de dispositivo: PC
Fecha de escaneo: 2025-11-25T10:30:00.000Z
Puertos abiertos en 192.168.1.10:
├─ Puerto 80 (open)
│ └─ Servicio: HTTP
│ └─ Tiempo respuesta: 15ms
├─ Puerto 443 (open)
│ └─ Servicio: HTTPS
│ └─ Tiempo respuesta: 18ms
============================================================
RESUMEN DEL ESCANEO
============================================================
Hosts detectados: 5
Equipos guardados: 5
Equipos con conflicto: 0
Puertos registrados: 12
Puertos omitidos (10m): 3
============================================================
npm startO para desarrollo con auto-reload:
npm run devEl servidor estará disponible en: http://localhost:3000
curl http://localhost:3000/curl http://localhost:3000/api/hostsRespuesta:
{
"success": true,
"count": 3,
"equipos": [
{
"id": 1,
"hostname": "DESKTOP-ABC123",
"direccion_ip": "192.168.1.10",
"mac_address": "00-1A-2B-3C-4D-5E",
"fabricante": "Intel Corporate",
"sistema_operativo": "Windows",
"tipo_dispositivo": "PC",
"estado": "activo",
"primera_deteccion": "2025-09-30T15:00:00.000Z",
"ultima_deteccion": "2025-09-30T15:30:00.000Z",
"puertos": [...]
}
]
}curl http://localhost:3000/api/hosts/192.168.1.10curl http://localhost:3000/api/hosts/mac/00-1A-2B-3C-4D-5Ecurl http://localhost:3000/api/hosts/stats/allRespuesta:
{
"success": true,
"stats": {
"total_equipos": 15,
"equipos_activos": 12,
"total_registros_puertos": 147,
"registros_hoy": 45,
"fabricantes_top": [...],
"sistemas_operativos": [...]
}
}curl http://localhost:3000/api/hosts/conflictos/allcurl "http://localhost:3000/api/hosts/actividad/reciente?horas=24"curl "http://localhost:3000/api/hosts/puertos/top?limite=10"curl -X POST http://localhost:3000/api/hosts/validar \
-H "Content-Type: application/json" \
-d '{
"hostname": "MI-PC",
"direccion_ip": "192.168.1.100",
"mac_address": "00-1A-2B-3C-4D-5E"
}'curl -X POST http://localhost:3000/api/scan \
-H "Content-Type: application/json" \
-d '{
"network": "192.168.1.0/24",
"timeout": 2000,
"concurrency": 50
}'curl -X POST http://localhost:3000/api/scan/ip/192.168.1.100curl http://localhost:3000/api/scan/statuscurl -X DELETE "http://localhost:3000/api/scan/cleanup?dias=30"| Campo | Tipo | Descripción |
|---|---|---|
| id | INT | ID único (auto-increment) |
| codigo_oui | VARCHAR(8) | Primeros 3 bytes de MAC (OUI) |
| nombre | VARCHAR(255) | Nombre del fabricante |
| descripcion | TEXT | Descripción adicional |
| Campo | Tipo | Descripción |
|---|---|---|
| id | INT | ID único (auto-increment) |
| nombre | VARCHAR(50) | Nombre del protocolo (TCP, UDP, etc.) |
| descripcion | VARCHAR(255) | Descripción del protocolo |
| puerto_por_defecto | INT | Puerto por defecto si aplica |
| Campo | Tipo | Descripción |
|---|---|---|
| id | INT | ID único (auto-increment) |
| hostname | VARCHAR(255) | Nombre del equipo |
| direccion_ip | VARCHAR(45) | Dirección IP |
| mac_address | VARCHAR(17) | Dirección MAC |
| fabricante_id | INT | FK a fabricante |
| sistema_operativo | VARCHAR(100) | SO detectado |
| version_so | VARCHAR(100) | Versión del SO |
| tipo_dispositivo | VARCHAR(50) | Tipo: PC, Router, etc. |
| estado | ENUM | activo/inactivo/desconocido |
| primera_deteccion | TIMESTAMP | Primera vez detectado |
| ultima_deteccion | TIMESTAMP | Última vez detectado |
| Campo | Tipo | Descripción |
|---|---|---|
| id | INT | ID único (auto-increment) |
| equipo_id | INT | FK a equipo |
| protocolo_id | INT | FK a protocolo |
| numero_puerto | INT | Número de puerto |
| nombre_servicio | VARCHAR(100) | Nombre del servicio |
| estado | ENUM | abierto/cerrado/filtrado |
| fecha_deteccion | TIMESTAMP | Fecha y hora de detección |
| tiempo_respuesta_ms | INT | Tiempo de respuesta |
| banner | TEXT | Banner del servicio |
Por defecto se escanean estos puertos comunes:
| Puerto | Servicio |
|---|---|
| 21 | FTP |
| 22 | SSH |
| 23 | Telnet |
| 25 | SMTP |
| 53 | DNS |
| 80 | HTTP |
| 110 | POP3 |
| 143 | IMAP |
| 443 | HTTPS |
| 445 | SMB |
| 3306 | MySQL |
| 3389 | RDP |
| 5432 | PostgreSQL |
| 8080 | HTTP-Alt |
| 8443 | HTTPS-Alt |
Puedes modificar la lista en src/utils/networkScanner.js
Escaner red/
├── database.sql # Script SQL con estructura completa
├── example.env # Variables de entorno ejemplo
├── package.json # Dependencias y scripts
├── README.md # Esta documentación
└── src/
├── config/
│ └── database.js # Configuración MySQL
├── models/
│ ├── equipoModel.js # Modelo de equipos
│ ├── fabricanteModel.js # Modelo de fabricantes
│ ├── protocoloModel.js # Modelo de protocolos
│ └── protocoloUsadoModel.js # Modelo de puertos usados
├── routes/
│ ├── hostRoutes.js # Rutas de equipos
│ └── scanRoutes.js # Rutas de escaneo
├── utils/
│ └── networkScanner.js # Scanner de red con detección de SO/fabricante
├── scanner.js # CLI de escaneo
└── server.js # Servidor Express
# Iniciar servidor en producción
npm start
# Iniciar servidor en modo desarrollo (con nodemon)
npm run dev
# Ejecutar escáner de red
npm run scanEste proyecto es de código abierto y está disponible bajo la licencia MIT.
Desarrollado por Reduardo con ❤️ para escaneo y monitoreo de redes locales.