Si vous dĂ©veloppez une application qui s'exĂ©cute sur un rĂ©seau ou que vous dĂ©boguez le fonctionnement d'une telle application, une connaissance approfondie du fonctionnement des protocoles rĂ©seau vous facilitera grandement la tĂąche. La principale source de ces connaissances sont les RFC et, heureusement, elles sont dans le domaine public depuis longtemps. De plus, vous pouvez les lire mĂȘme avec les liens du navigateur de la console, car ils ne contiennent rien d'autre que le texte.
NĂ©anmoins, trĂšs probablement la plupart des lecteurs de Habr n'ont jamais lu le texte entier d'au moins une RFC, mĂȘme RFC-2616... En plus du style furieux des documents bureaucratiques, la barriĂšre de la langue peut ĂȘtre un frein. De plus, le plus souvent, vous devez comprendre certains aspects spĂ©cifiques de l'architecture du protocole : la longueur et le type de champs, le code de retour, l'emplacement dans l'en-tĂȘte. Vous n'avez pas besoin de tout lire d'un bout Ă l'autre pour le faire.
Juste pour ce cas, Protocol a été écrit , une application console assez simple écrite en Python. Il a un double objectif.
- Offrez aux dĂ©veloppeurs et aux ingĂ©nieurs la possibilitĂ© de voir facilement et facilement le diagramme d'en-tĂȘte des protocoles rĂ©seau les plus courants directement Ă partir de la ligne de commande.
- Offrez aux chercheurs et aux ingĂ©nieurs la possibilitĂ© de crĂ©er rapidement des diagrammes d'en-tĂȘte ASCII pour leurs propres protocoles personnalisĂ©s.
Installation et configuration
Le code source est sur GitHub , vous pouvez le télécharger de maniÚre standard.
git clone https://github.com/luismartingarcia/protocol.git
La configuration est effectuée par une commande avec les droits d'utilisateur root.
setup.py install
Ătant donnĂ© que le programme n'a actuellement pas de mĂ©canisme d'installation standard pour les distributions Linux ou Python, il est prĂ©fĂ©rable de se rappeler oĂč les fichiers sont copiĂ©s.
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
Exécuter le protocole
Le programme a deux principaux modes de fonctionnement :
- protocole <nom du protocole existant> ;
- protocole <spécifications du protocole natif>.
Les protocoles standard suivants sont 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
Voici des exemples d'utilisation de l'utilitaire.
|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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Dans une commande, vous pouvez spécifier plusieurs protocoles à la fois, en les séparant par un espace.
|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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Le protocole est vif d'esprit, il n'est pas nĂ©cessaire de taper le nom du protocole en entier, si vous ĂȘtes vraiment paresseux vous pouvez, par exemple, taper dot au lieu de dot1q. Cependant, comme dans le cas de l'autocomplĂ©tion, en cas de choix ambigu, il est proposĂ© de choisir l'une des alternatives.
|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
Développements propres
La caractéristique la plus importante de la spécification du protocole est la liste des champs. Vous pouvez les spécifier pour votre propre protocole comme suit.
|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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Des options supplémentaires étendent les capacités de formatage des graphiques ASCII. Vous pouvez spécifier le nombre de bits par ligne, définir les caractÚres du séparateur et des pseudo-graphiques. La commande précédente avec des options pseudo-graphiques donnera ce qui suit.
|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 | *---------------------------------------------------------------*
Protocole + tshark
Des informations plus complĂštes sur la structure des protocoles rĂ©seau peuvent ĂȘtre obtenues en ouvrant le fichier pcap/pcapng enregistrĂ© du trafic rĂ©seau dans tshark . Si vous ne regardez que dans tshark, vous ne pouvez pas voir la forĂȘt pour les arbres, et avec le protocole - ce dont vous avez besoin.
|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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bien sûr, des programmes comme Protocol et tshark ne peuvent et ne doivent pas remplacer la lecture des sources primaires, car †e Les RFC, cependant, peuvent faire gagner beaucoup de temps aux programmeurs et aux administrateurs systÚme.
Les serveurs cloud de Macleod sont rapides et sécurisés.
Inscrivez-vous en utilisant le lien ci-dessus ou en cliquant sur la banniÚre et bénéficiez d'une remise de 10 % pour le premier mois de location d'un serveur de n'importe quelle configuration !