🔗 Network Intelligence: Fortigate + Juniper + Ciencia de Datos¶
En este notebook, te iré guiando a implementar la Ciencia de Datos para extración de datos de equipos de Red, te mostraré como hacer para visualizar algunos Insights y también verás una aplicación bastante útil.
📌 Configuración y Librerías Clave¶
En esta sección, configuraremos algunas preferencias del notebook y realizaremos la importación de librerías esenciales para nuestro análisis.
🔹 Librerías Importantes¶
A continuación, presentamos algunas de las librerías clave que utilizaremos:
- Napalm 🛠️: Esta librería, basada en Netmiko, nos proporciona los resultados en formato de diccionario, lo que facilita el acceso a información clave y su manipulación.
- Netmiko 🔌: Cuando Napalm no nos ofrece ciertos datos, recurrimos a Netmiko, que nos devuelve una salida más cruda. Posteriormente, refinamos esta información con la librería re.
- re 🔍: Nos permite detectar patrones en texto mediante expresiones regulares, facilitando la extracción de datos relevantes.
- pandas 🐼: Una de las librerías más utilizadas para la limpieza, transformación y análisis de datos.
- plotly 📊: Nos ayuda a visualizar los datos de manera interactiva y dinámica.
Con estas herramientas, podremos extraer, transformar y visualizar la información de manera eficiente. 🚀
# === Configuración de entorno e importación de librerías ===
# Estilo personalizado para la visualización en Jupyter Notebook
from IPython.display import display, HTML, Markdown
# Configuración de localización para manejar fechas y formatos en español
import locale
locale.setlocale(locale.LC_ALL, '') # Idioma local, puede ajustarse según sea necesario
# === Librerías para análisis y visualización de datos ===
# Manejo de fechas y tiempos
import datetime
from datetime import timedelta
# Regular expressions para manipulación de texto
import re
# Manejo de datos con pandas y numpy
import pandas as pd
import numpy as np
# Configuración de pandas para mostrar más datos en la consola
pd.set_option('display.max_columns', None) # Mostrar todas las columnas
pd.set_option('display.max_rows', None) # Mostrar todas las filas
pd.set_option('max_colwidth', None) # No truncar el ancho de las columnas
# Visualización estática con Matplotlib
import matplotlib.pyplot as plt
# Mostrar gráficos directamente en el notebook
%matplotlib inline
# Visualización interactiva con Plotly
import plotly
import plotly.graph_objs as go
import plotly.express as px
from plotly.subplots import make_subplots
# Configuración de Plotly para usar gráficos en Jupyter Notebook
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True) # Conexión inicial para gráficas en el notebook
# === Librerías para conexiones y automatización de redes ===
# Conexión a dispositivos de red con Netmiko
from netmiko import ConnectHandler, NetmikoTimeoutException
# Manejo de dispositivos de red con NAPALM
import napalm
# === Manejo de advertencias para evitar ruido en la salida de las celdas de Notebook===
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", category=FutureWarning)
🔌 Conexión y Extracción de Datos del Fortigate¶
En esta sección, nos conectaremos al Fortigate y extraeremos datos clave que nos proporcionarán una visión general de la red.
🏷️ Consideraciones Previas¶
Trabajaremos bajo una configuración típica en la que el Fortigate actúa como gateway de las redes. Debido a esto, utilizaremos la tabla ARP de este equipo para obtener información relevante.
📡 Proceso de Extracción¶
- Obtención de la Tabla ARP con Napalm 🛠️
- Utilizamos Napalm para extraer la tabla ARP, que nos permite relacionar las direcciones MAC con sus respectivas IP asignadas.
- Una vez obtenidos los datos, cerramos la conexión con el dispositivo.
- Obtención de Información de Usuarios con Netmiko 🔍
- En este caso, el Fortigate está integrado con Active Directory, lo que significa que mantiene un registro de las IP asociadas a nombres de usuario.
- Sin embargo, esta información no está disponible en formato de diccionario, sino como texto plano.
- Para extraerla, utilizamos Netmiko y luego aplicamos expresiones regulares con
re
para transformarla en un formato estructurado.
- Conversión a DataFrame con Pandas 📊
- Finalmente, convertimos los datos procesados en un DataFrame de Pandas, lo que nos permitirá manipularlos y analizarlos de manera eficiente.
Con este flujo de trabajo, obtenemos una estructura de datos clara y organizada, facilitando su análisis y visualización. 🚀
# === Configuración inicial para conexión al dispositivo Fortinet ===
# Diccionario con la configuración del dispositivo Fortinet
forti = {
'device_type': 'fortinet',
'host': 'tu_ip_del_forti', #192.168.100.2 como ejemplo
'username': 'usuario_admin_del_forti', #administrador
'password': 'tu_password_del_forti',
'port': 22,
'global_delay_factor': 2
}
# === Obtener datos del dispositivo usando NAPALM ===
# Crear un objeto controlador NAPALM para dispositivos Fortinet
driver = napalm.get_network_driver(forti['device_type'])
# Inicializar la conexión al dispositivo usando las credenciales configuradas
device_napalm = driver(
hostname=forti['host'],
username=forti['username'],
password=forti['password']
)
# Abrir la conexión con el dispositivo
device_napalm.open()
# Obtener la tabla ARP (Address Resolution Protocol) del dispositivo
arp_table_forti = device_napalm.get_arp_table()
# Cerrar la conexión al dispositivo después de obtener los datos
device_napalm.close()
# === Transformar los datos obtenidos ===
# Convertir la tabla ARP (lista de diccionarios) en un DataFrame de pandas
arp_table_forti = pd.DataFrame.from_dict(arp_table_forti, orient='columns')
# Normalizar las direcciones MAC a mayúsculas para mantener la consistencia
arp_table_forti['mac'] = arp_table_forti['mac'].apply(lambda x: x.upper())
# === Operaciones adicionales que no se pueden realizar con NAPALM (Usar Netmiko) ===
# Conectar al dispositivo usando Netmiko
net_connect = ConnectHandler(**forti)
# Activar privilegios de administrador en el dispositivo
net_connect.enable()
# Ejecutar el comando para listar usuarios autenticados en el firewall
output_auth_list = net_connect.send_command("diagnose firewall auth list")
# Cerrar la conexión con el dispositivo una vez finalizado el comando
net_connect.disconnect()
# === Procesar la salida del comando para extraer información ===
# Patrón de expresión regular para extraer información relevante de la salida del comando
pattern = r"""(?P<ip>\d+\.\d+\.\d+\.\d+), (?P<username>\S+)\n\ttype: (?P<type>\S+).*?\n\tserver: (?P<server>\S+)\n\tpackets: in (?P<packets_in>\d+) out (?P<packets_out>\d+), bytes: in (?P<bytes_in>\d+) out (?P<bytes_out>\d+)\n\tgroup_id: (?P<group_id>.+?)\n\tgroup_name: (?P<group_name>.+?)\n"""
# Utilizar re.finditer para buscar coincidencias según el patrón definido
matches = re.finditer(pattern, output_auth_list, re.DOTALL)
# Crear una lista de diccionarios con los datos extraídos de cada coincidencia
data_list = [match.groupdict() for match in matches]
# Convertir la lista de diccionarios en un DataFrame de pandas para análisis y manipulación
df_ips_users = pd.DataFrame(data_list)
# === Final: El DataFrame df_ips_users contiene información extraída del dispositivo ===
📄 Documentación de Objetos en el Fortigate¶
Dado que nos interesa mantener un registro de los objetos almacenados en el Fortigate, utilizamos nuevamente la librería Netmiko para extraer esta información.
🔍 Extracción y Transformación de Datos¶
- Obtención de Datos con Netmiko 🔌
- Extraemos los datos de los objetos almacenados en el Fortigate.
- La información se obtiene en texto plano, pero sigue un patrón reconocible.
- Procesamiento con Expresiones Regulares 🔠
- Para estructurar los datos, utilizamos la librería
re
para detectar y extraer la información relevante.
- Para estructurar los datos, utilizamos la librería
- Conversión a DataFrame con Pandas 📊
- Finalmente, transformamos los datos extraídos en un DataFrame de Pandas, lo que nos permite analizarlos y manipularlos con mayor facilidad.
Este enfoque nos garantiza un acceso rápido y estructurado a la información almacenada en el Fortigate, facilitando su documentación y análisis. 🚀
## Lo que no podemos hacer por Napalm, lo hacemos por NETMIKO
# Conexión al dispositivo
net_connect = ConnectHandler(**forti)
net_connect.enable()
# Ejecutar el comando
output_firewall_address = net_connect.send_command("show firewall address")
# Cerrar la conexión
net_connect.disconnect()
# Procesar la salida (ejemplo básico)
# Expresión regular para extraer los datos
import re
pattern = r"""
edit\s+"(?P<name>[^"]+)"\s* # Captura el nombre después de 'edit'
(?:set\s+uuid\s+(?P<uuid>[^\s]+)\s*)? # Captura el UUID si está presente
(?:set\s+comment\s+"(?P<comment>[^"]+)"\s*)? # Captura el comentario si está presente
(?:set\s+type\s+(?P<type>[^\s]+)\s*)? # Captura el tipo si está presente
(?:set\s+start-ip\s+(?P<start_ip>[^\s]+)\s*)? # Captura la IP de inicio si está presente
(?:set\s+end-ip\s+(?P<end_ip>[^\s]+)\s*)? # Captura la IP de fin si está presente
(?:set\s+fqdn\s+"(?P<fqdn>[^"]+)"\s*)? # Captura el fqdn si está presente
(?:set\s+subnet\s+(?P<subnet>(?:[\d\.]+(?:\s+[\d\.]+|\/\d+))?)\s*)? # Captura IP/Máscara o CIDR
(?:set\s+interface\s+"(?P<interface>[^"]+)"\s*)? # Captura la interfaz si está presente
(?:set\s+macaddr\s+"(?P<macaddr>[^"]+)"\s*)? # Captura la dirección MAC si está presente
"""
# Compilar el patrón para utilizarlo en la búsqueda
compiled_pattern = re.compile(pattern, re.VERBOSE)
# Buscar las coincidencias en el texto
matches = compiled_pattern.finditer(output_firewall_address)
# Convertir las coincidencias en una lista de diccionarios
data_list_firewall_address = [match.groupdict() for match in matches]
# Crear el DataFrame
df_firewall_address = pd.DataFrame(data_list_firewall_address)
df_firewall_address[['ip', 'mask']] = df_firewall_address['subnet'].str.split(' ', expand=True)
🔗 Integración de Datos: Consolidando la Información del Fortigate¶
Hasta ahora, hemos extraído y procesado tres tablas clave:
Tabla ARP (
arp_table_forti
) 📡- Relaciona las direcciones IP con las MAC detectadas en el Fortigate.
Tabla de Usuarios del Active Directory 👤
- Relaciona las direcciones IP con los usuarios autenticados en el Active Directory.
Tabla de Objetos Registrados en el Fortigate 📋
- Asocia las direcciones IP con los nombres de los objetos configurados en el Fortigate.
🏗️ Unificando la Información¶
Ahora que contamos con estas tres fuentes de datos, es momento de aprovechar las capacidades de Pandas 🐼 para consolidarlas en una sola estructura.
- Fusionaremos la tabla ARP con la de usuarios del Active Directory para vincular direcciones IP, MAC y usuarios.
- Luego, agregaremos la tabla de objetos registrados en el Fortigate, logrando así una visión completa de la red.
Esta integración nos permitirá realizar análisis más profundos y obtener información valiosa sobre el uso y la administración de la red. 🚀
Con esto, cerramos la primera etapa de extracción y estructuración de datos desde el Fortigate. En la siguiente fase, exploraremos nuevas formas de análisis y visualización. 📊🔍
arp_table_forti['username_from_forti']=arp_table_forti['ip'].map(df_ips_users.set_index('ip').to_dict()['username'])
arp_table_forti['objectname_from_forti']=arp_table_forti['ip'].map(df_firewall_address.set_index('ip').to_dict()['name'])
arp_table_forti['comment_from_forti']=arp_table_forti['ip'].map(df_firewall_address.set_index('ip').to_dict()['comment'])
📊 Resultado de la Integración¶
Después de aplicar las transformaciones necesarias, hemos obtenido una tabla consolidada que nos permite acceder a información clave sobre la red, incluyendo:
- Relación entre direcciones IP y direcciones MAC.
- Asociación de usuarios del Active Directory con sus respectivas IP.
- Identificación de objetos registrados en el Fortigate y sus direcciones IP.
arp_table_forti.set_index(['interface','ip']).sort_index().sample(5)
age | mac | username_from_forti | objectname_from_forti | comment_from_forti | ||
---|---|---|---|---|---|---|
interface | ip | |||||
vlan30 | 10.10.9.97 | 0.0 | 18:03:73:28:64:C1 | PEDRO_SUAREZ | NaN | NaN |
10.10.9.117 | 0.0 | A5:48:7A:24:E1:C2 | SERGIO_MATURANA | NaN | NaN | |
10.10.9.237 | 1.0 | A8:CC:6D:C1:80:77 | MARCOS_SILVA | NaN | NaN | |
vlan90 | 10.10.10.57 | 0.0 | E8:39:35:41:31:43 | LUCIA_ORTIZ | IP_para_hacer_Update | Ip del Edificio 2 reservada para Actualizaciones |
10.10.10.128 | 0.0 | K9:48:60:76:72:6A | NaN | NaN | NaN |
🔎 Análisis de Usuarios en el Fortigate¶
Ahora podemos responder preguntas clave, como:
- ¿En que vlan, y que usuarios pertenecen, o está en el forti registrado algún objeto en cuya contiene 199?
arp_table_forti[arp_table_forti['ip'].str.contains('199', na=False)]
age | interface | ip | mac | username_from_forti | objectname_from_forti | comment_from_forti | |
---|---|---|---|---|---|---|---|
53 | 1.0 | vlan30 | 10.10.9.199 | 00:1E:55:N9:66:26 | ROQUE_ALONSO | NaN | NaN |
249 | 0.0 | vlan20 | 10.10.3.199 | 40:ED:44:89:1B:9A | NaN | InformaticaWifi | None |
- ¿Cuántos usuarios únicos están registrados en el Fortigate? 👥
arp_table_forti.username_from_forti.nunique()
335
🚀 Cierre de la Integración con Fortigate y Expansión del Análisis¶
Hasta ahora, hemos logrado extraer y consolidar datos clave del Fortigate en una sola tabla, permitiéndonos responder preguntas como:
- ¿Qué direcciones IP están en la red y a qué usuarios pertenecen?
- ¿Qué MAC Address están asociadas a cada IP?
- ¿Qué objetos registrados existen en el Fortigate y a qué direcciones IP corresponden?
Sin embargo, lo realmente interesante comienza ahora. 🔥
🌐 Expandiendo el Análisis: Integración con Switch Juniper¶
Ahora llevaremos nuestro análisis un paso más allá integrando los datos del Fortigate con información de un switch Juniper. Esto nos permitirá ampliar la visibilidad de la red, logrando:
✅ Identificar el puerto físico del switch donde está conectado cada usuario.
✅ Obtener información detallada del switch Juniper usando NAPALM.
✅ Realizar un diagnóstico completo del equipo en minutos.
🔍 Conexión y Extracción de Datos desde el Switch¶
La siguiente parte del script se encargará de conectar al switch Juniper y extraer información clave, como:
- Hostname 🖥️
- Tiempo de actividad (Uptime) ⏳
- Configuración completa en texto plano (que podemos almacenar automáticamente en un repositorio) 📜
- Información de interfaces y VLANs 🌐
- Uso de las interfaces 📊
- La MAC Address Table 🔗 (nuestro principal interés, ya que la vincularemos con la tabla resultante del Fortigate).
Gracias a esta integración, podremos determinar exactamente a qué puerto del switch está conectado cada usuario, logrando una trazabilidad completa de la red. 🚀
device = {
'device_type': 'junos',
'host': 'la_ip_de_tu_equipo_juniper', #192.168.4.2
'username': 'username_de_tu_equio_juniper',
'password': '***************',
'secret':'**************',
'port': 22,
'global_delay_factor': 2
}
driver = napalm.get_network_driver(device['device_type'])
device_napalm = driver(hostname=device['host'],
username=device['username'],
password=device['password'],
optional_args = {'secret': 'RegistKm5'} )
## Conexión al equipo
device_napalm.open()
## Extracción de datos con napalm
is_alive = device_napalm.is_alive()
enviroment = device_napalm.get_environment()
configuracion=device_napalm.get_config()
facts = device_napalm.get_facts()
interfaces=device_napalm.get_interfaces()
interfaces_counter = device_napalm.get_interfaces_counters()
users=device_napalm.get_users()
optics=device_napalm.get_optics()
interfaces_ip = device_napalm.get_interfaces_ip()
lldp_neighbors = device_napalm.get_lldp_neighbors()
lldp_neighbors_detail=device_napalm.get_lldp_neighbors_detail()
vlans=device_napalm.get_vlans()
mac_address_table =device_napalm.get_mac_address_table()
## Cierre de conexión al equipo
device_napalm.close()
## Transformación de datos para visualización
ip_admin = device['host']
uptime = facts['uptime']
hostname = facts['hostname']
vendor = facts['vendor']
model = facts['model']
serial = facts['serial_number']
os_version = facts['os_version']
fqdn = facts['fqdn']
uptime = timedelta(seconds=uptime)
## Transformación de datos de Enviroment
df_power = pd.DataFrame.from_dict(enviroment['power'], orient='index')
df_temperature = pd.DataFrame.from_dict(enviroment['temperature'], orient='index')
df_fans= pd.DataFrame.from_dict(enviroment['fans'], orient='index')
df_cpu = pd.DataFrame.from_dict(enviroment['cpu'], orient='index')
df_memory = pd.DataFrame.from_dict(enviroment['memory'], orient='index')
## Transformación de datos de Interfaces
df_interfaces = pd.DataFrame.from_dict(interfaces, orient='index')
df_interfaces_counter = pd.DataFrame.from_dict(interfaces_counter, orient='index')
🔗 Unión de Datos: Fortigate + Switch Juniper¶
Una vez obtenidos los datos del switch Juniper, procederemos a fusionarlos con la información previamente extraída del Fortigate, específicamente con la tabla MAC Address del switch.
Este paso es clave, ya que nos permitirá enriquecer nuestra base de datos, agregando información sobre los puertos físicos del switch y la conectividad de los dispositivos en la red.
## Transformación de Datos para tabla Mac completa, utilizando datos obtenidos de escaneo de puertos y datos obtenidos del gateway
df_mac_address_table = pd.DataFrame.from_dict(mac_address_table, orient='columns')
df_mac_address_table['ip_form_arp_table_forti']=df_mac_address_table['mac'].map(arp_table_forti.set_index('mac').to_dict()['ip'])
df_mac_address_table['username_from_forti']=df_mac_address_table['ip_form_arp_table_forti'].map(df_ips_users.set_index('ip').to_dict()['username'])
df_mac_address_table['vlan_name']=df_mac_address_table['vlan'].apply(lambda x: vlans[str(x)]['name'])
df_mac_address_table['name_from_forti']=df_mac_address_table['ip_form_arp_table_forti'].map(df_firewall_address.set_index('ip').to_dict()['name'])
df_mac_address_table['hostname']=hostname
df_mac_address_table['ip_admin']=ip_admin#df_mac_address_table['ports_from_nmap']=df_mac_address_table['ip_form_arp_table_forti'].map(df_puertos_so.set_index('ip')['puertos_tcp']).replace(np.nan,'')
📊 Visualización de los Datos del Switch¶
Finalmente, una vez integrados los datos, utilizaremos Plotly 📈 para generar visualizaciones que nos ayuden a interpretar de manera clara:
- El estado de las interfaces del switch.
- El tráfico y uso de ancho de banda en cada puerto.
- La distribución de los dispositivos en la red.
Con este análisis, obtenemos una visión completa y detallada del estado de la red, facilitando tanto la administración como la detección de problemas en tiempo real. 🔎
## Datos para fecha
FECHA_HOY = datetime.datetime.now()
FECHA_UPTIME = (FECHA_HOY - uptime).strftime('%d/%m/%Y %H:%M:%S')
## Visualización de Datos
## Datos del Equipo
display(Markdown(f'## <center> {hostname} ({ip_admin}) - {vendor}-{model} os_version: {os_version} </center>'))
display(Markdown(f'### <center> serial: {serial} </center>'))
display(Markdown(f'## <center> Encendido desde {FECHA_UPTIME} </center>'))
display(Markdown(f'## <center> uptime: {uptime} </center>'))
display(Markdown('## <center> Enviroment </center>'))
display(df_power)
display(df_temperature)
display(df_fans)
display(df_cpu)
display(df_memory)
## Visualización de utilización de Puertos
df_graph = df_interfaces_counter[~df_interfaces_counter.index.str.contains(r'\.|fti0|me0|mtun|vme|vtep',regex=True)].copy()
fig = px.bar(df_graph,
x=df_graph.index,
y=df_graph.columns,
orientation='v',
color_discrete_sequence =px.colors.qualitative.D3_r,
title=f'{hostname} ({ip_admin})- {vendor}-{model} - uptime: {uptime} '
)
fig.update_layout(
autosize=False,
width=1000,
height=500,
)
display(fig)
## Visualización de conexiones de equipos a los puertos
display(Markdown(f'### Equipos conectados a {hostname} ({ip_admin})- {vendor}-{model}'))
## Solo mostramos unos cuatos datos
display(df_mac_address_table[df_mac_address_table['username_from_forti'].notnull()].set_index(['interface', 'ip_form_arp_table_forti']).sort_index().sample(7))
Sw1-Tercera_Planta_A (10.10.52.61) - Juniper-EX2300-48P os_version: 22.FICt-t89 ¶
serial: SERIALFICTICIO ¶
Encendido desde 10/01/2025 11:56:24 ¶
uptime: 23 days, 23:29:14 ¶
Enviroment ¶
capacity | output | status | |
---|---|---|---|
FPC 0 Power Supply 0 | -1.0 | -1.0 | True |
temperature | is_alert | is_critical | |
---|---|---|---|
FPC 0 CPU Sensor | 34.0 | False | False |
FPC 0 PSU Sensor | 30.0 | False | False |
status | |
---|---|
FPC 0 Fan Tray 0 Fan 0 | True |
FPC 0 Fan Tray 1 Fan 0 | True |
%usage | |
---|---|
0 | 70.0 |
0 | |
---|---|
available_ram | 1943 |
used_ram | 350 |
Equipos conectados a Sw1-Tercera_Planta_A (10.10.52.61)- Juniper-EX2300-48P¶
mac | vlan | static | active | moves | last_move | username_from_forti | vlan_name | name_from_forti | hostname | ip_admin | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
interface | ip_form_arp_table_forti | |||||||||||
ge-0/0/24.0 | 10.10.10.132 | 18:03:73:28:6C:3A | 90 | False | True | 0 | 0.0 | OPERACIONES_MAYORES | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/1/0.0 | 10.10.10.118 | 54:BF:48:27:51:F3 | 90 | False | True | 0 | 0.0 | DAVID_MARTINS | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/1/1.0 | 10.10.10.86 | 00:1E:4F:B7:DD:BD | 90 | False | True | 0 | 0.0 | ROMUALDO_GONZALEZ | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/0/13.0 | 10.10.10.67 | 0A:E0:AF:AD:16:77 | 90 | False | True | 0 | 0.0 | ZACARIAS_FLORES | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/0/20.0 | 10.10.10.72 | 00:1E:55:N9:62:3A | 90 | False | True | 0 | 0.0 | JOSE_LOPEZ | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/0/39.0 | 10.10.10.107 | 84:2B:2B:8B:32:E6 | 90 | False | True | 0 | 0.0 | ROSA_AMARAL | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/0/23.0 | 10.10.10.110 | 10:5L:N7:2E:08:2F | 90 | False | True | 0 | 0.0 | LOURDES_PEREZ | Tercera_Planta_A | NaN | Sw1-Tercera_Planta_A | 10.10.52.61 |
- Si queremos sbar a que puerto está conectado un usuario podemos verlo con el siguiente comando:
df_mac_address_table[df_mac_address_table['username_from_forti'].str.contains('CESAR', na=False)].set_index('interface')[['username_from_forti','vlan_name','hostname','ip_admin']]
username_from_forti | vlan_name | hostname | ip_admin | |
---|---|---|---|---|
interface | ||||
ge-0/1/0.0 | DAVID_MARTINS | Tercera_Planta_A | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/1/1.0 | CESAR_TIMOTEO | Tercera_Planta_A | Sw1-Tercera_Planta_A | 10.10.52.61 |
ge-0/1/1.0 | CESAR_TIMOTEO | Tercera_Planta_A | Sw1-Tercera_Planta_A | 10.10.52.61 |
🌍 Escalabilidad y Potencial de la Ciencia de Datos en Redes¶
Hasta ahora, hemos explorado la integración de datos entre un Fortigate y un switch Juniper, obteniendo información valiosa sobre la conectividad y el estado de la red. 🔎
Sin embargo, esto es solo el comienzo. 🚀
📡 ¿Y si pudiéramos aplicar este mismo enfoque a toda la infraestructura de red?
Así como analizamos un solo switch, podríamos recorrer automáticamente todos los switches de la red usando un bucle for
, recolectando y consolidando los datos de cada uno de ellos. Esto nos permitiría:
✅ Tener un mapa completo de la red en minutos.
✅ Conocer la ubicación exacta de cada usuario y dispositivo.
✅ Monitorear el estado de cada switch en tiempo real.
✅ Generar reportes automáticos y centralizados para auditorías.
🚀 Ciencia de Datos en Redes: Un Enfoque Inteligente¶
Lo que hemos logrado aquí demuestra el poder de la ciencia de datos aplicada a la gestión de redes. En lugar de depender de múltiples comandos manuales o revisar logs interminables, ahora automatizamos la recolección, análisis y visualización de datos clave.
💡 Imagina cuánto tiempo podrías ahorrar en tareas como:
- Diagnóstico y solución de problemas en la red.
- Documentación de la infraestructura con datos siempre actualizados.
- Monitoreo proactivo para detectar anomalías antes de que afecten a los usuarios.
Los administradores de red e ingenieros que adopten estas metodologías podrán optimizar sus tiempos, mejorar la visibilidad de su infraestructura y reducir costos operativos.
📊 La automatización y el análisis de datos no reemplazan la experiencia de un buen ingeniero de redes... ¡la potencian! 🔥
📢 ¡Anímate a explorar la Ciencia de Datos para Redes!¶
Si aún no has explorado la combinación de Networking + Data Science, este es el momento ideal. Con herramientas como NAPALM, Netmiko, Pandas y Plotly, puedes transformar la forma en que gestionas tu red.
🔧 Menos tiempo en tareas repetitivas.
📡 Más tiempo para optimizar y mejorar tu infraestructura.
📊 Más control y visibilidad sobre tus dispositivos y tráfico.
🚀 ¡El futuro de la administración de redes es inteligente, automatizado y basado en datos!