Cela fait longtemps que j’aimerais me lancer dans la programmation réseau car c’est un domaine où je me sens vierge de connaissance.
Pour remédier à cette lacune, je vais tenter de détecter toutes les IP visibles sur mon réseau privé.
On y trouve, comme dans beaucoup de maison, des ordinateurs, des téléphones/tablettes, des appareils multimedia, …
Mon but, dans un premier temps, est de simplement les lister! Je verrai ensuite si il y a moyen (bien sûre que oui) de les présenter un peu mieux à l’écran…
Donc, pour réaliser cela, il faut déjà savoir ce qu’il y a lieu de faire! Une petite recherche s’impose.
Si l’on en croit Wikipedia, il existe différents protocols associés au transfert de données. Les plus importants étant IPv4, IPv6, mais aussi Internet Stream Protocol, TP/IX, PIP ou encore TUBA.
Pour ce que j’ai l’intention de réaliser, je vais, de toute évidence utiliser les 2 premiers protocols nommés ci dessus IPv4 et IPv6.
L’IPv4 est un protocol permettant de codé une adresse sur 32bits et donc un peu plus de 4 milliards de combinaison. C’est pas mal mais insuffisant pour le monde dans lequel nous vivons, quoique bien assez pour un réseau privé.
L’IPv6 par contre permet de coder une adresse sur 128bits, ce qui offre bien plus de possibilités (environ 3.4 x 10³⁸ combinaisons 340 milliards de milliards de milliards de milliards de combinaisons). Est ce vraiment nécessaire pour un réseau privé??? Oui et non mais ceci est une autre discution.
Bref! Dans un premier temps, je vais juste me limiter au protocol IPv4 car, à priori, ce serait le protocol le plus utilisé au sein d’un réseau privé.
Toujours sur cette même page Wikipedia on peut voir un schéma assez grossier mais néanmoins intéressant de ce que l’on peut trouver dans l’entête d’un protocol IPv4. Pour une question de visibilité, les informations ont été regroupées par tranche de 32bits (1 DWORD)
4 bits version (ici 0100 = 4)
4 bits IHL (je ne sais pas encore ce que c’est)
8 bits ToS (encore un truc à apprendre)
16 bits Total Length (La longueur totale, je suppose du paquet puisque l’entête a une taille fixe)
16 bits Identification (Serait ce un numéro unique??? Étrange! Je croyais justement que c’était l’IP qui faisait cela…)
2 bits Flags (Je ne sais pas encore à quoi cela correspond)
14 bits Fragment Offset (La position du paquet dans une liste de paquets qui pourraient arriver dans le désordre) (( mmmm Est ce que cela aurait un rapport avec Identification ci dessus???))
8 bits Time To Live (Un timeout, je suppose)
8 bits Protocol (L’identificateur du protocol employé par dessus IP tel que UDP ou TCP)
16 bits Header Checksum (Le seul moyen de vérifier que cette entête ci n’est pas corrompue)
32 bits Source Address (L’adresse IP de l’émetteur du paquet en cours)
32 bits Destination Address (l’adresse IP du destinataire du paquet en cours)
24 bits Options (Voilà un truc bien explicite…)
8 bits Padding (Y aurait il un espace entre les différentes données ou bien un formatage préétabli??? À voir en profondeur…).
MMMMM! C’est intéressent tout cela mais est ce que j’ai besoin vraiment de connaître tout cela pour réaliser mon petit projet basique? C’est le moment d’aller voir ce qu’il convient de faire pour tenter de repérer ce qui se trouve sur le réseau privé! Si j’en crois le protocol, en écoutant se qu’il se passe sur le réseau, on peut connaître qui envoie et qui reçoit un paquet. C’est bien, c’est déjà 2 IP connues mais si une machine n’émet pas, il est impossible de savoir si elle existe. (C’est comme un prof qui fait sa prise de présence pour la première fois. Il ne sais pas à qui il s’adresse ni même si il a reçu des noms inexistant.) Techniquement, l’adresse de destination est peut être une erreur de l’envoyeur. Mais également, l’adresse de la source pourrait être fausse, c’est pas interdit d’écrire n’importe quoi! Mieux que cela, une même machine pourrait avoir plus d’une adresse IP…
Ceci étant développé, n’y aurait il pas quelque chose qui permettrait à 2 machines de se dire bonjour, de se saluer, de se donner la main, …
Ça, je connais déjà la réponse, il suffit de jouer au ping pong… Tout ordinateur est capable d’envoyer et de recevoir un ping et/ou d’y répondre par un pong. C’est un peu comme si un ordi dit bonjour je m’appelle IP x est ce que IP y est bel et bien là? Et ensuite l’ordinateur y répond Bonjour je suis bien là!
C’est franchement plus pratique que de manipuler les paquets IP directement, quoique une combinaison des 2 devrait nous apporter énormément d’informations utiles!
La commande Ping sur un ordinateur est une implémentation du protocol ICMP par dessus le protocol IP qui permet de demander à une machine distante de savoir si elle est bien présente. Cela permet également de connaître le temps de réponse du serveur mais également le nombre de routeur que l’on peut trouver entre les 2 machines grâce au fameux TTL (Time To Live vu plus haut)
Donc, si j’ai bien compris, pour connaître les machines disponible sur un réseau privé, il suffit d’envoyer un Ping à toutes les adresses possible de ce réseau et de contrôler si on a une réponse ou non!
Tout cela, c’est bien mais cela ne reste que de la théorie! En pratique, qu’en est il? Existe t’il des librairies permettant de faire tout ce petit travail ou bien il faut réinventer la roue? Je pense qu’il y a un programme qui fait déjà le travail et qui s’appellerait nmap me semble t’il! Je vais aller voir cela de suite…
En effet NMAP est bel et bien ce que je pensais, et c’est même mieux que cela puisqu’il est possible également avec ce programme de connaître les ports ouverts et ainsi connaître quels sont les protocols à utiliser, pour autant que les numéros de port soient respecté par rapport à leur fonction dictée, mais aussi par le message que ces ports renvoie lors d’une interrogation…
Afin de ne pas réécrire ce genre de logiciel, ne serait il pas intéressent d’écrire un programme qui donne les options à nmap et qui récupère sa sortie???