PSR SE2a4 2022/2023 G5 : Différence entre versions
(→Ce qui a été fait) |
(→Ce qui a été fait) |
||
Ligne 69 : | Ligne 69 : | ||
<li> pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable). => time </li><br> | <li> pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable). => time </li><br> | ||
<li> Free mutexes => | <li> Free mutexes => | ||
− | ajout dans la fonction <br>int mutex_fin(void)<br>free(mutexes)<br>à la fin de la fonction</li><br> | + | ajout dans la fonction <br>int mutex_fin(void)<br>free(mutexes)<br>à la fin de la fonction,de cette manière le thread est libérer mais pas l'allocation mémoire</li><br> |
</ul> | </ul> | ||
Version du 10 juin 2023 à 10:47
Sommaire
TP SMTP 2022 - Spécifications techniques
Farid LAZOUACHE / William BECUE
GITHUB
https://github.com/FaridLazouache/SMTP
Paramètres du TP
Groupe | Domaine | Nom VM | IPv4 virtuelle | IPv4 routée | VLAN privé | Réseau local IPv4 | Cisco 6509-E | Cisco 9200 | ISR4331 | IPv6 |
---|---|---|---|---|---|---|---|---|---|---|
Groupe 5 | miserable.site | VMalex2 | 10.24.0.250 | 193.48.57.167/28 | 24 | 10.24.0.0/16 | 10.24.0.251 | 10.24.0.252 | 10.24.0.253 | 2001:660:4401:60A0:216:3eff:fe92:8ec5 |
Machine virtuelle
- Connexion au serveur Capbreton :
ssh root@capbreton.plil.info
→ Dossier de stockage des données de la VM : /usr/local/xen/domains/VMalex2
→ Fichier de configuration de la VM : /etc/xen/VMalex2.cfg
- Connexion à la VM :
ssh root@193.48.57.167
Journal de bord
Séance 1
Découverte du projet, de la strucuture des serveurs, des sockets, etc.
Nous avons édité le Wiki afin de choisir notre machine virtuelle.
Nous avons testé la machine virtuelle avec la commande suivante : ssh root@193.48.57.167
Séance 2
Nous avons découvert le projet, le contenu et la structure des programmes. Nous avons, notamment, examiné la gestion des SMTPs rentrants et sortants, nous avons commencé notre analyse du fichier in.c.
La fonction qui gère la gestion des clients SMTP (les clients qui souhaitent se connecter de l'extérieur) puis la gestion des courriels (des demandes venants de l'extèrieur) qui permet de récupérer les noms de domaines et les MX. Ensuite, la fonction gestionCourriel()
permet à partir d'une boucle de gérer la connexion au serveur stocké dans ss (socket). Le contenu des messages va être stocké dans un fichier, celui-ci va être envoyé vers le serveur SMTP qui, lui, va envoyer le message sur internet ou bien sur le disque si c'est un utilisateur local.
Nous, nous sommes rendu compte, que le message de base envoyait une réponse à tous les MX. Cependant, il suffit d'un MX qui réponde à notre demande. De fait nous avons ajouté un else break ligne 66 dans le cas où nous avions déjà eu un retour, pour stopper la boucle.
Nous avons compris que gestion SMTP rempli struct courriel qui appel gestion courriel une fois remplie.
Ce qui a été fait
- les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX
- pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro en respectant la RFC 5321 mais avec des simplifications
- les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets
- les commandes VRFY et EXPN qui permettent au client de vérifier si une messagerie est disponible pour la transmission, ne seront pas implémentées
- le routage des messages ne doit pas être implémenté
- les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25
- chaque connexion doit être gérée via un processus léger (Thread) et chaque commande par une fonction à laquelle est passée une structure représentant l’état du dialogue entre le client et le serveur
- les serveurs SMTP doivent être contactables en IPv4 et en IPv6, ils doivent aussi prendre en charge IPv4 et IPv6 pour la transmission vers les serveurs SMTP cibles ; => connexion et inittialisation serveur
- les deux serveurs ne diffèrent que par la méthode de distribution finale (stockage dans un système de fichiers ou envoi à un serveur SMTP cible)
- le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback
- ne doivent être stockés que les courriels à destination d’un utilisateur local
- le format de stockage doit être le format maildir qui est une structure de répertoires particulière utilisée pour sauvegarder des courriers électroniques (le format maildir est très bien décrit sur Wikipédia)
- chaque message entrant doit être ajouté au dossier de réception Maildir propre à l’utilisateur de destination
- pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable). => time
- Free mutexes =>
ajout dans la fonction
int mutex_fin(void)
free(mutexes)
à la fin de la fonction,de cette manière le thread est libérer mais pas l'allocation mémoire
Reste à faire
- un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible ; => data gestion_dialog erreur temporaire mais pas definitive => courriel file d'attente et le renvoyer comme un script
- les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ; => serveur deux ports différents, un en claire et un directement chiffré
- il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ; => 4 caractères
- Faire une communication chiffré
- pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ; => envoyer un helo à la place => lancer la commande starTTLS => ehlo a partir de cette commande reponse plusieur lignes, si connait starttls reponse 250
- le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename
Séance 3
Dans le cadre de la troisième séance nous avons essayé d'établir une communication avec le serveur. Pour ce faire nous avons envoyé à la machine virtuel (notre serveur) le fichier de gestion de serveur </li> Nous nous sommes rendus compte que SMTPin et SMTPout écouter sur les mêmes interfaces.
Alors nous avons modifier SMTPout de sorte à ce qu'il n'écrive que sur eth0
Fait cette séance
- Dans la fonction analyseArguments, de SMTPout/args.c : Structure long_options modifiée pour prendre en compte le paramètre d'interface
i
- Dans la fonction analyseArguments, de SMTPout/args.c : Paramètres de la fonction getotp_long modifiés pour inclure i et un argument supplémentaire
À faire la prochaine fois
- Ajouter une option
-i
sur le SMTPout pour n'écouter qu'eth0 - Dans SMTPout/args.c gérer strncopy pour l'argument avec le paramètre -i
- Dans SMTPout/out.c ajouter gestion config.interface (à ajouter dans la structure config)
Séance 4
Fait cette séance
- Ajout d'interfaces au niveau du SMTPout, nous avons complété le fichier SMTPout/args.c pour gérer l'argument i.
- Gestion erreur : notification de la part du serveur d'erreur 502, en cas de EHLO mal orthographié.
- Nous avons réalisé 2 ports différents lo et eth0 pour les 2 interfaces.
- Dans la fonction analyseArguments, de SMTPout/args.c : Paramètres de la fonction getotp_long modifiés pour inclure i et un argument supplémentaire
- Test serveur mail avec le site mxtoolbox.com.
- Test serveur mail avec telnet.
À faire la prochaine fois
- DEBUGGER LE SMTPin
Séance 5
Fait cette séance
- Analyse de boucleServeur dans reseau.c, appelé par SMTPin et SMTPout. Puis nous avons ajouté des
#ifdef DEVERMINE
dans les fonctions appelées. - SMTP Dialogue ne fonctionnait pas, dans smtp.c => modification de ACCUEIL CODE à 220 au lieu de 250. pour le ./SMTPin, commande
strace -f ./SMTPin -l
À faire la prochaine fois
- modifier fgets dans libs/smtp.c, gérer la gestion d'une commande à deux lignes : si présence d'un tiret dans la quatrième colonne, il faut prendre en compte la commande complète.
Séance 6
Fait cette séance
- On a réalisé différents test sur le serveur de mail. Cependant, en se connectant nous avons bien les mx, mais on en fait rien. C'est à dire on se retrouve dans une boucle while qui est dans boucleServeur, de in.c.
- On a modifié connexionServeur dans reseau.c à l'aide du programme envoyé par le professeur.
À faire la prochaine fois
- Réussir à sortir de la boucle while dans boucleserveur de in.c Problème on devrait sortir de la boucle while, on y arrive avec gmail, mais la fac le bloque Trouver comment faire avec un IPV4
- Suite à nos tentatives d'envoi de mail via le test de SMTPin, nous nous sommes rendu compte que nous avions un problème dans connexionServeur. Nous avons ajouté
if(connect(s,p->ai_addr,p->ai_addrlen)==0) break;
if(p->ai_family==AF_INET6) ipv6=1;
if(p->ai_family==AF_INET) ipv4=1;
p=p->ai_next;
}
- Problème rencontré : notre serveur résolution de nom n'était pas opérationnelle, nous l'avions kill, la semaine précédente, nous ne l'avions pas restart.
- Nous arrivons a envoyé des mails.
- Maintenant on doit faire en sorte, que l'on attende que le serveur nous réponde.
À faire la prochaine fois
- Attendre que le serveur nous réponde, lorsque l'on envoi DATA.
- Il faut modifier static int dialogue_DATA au niveau de smtp.c