Table des matières
Réseau LPROB
Sockets
Explication sur le modèle OSI, les différentes couches:
https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI
VLAN
Adressage
Outils d'analyse Wireshark
Wireshark est un logiciel permettant d'analyser les échanges réseau sur une interface (notamment réseau ethernet) d'un PC. La fenêtre de Wireshark est divisée en trois zones:
- La première affiche les différentes trames capturées, numérotées, datées, etc… cliquer sur une trame pour la sélectionner.
- La seconde permet d'analyser la trame sélectionnée aux différentes couches réseau. Les différentes couches peuvent être détaillées en cliquant sur la flèche à gauche de son nom.
Les quatres couches réseau présentées sont dans l'ordre: Couche Physique, Couche Réseau, Couche Transport, Couche Services.
- La troisième permet de visualiser le contenu en hexa et en ascii de la trame.
La figure suivante montre une capture d'écran de l'application. La trame n°489 est affichée. La couche Réseau est détaillée, notamment l'adresse MAC du destinataire de la trame. L'affichage de la valeur en hexadécimal est visible (zone sélectionnée dans la partie inférieure de la fenêtre).
Installation de Wireshark
Télécharger et installer sur D: https://bvdp.inetdoc.net/files/reseauLPROB/wireshark-portable-3-5-0.exe
Filtrage avec Wireshark
exemples de filtre:
tcp && ( (ip.src==10.6.11.65 && ip.dst==10.6.7.124) || (ip.src==10.6.7.124 && ip.dst==10.6.11.65))
udp && ( ip.addr==172.16.6.59)
Administration réseau sous Windows 10
Pinger un hôte:
ping ipv4
Lister les voisins:
netsh int ipv4 show nei
Lister la table de routage:
netsh int ipv4 show route
Lister les interfaces réseau et les adresses:
netsh int ipv4 show addr
Ne plus utiliser ipconfig /all car il ne liste pas les plusieurs adresses IPv4 que peut avoir une même interface
Pour renouveler les baux dhcp, ce n'est pas automatique sous windows à la déconnexion/reconnexion, il faut faire:
ipconfig /renew
Pour déterminer l'adresse IP d'un site web à partir de son nom:
nslookup nom_du_site
Liste des numéros de ports TCP et UDP réservés: https://fr.wikipedia.org/wiki/Liste_de_ports_logiciels
Application client TCP pour middleWare
Nous allons maintenant simuler un client TCP afin que vous puissiez l'utiliser depuis votre PC sans avoir besoin de SRS.
Pour cela, enregistrer dans le dossier R:\lprob\“nom_prenom” le code du programme suivant (en faisant clic droit sur le nom puis enregistrer sous)
- simu_client_srs.py
import socket HOST = '172.16.6.59' # The server's hostname or IP address PORT = 30000 # The port used by the server with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'r 158 161 162') data = s.recv(1024) print('Received', repr(data))
Editer ce fichier avec idle pour l'adapter selon les consignes données en séance en modifiant les variables, en tapant dans la commande windows:
C:\"Program Files"\Python39\Lib\idlelib\idle simu_client_srs.py
Après édition, sauver le fichier et l’exécuter depuis idle en faisant F5:
Application récepteur UDP pour middleWare
- receptupd.py
import socket HOST = '127.0.0.1' # The server's hostname or IP address PORT = 4242 # The port used by the server with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.bind(('', 10000)) while True: msg, addr = s.recvfrom(8192) # This is the amount of bytes to read at maximum print("Got message from %s: %s" % (addr, msg ))
Émetteur et récepteur UDP
Exemples tirés de: https://wiki.python.org/moin/UdpCommunication
- rec_udp.py
import socket UDP_IP = "" #recevoir des requetes depuis toutes les ip UDP_PORT = 5005 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) while True: data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes print("received message: %s" % data)
- send_udp.py
import socket UDP_IP = "127.0.0.1" UDP_PORT = 5005 MESSAGE = b"Hello, World!" print("UDP target IP: %s" % UDP_IP) print("UDP target port: %s" % UDP_PORT) print("message: %s" % MESSAGE) sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
Client et serveur TCP
Exemples tirés et adaptés de https://python.doctor/page-reseaux-sockets-python-port
- client_tcp.py
# coding: utf-8 import socket hote = "localhost" port = 15555 socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket.connect((hote, port)) print ("Connection on "+str(port)) socket.send("Hey my name is Bertrand!".encode('utf-8')) print("Close") socket.close()
- server_tcp.py
# coding: utf-8 import socket socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket.bind(('', 15555)) #recevoir des requetes depuis toutes les ip while True: socket.listen(5) client, address = socket.accept() print(str( address )+ " connected") response = client.recv(255) if response != "": print(response) print("Close") client.close() stock.close()
Avec Wireshark, espionner la boucle locale avec filtre tcp.port==15555
puis faire une requête http depuis le navigateur web pour voir la requête GET sur le serveur TCP:
b'GET / HTTP/1.1\r\nHost: localhost:15555\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/110.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: fr,fr-FR;q=0'
Gestion du multrithreading pour le serveur
Serveur http simple
exemple tiré de: https://www.linuxtricks.fr/wiki/python-creer-un-petit-serveur-web-a-la-volee
python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
faire un fichier index.html contenant
coucou
accéder au serveur via: http://localhost:8000/
pour ouvrir le serveur sur le port 80:
sudo python3 -m http.server 80
Serveur http à peine plus évolué
import http.server PORT = 8888 server_address = ("", PORT) server = http.server.HTTPServer handler = http.server.CGIHTTPRequestHandler handler.cgi_directories = ["/index.html"] print("Serveur actif sur le port :", PORT) httpd = server(server_address, handler) httpd.serve_forever()
Serveur http plus évolué avec Flask
- server_http_flask.py
from flask import Flask cpt=0 app = Flask(__name__) @app.route('/') def index(): return 'Hello world' ''' global cpt chaine = 'Hello world cpt='+str(cpt) cpt=cpt+1 return chaine ''' app.run(debug=True, host='0.0.0.0', port=5000)
Serveur web apache
https://bvdp.inetdoc.net/tpreseau/simple.htm
montrer (s)ftp via fileZilla