Capítulo 7 — Redes y protocolos
Mapa de la lección
Lección 07 publicada. Mapa, ejemplo, EX019.
flowchart TD
N0["Resultados de aprendizaje"]
N1["7.1 Modbus/TCP en una trama"]
N2["7.2 Sin identidad en el protocolo"]
N3["7.3 Leer la salida"]
N4["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Ejemplo resuelto"]
EX --> Q["Ejercicio EX019"]
Dibujo lógico
flowchart LR
N0["Resultados de aprendizaje"]
N1["7.1 Modbus/TCP en una trama"]
N2["7.2 Sin identidad en el protocolo"]
N3["7.3 Leer la salida"]
N4["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX019"]
[Resultados de aprendizaje]
|
v
[7.1 Modbus/TCP en una trama]
|
v
[7.2 Sin identidad en el protocolo]
|
v
[7.3 Leer la salida]
|
v
[Síntesis del capítulo]
|
v
[Ejemplo resuelto] --> [Ejercicio EX019]
Resultados de aprendizaje
Usted podrá (1) decodificar la cabecera MBAP de Modbus/TCP y el código de función a partir de bytes en bruto; (2) distinguir los códigos de función de lectura y de escritura; (3) explicar por qué Modbus no ofrece autenticación; y (4) enunciar lo que un decodificador de protocolos puede y no puede decirle a un analista.
7.1 Modbus/TCP en una trama
Modbus/TCP lleva una cabecera MBAP de siete bytes —identificador de transacción (2 bytes), identificador de protocolo (2, siempre cero), longitud (2) e identificador de unidad (1)— seguida de la unidad de datos del protocolo, que empieza con un código de función de un byte. La Modbus Application Protocol Specification V1.1b3 define los códigos: el 3 lee registros de retención, el 6 escribe un único registro y el 16 escribe varios registros. En el laboratorio del decodificador, la trama 2 lleva el código de función 6 y la trama 3 el código de función 16; ambas son escrituras, y por eso la lista de permitidos del capítulo 27 se fija en el código de función antes que en la dirección.
7.2 Sin identidad en el protocolo
Nada en la trama dice quién la envió. Cualquier equipo que pueda abrir el puerto TCP 502 de un controlador puede emitir una escritura si el dispositivo la acepta. La seguridad debe venir, por tanto, de la red (segmentación, listas de permitidos) o de una variante protegida como Modbus/TCP Security, que envuelve el protocolo en TLS con roles basados en certificados.
"""Lab 07: decode synthetic Modbus/TCP request headers (offline bytes only)."""
import struct
FC = {1: "read coils", 3: "read holding registers", 4: "read input registers",
5: "write single coil", 6: "write single register", 16: "write multiple registers"}
frames = ["000100000006010300640002", "00020000000601060064012c", "000300000006011000c80001"]
for h in frames:
b = bytes.fromhex(h)
tid, pid, length, unit, fc = struct.unpack(">HHHBB", b[:8])
addr, val = struct.unpack(">HH", b[8:12])
kind = "WRITE" if fc in (5, 6, 15, 16) else "read"
print(f"tid={tid} unit={unit} fc={fc} ({FC[fc]}) addr={addr} arg={val} -> {kind}")
Ejecútelo con python3 lab_modbus.py. Salida verificada:
tid=1 unit=1 fc=3 (read holding registers) addr=100 arg=2 -> read
tid=2 unit=1 fc=6 (write single register) addr=100 arg=300 -> WRITE
tid=3 unit=1 fc=16 (write multiple registers) addr=200 arg=1 -> WRITE
Para PLC-H, que no puede autenticar a los clientes Modbus, este es todo el argumento de los controles compensatorios del capítulo 24: la lista de permitidos del cortafuegos que nombra a HMI-1 y HIST-1 como únicos orígenes autorizados es la comprobación de identidad que le falta al protocolo. Un equipo de la VLAN de oficina que alcanza el puerto 502 es, para PLC-H, indistinguible de HMI-1.
7.3 Leer la salida
La trama 2 escribe el valor 300 en el registro 100; la trama 3 es una escritura de varios registros que empieza en el 200. Observe que el decodificador imprime la dirección inicial y el primer argumento, pero no sabe qué significa el registro 100: eso proviene del mapa de registros del PLC, que es documentación de la planta, no del protocolo. En el mapa de registros de LDHP, el registro 100 contiene el punto de consigna de la temperatura de impulsión en décimas de grado, así que el valor 300 significa 30,0 °C, muy por debajo del punto de funcionamiento de 90 °C. Esa es la diferencia entre «escribir un único registro» y «posible pérdida de calefacción». La nota de Maya añade una columna del mapa de registros precisamente por esta razón, y marca la escritura de varios registros de la trama 3 en el 200 como no explicada hasta que el mapa diga qué controlan los registros a partir del 200.
Caso sintético — Lakeside District Heating Plant. Las tramas del laboratorio se compusieron a mano; no se contactó con ningún dispositivo ni red.
Errores y límites
Algunos dispositivos usan direccionamiento desde cero y algunos documentos usan la numeración de estilo 40001; mezclarlos provoca errores de desfase en uno. Decodificar tráfico de una planta que usted no está autorizado a supervisar no es una práctica aceptable.
Ejercicios — capítulo 7
- EX019 — Decodificar una cuarta trama. Decodifique
000400000006010400320004. Rúbrica: 3 = tid 4, fc 4 lectura de registros de entrada, dirección 50, cantidad 4, lectura; 2 = código de función correcto; 1 = orden de bytes incorrecto; 0 = nada. - EX020 — Lo que la trama no puede decir. Dé dos hechos sobre la trama 2 que no pueden deducirse de sus bytes. Rúbrica: 3 = identidad/autorización del emisor y significado de ingeniería del registro 100; 2 = uno; 1 = enumera campos de la cabecera; 0 = nada.
- EX021 — Escalar una escritura de punto de consigna. Con el escalado de LDHP en décimas de grado, ¿qué valor de registro fija 92,5 °C? Rúbrica: 3 = 925; 2 = 92 o 93 mencionando el escalado; 1 = 92,5; 0 = nada.
Síntesis del capítulo
Un decodificador de protocolos le da la estructura; la documentación de la planta le da el significado; y la segmentación, no el protocolo, le da la identidad.
Siga estudiando — capítulo 07 de 40
← Capítulo 06 (borrador) · Índice de capítulos del curso · Capítulo 08 (borrador) →