Seguridad Cisco IOS / IOS-XE Nivel Avanzado

Revisión de Cambio — Ventana de Mantenimiento

Análisis de config candidata • Router Madrid-R1 (ISR 4331) • Sábado 21 jun 2026 02:00–04:00 h

Cliente
Logistech SL
3 almacenes · Madrid / BCN / VLC
─────────────────
Dispositivo: Madrid-R1
Plataforma: ISR 4331 / IOS-XE
Resumen ejecutivo
Anti-patrones detectados
3
En la config candidata original
Riesgo de bloqueo SSH
ALTO
ACL bloquea gestión si no se añade permit
Estado del plan
REVISADO
Requiere correcciones antes de aplicar
Hallazgos críticos
Wildcard mask incorrecta — se usa subnet mask en lugar de wildcard
La línea permit tcp 10.50.0.0 255.255.255.0 any eq 443 usa máscara de subred (255.255.255.0) donde IOS espera una wildcard mask (0.0.0.255). IOS puede aceptar el comando silenciosamente, pero la coincidencia de tráfico será incorrecta: se permitirá un rango de IPs completamente diferente al previsto.
ACL bloquea acceso de gestión SSH/Telnet — riesgo de lockout
La ACL WEB-IN sólo permite HTTPS (443) desde 10.50.0.0/24. No hay ningún permit para SSH (22) desde la red de gestión del técnico. Al aplicarse en GigabitEthernet0/0 in, bloqueará el SSH entrante por WAN. Si no hay acceso fuera de banda (consola OOB), el equipo quedará inaccesible remotamente.
Se guarda la config ANTES de validar el comportamiento
El plan original incluye copy running-config startup-config al final, sin haber ejecutado los comandos de verificación post-cambio. Si el cambio bloquea el acceso, un reload del dispositivo lo haría persistente.
ACL sin deny explícito con log — observabilidad limitada
El deny implícito al final de la ACL no genera logs. Se recomienda añadir 999 deny ip any any log para visibilidad de intentos bloqueados (tras confirmar que el volumen es seguro para el syslog).
Diff: Config candidata vs. Config corregida
config-candidata-original.ios 3 ERRORES
! ACL con subnet mask (INCORRECTO)
ip access-list extended WEB-IN
 10 permit tcp 10.50.0.0 255.255.255.0 any eq 443
 999 deny ip any any

! Sin permit de gestión SSH
interface GigabitEthernet0/0
 ip access-group WEB-IN in

! OK
interface GigabitEthernet0/1
 description UPLINK-TO-CORE-MAD

! Guardar SIN validar (INCORRECTO)
copy running-config startup-config
config-corregida.ios CORREGIDA
! Wildcard mask correcta (0.0.0.255)
ip access-list extended WEB-IN
 5 permit tcp 172.16.100.0 0.0.0.255 any eq 22
 10 permit tcp 10.50.0.0 0.0.0.255 any eq 443
 999 deny ip any any log

! Aplicar ACL (sin cambios)
interface GigabitEthernet0/0
 ip access-group WEB-IN in

! OK
interface GigabitEthernet0/1
 description UPLINK-TO-CORE-MAD

! Guardar SOLO tras validación
! copy running-config startup-config
! (ejecutar manualmente tras checks)
Referencia wildcard masks
Subred CIDR Subnet Mask Wildcard Mask (IOS) Correcto para ACL IOS Error típico
10.50.0.0/24 255.255.255.0 0.0.0.255 OK Usar 255.255.255.0 → match incorrecto
172.16.100.0/24 255.255.255.0 0.0.0.255 OK Red de gestión SSH del técnico
192.168.1.0/30 255.255.255.252 0.0.0.3 OK Enlace punto a punto
10.0.0.0/8 255.0.0.0 0.255.255.255 OK Rango RFC1918 completo
Host único 255.255.255.255 0.0.0.0 o host x.x.x.x OK Omitir wildcard → error de sintaxis
Checklist pre-cambio (antes de la ventana)
Comandos de captura de estado (solo lectura)

ANTES del cambio — guardar output en ticket

Madrid-R1# (read-only)
show version
show ip interface brief
show interfaces GigabitEthernet0/0
show interfaces GigabitEthernet0/1
show running-config | section interface
show running-config | section line vty
show ip access-lists
show ip route
show logging | last 30

DESPUÉS del cambio — comparar con baseline

Madrid-R1# (post-change)
show ip access-lists WEB-IN
! Verificar hit counters tras test controlado
show interfaces GigabitEthernet0/0
show running-config | section interface Gi0/0
show running-config | section interface Gi0/1
show logging | include ACL|changed state
! Solo si todo OK:
copy running-config startup-config
Plan de ventana de mantenimiento
02:00 — Captura de estado actual
Ejecutar todos los comandos de solo lectura. Guardar output en el ticket JIRA #LOG-2231.
show version · show ip interface brief · show ip access-lists · show ip route
02:15 — Aplicar config corregida
Pegar el bloque corregido en orden: primero la ACL (con wildcard correcta + ACE de gestión), luego aplicar a interfaz, luego descripción. NO guardar todavía.
configure terminal → acl WEB-IN → interface Gi0/0 → interface Gi0/1 → end
02:20 — Verificación con test controlado
Desde la red de gestión (172.16.100.x), confirmar SSH al router. Desde 10.50.0.x, confirmar acceso HTTPS. Leer hit counters de la ACL.
show ip access-lists WEB-IN · show interfaces Gi0/0 · show logging | include WEB-IN
02:35 — Guardar si todo OK
Solo tras confirmar que SSH de gestión funciona y el tráfico HTTPS es permitido correctamente.
copy running-config startup-config
02:40 — Rollback si hay problemas
Si la ACL bloquea acceso y aún hay sesión activa, eliminar la aplicación de la ACL a la interfaz. Si hay lockout, usar consola OOB.
interface Gi0/0 → no ip access-group WEB-IN in → end
Anti-patrones identificados en el plan original
# Anti-patrón Presencia Riesgo Corrección aplicada
1 Usar subnet mask donde IOS espera wildcard mask Crítico Cambiado a 0.0.0.255
2 Guardar config antes de validar post-cambio Alto Comentado, movido al paso 4
3 No verificar que ACL no bloquea acceso de gestión Crítico Añadida ACE 5 para SSH de gestión
4 Deny implícito sin log (observabilidad cero) Medio Añadido 999 deny ip any any log
5 No capturar estado antes del cambio Medio Plan de ventana incluye captura previa
Recuerda: running-config vs startup-config
Los cambios en running-config son activos en memoria pero se pierden en un reload. No ejecutar copy running-config startup-config hasta haber validado completamente el comportamiento esperado. Un reload no planificado (caída de alimentación, reset remoto) durante la ventana podría revertir los cambios y restaurar la config anterior.