Si está desarrollando una aplicación que se ejecuta en una red o está depurando el funcionamiento de dicha aplicación, un conocimiento profundo de cómo funcionan los protocolos de red facilitará enormemente su tarea. La fuente principal de dicho conocimiento son las RFC y, afortunadamente, han estado en el dominio público durante mucho tiempo. Además, puede leerlos incluso con los enlaces del navegador de la consola, ya que no contienen nada más que el texto.
Sin embargo, lo más probable es que la mayoría de los lectores de Habr nunca hayan leído el texto completo de al menos un RFC, incluso el RFC-2616.... Además del estilo furioso de los documentos burocráticos, la barrera del idioma puede ser un obstáculo. Además, la mayoría de las veces necesita comprender algún aspecto específico de la arquitectura del protocolo: la longitud y el tipo de campos, código de retorno, ubicación dentro del encabezado. No tiene que leer todo de principio a fin para hacer esto.
Solo para este caso, se escribió Protocol , una aplicación de consola bastante simple escrita en Python. Tiene un doble propósito.
- Proporcione a los desarrolladores e ingenieros la capacidad de ver fácil y fácilmente el diagrama de encabezado de los protocolos de red más comunes directamente desde la línea de comandos.
- Proporcione a los investigadores e ingenieros la capacidad de crear rápidamente diagramas de encabezado ASCII para sus propios protocolos personalizados.
Instalacion y configuracion
El código fuente está en GitHub , puedes descargarlo de forma estándar.
git clone https://github.com/luismartingarcia/protocol.git
La configuración se realiza mediante un comando con derechos de usuario root.
setup.py install
Dado que el programa actualmente no tiene un mecanismo de instalación estándar para distribuciones de Linux o Python, es mejor recordar dónde se copian los archivos.
running install running build running build_scripts creating build creating build/scripts-3.9 copying and adjusting protocol -> build/scripts-3.9 copying constants.py -> build/scripts-3.9 copying specs.py -> build/scripts-3.9 changing mode of build/scripts-3.9/protocol from 644 to 755 changing mode of build/scripts-3.9/constants.py from 644 to 755 changing mode of build/scripts-3.9/specs.py from 644 to 755 running install_scripts copying build/scripts-3.9/protocol -> /usr/bin copying build/scripts-3.9/constants.py -> /usr/bin copying build/scripts-3.9/specs.py -> /usr/bin changing mode of /usr/bin/protocol to 755 changing mode of /usr/bin/constants.py to 755 changing mode of /usr/bin/specs.py to 755 running install_egg_info Writing /usr/lib/python3.9/site-packages/protocol-0.1-py3.9.egg-info
Ejecutar protocolo
El programa tiene dos modos principales de funcionamiento:
- protocolo <nombre del protocolo existente>;
- protocolo <especificaciones de protocolo nativo>.
Los siguientes protocolos estándar están disponibles
ethernet : Ethernet
8021q : IEEE 802.1q
dot1q : IEEE 802.1q
tcp : Transmission Control Protocol (TCP)
udp : User Datagram Protocol (TCP)
ip : Internet Protocol (IP), version 4.
ipv6 : Internet Protocol (IP), version 6.
icmp : Internet Control Message Protocol (ICMP)
icmp-destination: : ICMP Destination Unreachable
icmp-time : ICMP Time Exceeded
icmp-parameter : ICMP Parameter Problem
icmp-source : ICMP Source Quench
icmp-redirect : ICMP Redirect
icmp-echo : ICMP Echo Request/Reply
icmp-timestamp : ICMP Timestamp Request/Reply
icmp-information : ICMP Information Request/Reply
icmpv6 : ICMP for IPv6 (ICMPv6)
icmpv6-destination : ICMPv6 Destination Unreachable
icmpv6-big : ICMPv6 Packet Too Big
icmpv6-time : ICMPv6 Time Exceeded
icmpv6-parameter : ICMPv6 Parameter Problem
icmpv6-echo : ICMPv6 Echo Request/Reply
icmpv6-rsol : ICMPv6 Router Solicitation
icmpv6-radv : ICMPv6 Router Advertisement
icmpv6-nsol : ICMPv6 Neighbor Solicitation
icmpv6-nadv : ICMPv6 Neighbor Advertisement
icmpv6-redirect : ICMPv6 Redirect
A continuación, se muestran ejemplos del uso de la utilidad.
|12:09:41|admin@redeye:[~]> protocol ip 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |12:09:45|admin@redeye:[~]> protocol ipv6 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| Traffic Class | Flow Label | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Payload Length | Next Header | Hop Limit | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Source Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Destination Address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
En un comando, puede especificar varios protocolos a la vez, separándolos con un espacio.
|12:34:16|admin@redeye:[~]> protocol icmp-time icmp-timestamp 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Internet Header + 64 bits of Original Data Datagram + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Originate Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Receive Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Transmit Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
El protocolo es ingenioso, no es necesario escribir el nombre del protocolo completo, si es realmente vago puede, por ejemplo, escribir dot en lugar de dot1q. Sin embargo, como en el caso del autocompletado, en caso de una elección ambigua, se propone elegir una de las alternativas.
|12:43:25|admin@redeye:[~]> protocol icmpv6-r
Ambiguous protocol specifier 'icmpv6-r'. Did you mean any of these?
icmpv6-radv
icmpv6-redirect
icmpv6-rsol
Desarrollos propios
La característica más importante de la especificación del protocolo son las listas de campos. Puede especificarlos para su propio protocolo de la siguiente manera.
|12:55:16|mikayel@redeye:[~]> protocol «Source:16,Reserved:40,RTT:8» 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | Reserved | RTT | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Las opciones adicionales amplían las capacidades de formato de los gráficos ASCII. Puede especificar el número de bits por línea, establecer los caracteres para el separador y los pseudo gráficos. El comando anterior con opciones de pseudo-gráficos dará lo siguiente.
|16:02:05|mikayel@redeye:[~]> protocol «Source:16,Reserved:40,RTT:8?\ numbers=y,startchar=*,endchar=*,evenchar=-,oddchar=-,sepchar=|» 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 *---------------------------------------------------------------* | Source | | *-------------------------------* *---------------* | Reserved | RTT | *---------------------------------------------------------------*
Protocolo + tshark
Se puede obtener información más completa sobre la estructura de los protocolos de red abriendo el archivo pcap / pcapng guardado del tráfico de red en tshark . Si miras solo en tshark, no puedes ver el bosque por los árboles, y junto con el Protocolo , lo que necesitas.
|16:08:05|admin@redeye:[~]> sudo tshark -r /tmp/exmp.pcap -V
Transmission Control Protocol, Src Port: 48378, Dst Port: 443, Seq: 1, Ack: 1, Len: 0
Source Port: 48378
Destination Port: 443
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 1120003294
[Next Sequence Number: 1 (relative sequence number)]
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 4090007166
1000 .... = Header Length: 32 bytes (8)
Flags: 0x010 (ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······A····]
Window: 501
[Calculated window size: 501]
[Window size scaling factor: -1 (unknown)]
Checksum: 0xfbe8 [unverified]
[Checksum Status: Unverified]
Urgent Pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option — No-Operation (NOP)
Kind: No-Operation (1)
TCP Option — No-Operation (NOP)
Kind: No-Operation (1)
TCP Option — Timestamps: TSval 2014817649, TSecr 2606727549
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 2014817649
Timestamp echo reply: 2606727549
|16:28:51|admin@redeye:[~]> protocol tcp
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset| Res. | Flags | Window |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Por supuesto, programas como Protocol y tshark no pueden ni deben reemplazar la lectura de fuentes primarias, porque ․ e ․ Sin embargo, las RFC pueden ahorrar mucho tiempo a los programadores y administradores de sistemas.
Los servidores en la nube de Macleod son rápidos y seguros.
Regístrese usando el enlace de arriba o haciendo clic en el banner y obtenga un 10% de descuento durante el primer mes de alquiler de un servidor de cualquier configuración.