graph TD subgraph Trafico_Bruto ["Tráfico Total de la Red"] P1["Paquete A (PROFINET)"] P2["Paquete B (ARP)"] P3["Paquete C (HTTP)"] end subgraph Filtro_Captura ["Filtro de Captura (BPF)
'Solo quiero PROFINET'"] F_Cap("eth.type == 0x8892") end subgraph Archivo_PCAP ["Archivo Capturado (.pcapng)"] P1_Cap["Paquete A (PROFINET)"] end subgraph Filtro_Display ["Filtro de Visualización
'Muéstrame solo el dispositivo X'"] F_Disp("pn_io.device_name == 'robot-celda-1'") end subgraph Vista_Analisis ["Vista en Wireshark"] P1_Filt["Paquete A (Filtrado)"] end Trafico_Bruto --> Filtro_Captura Filtro_Captura -->|"Solo guarda lo que coincide"| Archivo_PCAP Archivo_PCAP -->|"Carga todos los paquetes guardados"| Filtro_Display Filtro_Display -->|"Solo muestra lo que coincide"| Vista_Analisis style Filtro_Captura fill:#e74c3c,color:white style Filtro_Display fill:#3498db,color:white style Archivo_PCAP fill:#f1c40f,color:#333

1. El Problema: Ahogado en Datos

Una red industrial moderna, incluso una pequeña, puede generar millones de paquetes por minuto. Si un técnico de UF1794 simplemente pulsa "Start Capture" en Wireshark, en pocos segundos tendrá un archivo de captura con cientos de miles de paquetes de ARP, PROFINET, DHCP, SNMP, etc. Encontrar el paquete exacto que causa el problema es como buscar una aguja en un pajar. Para ser eficientes, debemos filtrar.

Wireshark ofrece dos tipos de filtros fundamentalmente diferentes, y confundirlos es un error de principiante: Filtros de Captura y Filtros de Visualización.



2. Filtros de Captura (Capture Filters)

Un filtro de captura se aplica ANTES de empezar a capturar. Su función es decirle al driver de la tarjeta de red qué paquetes debe descartar por hardware antes de que lleguen a Wireshark. Esto es extremadamente útil en redes muy congestionadas para evitar que el archivo de captura ocupe gigabytes en pocos minutos y para no sobrecargar la CPU del portátil.

  • Sintaxis: Utilizan la sintaxis BPF (Berkeley Packet Filter), más antigua y menos intuitiva. Ejemplos: host 192.168.1.10, port 502, ether proto 0x8892.
  • Ventaja: Ahorro masivo de recursos (CPU y disco).
  • Desventaja: Es una decisión destructiva. Si aplicas un filtro demasiado agresivo (ej. `host 192.168.1.10`) y el problema resulta ser un conflicto de IP con otro equipo, nunca lo verás, porque has descartado todos los paquetes que no son de esa IP. Regla de oro: si no estás seguro, no uses filtros de captura.


3. Filtros de Visualización (Display Filters)

Un filtro de visualización se aplica DESPUÉS de haber capturado el tráfico (o en tiempo real mientras se captura). Su función no es descartar paquetes, sino ocultar de la lista los que no cumplen el criterio. Es como usar la barra de búsqueda en un documento de Word: el texto sigue ahí, pero solo ves las coincidencias.

  • Sintaxis: Es mucho más potente, flexible e intuitiva. Permite filtrar por cualquier campo de cualquier protocolo que Wireshark entienda. Ejemplos: ip.addr == 192.168.1.10, profinet.pn_io, modbus.func_code == 3.
  • Ventaja: No es destructivo. Puedes aplicar, quitar y combinar filtros complejos sobre la marcha para analizar el problema desde diferentes ángulos sin tener que volver a capturar.
  • Desventaja: No ahorra recursos durante la captura. Si la red está muy cargada, el archivo puede ser enorme.


4. Filtros Esenciales para el Técnico OT

Un técnico de automatización debe tener una "chuleta" de filtros de visualización para los protocolos más comunes:

  • PROFINET RT: profinet o, a más bajo nivel, eth.type == 0x8892.
  • PROFINET Alarmas: pn_rt.alarm_type.
  • PROFINET Nombres: dcp.option == 2 and dcp.suboption == 2 (para ver las peticiones de asignación de nombre de estación).
  • EtherNet/IP: enip (para ver todo el tráfico CIP).
  • EtherNet/IP I/O: cip.io (para ver solo la mensajería implícita).
  • Modbus/TCP: modbus o tcp.port == 502.
  • Tráfico de un equipo: ip.addr == 192.168.1.50.
  • Combinado: ip.addr == 192.168.1.50 and modbus (para ver solo el tráfico Modbus de un equipo específico).
Ilustración conceptual de filtrado de paquetes de red, mostrando cómo se extrae información útil del ruido.
Figura 1: El poder del filtrado. En lugar de buscar manualmente, los filtros (como ip.addr == 192.168.1.10) actúan como un tamiz digital, ocultando el "ruido" de fondo de la red y revelando únicamente la conversación de interés para el diagnóstico.
Fuente: Elaboración propia / Licencia: CC BY-NC 4.0.

📝 Evaluación Técnica: Filtrado en Wireshark

1. ¿Cuál es la diferencia fundamental entre un filtro de captura y un filtro de visualización en Wireshark?

2. Estás en una red muy congestionada y tu portátil se ralentiza al capturar. Solo te interesa guardar el tráfico Modbus/TCP para analizarlo más tarde. ¿Qué tipo de filtro y qué sintaxis usarías?

3. Has capturado un archivo de 500 MB y ahora quieres ver únicamente el tráfico PROFINET RT (tiempo real) que se intercambia entre el PLC y los dispositivos. ¿Qué filtro de visualización es el más específico y correcto para ello?

🤖 Ejercicio Práctico 6: Sniffer Selectivo con Scapy

Objetivo: Comprender cómo se aplica un filtro de captura a nivel de programación para optimizar un script de análisis de red.

Copia el siguiente *prompt* y pégalo en un modelo de IA (como ChatGPT, Gemini o Claude).

Actúa como un desarrollador de herramientas de red. Escribe un script en Python que utilice la librería `scapy` para capturar y mostrar únicamente paquetes ARP. El script debe: 1. Importar las funciones necesarias de `scapy`. 2. Definir una función `packet_callback(packet)` que simplemente imprima un resumen del paquete capturado usando `packet.summary()`. 3. Iniciar la captura (sniff) utilizando el argumento `filter` con la sintaxis BPF para capturar solo paquetes ARP (`filter="arp"`). 4. Añadir un contador para detener la captura después de recibir 5 paquetes ARP. Comenta el código explicando que el uso del argumento `filter` es mucho más eficiente que capturar todo y luego usar un `if packet.haslayer(ARP):` dentro de la función, ya que el filtrado se realiza a un nivel mucho más bajo y optimizado.