PSR SE2a4 2022/2023 G7 : Différence entre versions
(→Def of done) |
(→Def of done) |
||
(108 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | '''Sujet:'''<br> | ||
+ | https://rex.plil.fr/Enseignement/Systeme/Tutorat.IMA2a4.Messagerie/<br> | ||
+ | <br> | ||
+ | '''Archive:'''<br> | ||
+ | [[file:2022-PSR-archive.zip]] | ||
+ | <br> | ||
+ | <br> | ||
= '''PROGRESS''' = | = '''PROGRESS''' = | ||
− | + | *'''DONE''' : Pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro en respectant la RFC 5321 mais avec des simplifications ;<br> | |
− | + | *'''DONE''' : Les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets ;<br> | |
− | + | *'''DONE''' : 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 ;<br> | |
− | + | *'''DONE''' : Le routage des messages ne doit pas être implémenté et la gestion des messages non transmis est optionnel ;<br> | |
− | + | *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 ;<br> | |
− | + | *'''DONE''' : Les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;<br> | |
− | + | *Les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ;<br> | |
− | + | *Il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;<br> | |
− | + | *'''DONE''' : 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 ;<br> | |
− | + | *'''DONE''' : 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 ;<br> | |
− | + | *'''DONE''' : 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 ;<br> | |
− | + | *Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ;<br> | |
− | + | *'''DONE''' : 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) ;<br> | |
− | + | *'''DONE''' : Le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback ;<br> | |
− | + | *'''DONE''' : Le serveur SMTP entrant ne doit être lié qu’à l’interface réseau menant à Internet. <br> | |
<br> | <br> | ||
Qq précisions:<br> | Qq précisions:<br> | ||
<br> | <br> | ||
− | + | *'''DONE''' : Ne doivent être stockés que les courriels à destination d’un utilisateur local ;<br> | |
− | + | *'''DONE''' : 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);<br> | |
− | + | *'''DONE''' : Chaque message entrant doit être ajouté au dossier de réception Maildir propre à l’utilisateur de destination ;<br> | |
− | + | *'''DONE''' : 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 ;<br> | |
− | + | *'''DONE''' : 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). <br> | |
<br> | <br> | ||
Ligne 28 : | Ligne 35 : | ||
== '''Def of done''' == | == '''Def of done''' == | ||
'''Démarrage de la VM:'''<br> | '''Démarrage de la VM:'''<br> | ||
− | ''ssh pifou@capbreton''<br> | + | ''ssh pifou@capbreton''<br> |
− | ''xen list'' pour voir la liste des VM déjà démarrées<br> | + | ''xen list'' pour voir la liste des VM déjà démarrées<br> |
− | ''xen create /etc/xen/dio1.cfg''<br> | + | ''xen create /etc/xen/dio1.cfg''<br> |
− | Pour éteindre la VM : ''xen shut dio1''<br> | + | Pour éteindre la VM : <code>''xen shut dio1''</code><br> |
<br> | <br> | ||
'''Installation de GCC:'''<br> | '''Installation de GCC:'''<br> | ||
− | ''ssh root@193.48.57.186''<br> | + | ''ssh root@193.48.57.186''<br> |
− | ''apt update''<br> | + | ''apt update''<br> |
− | ''apt install gcc''<br> | + | ''apt install gcc''<br> |
<br> | <br> | ||
'''Environment:''' <br> | '''Environment:''' <br> | ||
Serveur dans ~/ldelepla<br> | Serveur dans ~/ldelepla<br> | ||
− | ''scp -r ldelepla/ root@193.48.57.186:~''<br> | + | ''scp -r ldelepla/ root@193.48.57.186:~''<br> |
− | |||
= '''10/02/2023:''' = | = '''10/02/2023:''' = | ||
== '''Def of done''' == | == '''Def of done''' == | ||
Dans libs/Flux/mutex.c : ajout du free dans la fonction mutex_fin<br> | Dans libs/Flux/mutex.c : ajout du free dans la fonction mutex_fin<br> | ||
− | Dégager le process qui écoute le port 25 : ''ss -tpln'' | + | Dégager le process qui écoute le port 25 :<br> |
+ | ''ss -tpln''<br> | ||
+ | Pour trouver le process et<br> | ||
+ | ''service <name> stop''<br> | ||
+ | <br> | ||
On peut maintenant lancer les serveurs SMTP<br> | On peut maintenant lancer les serveurs SMTP<br> | ||
+ | <br> | ||
Dans src/SMTPin/in.c ligne 56, vérification que la connexion est correctement faite et que le message s'est envoyé<br> | Dans src/SMTPin/in.c ligne 56, vérification que la connexion est correctement faite et que le message s'est envoyé<br> | ||
MAILDIR_NEW avec le rename : dans src/SMTPout/out.c ligne 171<br> | MAILDIR_NEW avec le rename : dans src/SMTPout/out.c ligne 171<br> | ||
− | Pour le test SMTP : [https:// | + | Ajout d'un MX sur la VM:<br> |
+ | ''vi /etc/bind/db.raclette''<br> | ||
+ | ''cd raclette.site.dnssec/''<br> | ||
+ | ''dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key''<br> | ||
+ | ''service named restart''<br> | ||
+ | Pour le test SMTP : [https://mxtoolbox.com/diagnostic.aspx]<br> | ||
+ | <br> | ||
+ | |||
+ | = '''17/03/2023:''' = | ||
+ | == '''Objectifs''' == | ||
+ | *Permettre aux deux serveurs de fonctionner ensemble: SMTPin sur l'interface loopback et SMTPout sur l'interface ETH0<br> | ||
+ | *Essai d'envoi de message(''voir site web pour le test juste au dessus'')<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | '''Faire fonctionner les deux serveurs ensemble'''<br> | ||
+ | ''./SMTPin -l'' Pour mettre SMTPin sur ''loopback''<br> | ||
+ | <br> | ||
+ | Dans ''~/ldelepla/src/SMTPout/args.c'' modification pour avoir l'interface ETH0: <br> | ||
+ | *Ligne 12 dans la fonction ''AfficheSyntaxe'': Ajout fprintf<br> | ||
+ | *Ligne 24 dans la fonction ''AnalyseArguments''<br> | ||
+ | *Ligne 40 à 42 dans la fonction ''AnalyseArguments'': strncpy de l'interface<br> | ||
+ | Dans ''~/ldelepla/src/SMTPout/args.h'' ajout d'un élément char nommé interface de taille max CONFIG_MAX_INTERFACE<br> | ||
+ | Dans ''~/ldelepla/libs/Reseau/reseau.c'' dans la fonction initialisation serveur à la ligne 44, si interface!=NULL alors il se met sur la bonne interface<br> | ||
+ | Dans ''~/ldelepla/src/SMTPout/out.c'' à la ligne 202 *interface = config.interface;<br> | ||
+ | Dans le Makefile: ''-g'' à la compilation pour avoir la ligne du segfault avec valgrind<br> | ||
+ | <br> | ||
+ | '''SMTPin et SMTPout fonctionnent ensemble respectivement sur lo et eth0'''<br> | ||
+ | <br> | ||
+ | '''Tests'''<br> | ||
+ | Effectués avec le site sur la section ci-dessus<br> | ||
+ | Premiers résulats venant du site:<br> | ||
+ | <br> | ||
+ | ''Connecting to 193.48.57.186''<br> | ||
+ | <br> | ||
+ | ''250 Welcome [143 ms]''<br> | ||
+ | ''EHLO keeper-us-east-1d.mxtoolbox.com''<br> | ||
+ | <br> | ||
+ | ''SendSMTPCommand: Timeout waiting for response after 15 seconds.''<br> | ||
+ | <br> | ||
+ | ''LookupServer 16003ms''<br> | ||
+ | <br> | ||
+ | Remarque: Compiler avec ''-j <nom du fichier>'' pour avoir les logs<br> | ||
+ | En ouvrant le fichier de log, rien n'apparaît...<br> | ||
+ | <br> | ||
+ | Essai d'envoi avec nc depuis une machine polytech<br> | ||
+ | Remarque: compiler avec make debug et les arguments -j log.txt 255 pour remplir le journal<br> | ||
+ | <br> | ||
+ | Toujours aucun résultat avec le site web<br> | ||
+ | Pourtant /r/n présents dans le protocol<br> | ||
+ | Avec strace, on remarque que le serveur continue de lire alors que le message est fini.<br> | ||
+ | Pour cela, modification dans ''libs/SMTP/smtp.c'' : Dans la boucle de lecture commencant à la ligne 143, la boucle ne traite pas le cas où ''p->traitement == NULL'', dans ce cas là, on a l'erreur 502<br> | ||
+ | Ajout dans du renvoi d'erreur <code>"Not Implemented"</code> (code 502) dans ''libs/SMTP/smtp_private.h'' à la ligne 24<br> | ||
+ | <br> | ||
+ | |||
+ | = '''22/03/2023:''' = | ||
+ | == '''Objectifs''' == | ||
+ | *Réaliser les tests et corriger les premiers bugs<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | Fonctionne avec netcat:<br> | ||
+ | Sur une autre machine:<br> | ||
+ | <pre> | ||
+ | nc 193.48.57.186 25 | ||
+ | HELO raclette.site | ||
+ | MAIL FROM: ldelepla@polyetch-lille.fr | ||
+ | RCPT TO: root@raclette.site | ||
+ | DATA | ||
+ | SUBJECT: <sujet> | ||
+ | <corps du mail> | ||
+ | . | ||
+ | QUIT | ||
+ | </pre> | ||
+ | Sur le terminal de la VM on reçoit bien le message<br> | ||
+ | Mais à chaque commande SMTPout renvoi le code 502 à chaque commande<br> | ||
+ | Il manque un break dans la modification du code faite à la séance précédente dans ''smtp.c'' à la ligne 171<br> | ||
+ | <br> | ||
+ | Essai d'envoi avec la boite mail polytech<br> | ||
+ | '''ERREUR'''<br> | ||
+ | Il faut modifier la fonction ''gestion_MAIL'' et gestion_RCPT''<br> | ||
+ | L'erreur est lié au format de l'envoi des commandes<br> | ||
+ | ''Modification avant et après les if(statut!=2)''<br> | ||
+ | <br> | ||
+ | En mode debug on voit maintenant la réception du mail sur le terminal | ||
+ | <br> | ||
+ | Le mail doit normalement être stocké dans /tmp mais il n'y à rien, Il faut permettre le debug avec le journal pour savoir où est l'erreur<br> | ||
+ | Cela est fait dans ''SMTPout/out.c'' dans la fonction ''gestionCourriel''<br> | ||
+ | '''=>'''Ne passe pas le ''P(MUTEX_COMPTEUR):''<br> | ||
+ | <br> | ||
+ | |||
+ | = '''INTER-SEANCE:''' = | ||
+ | == '''Objectifs''' == | ||
+ | -Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | Pour éviter que les serveurs soient tuer par le signal SIGHUP en quittant la session à distance je lance le programme de cette manière:<br> | ||
+ | ''nohup ./SMTPout -i eth0 -j log.txt -n 255 &''<br> | ||
+ | <br> | ||
+ | ''nohup ./SMTPin -l -j log.txt -n 255 &''<br> | ||
+ | Avec la commande:<br> | ||
+ | ''ps -ef | grep SMTP''<br> | ||
+ | Même après avoir quitter la VM, on voit que SMTPin et SMTPout tournent toujours<br> | ||
+ | <br> | ||
+ | |||
+ | = '''29/03/2023:''' = | ||
+ | == '''Objectifs''' == | ||
+ | Comprendre et corriger le bug lié au non stockage des mails reçus<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | Résultat du test fait en INTER-SEANCE: pas de SEGFAULT<br> | ||
+ | <br> | ||
+ | A la compilation, ajouter ''-u carte.txt'' pour indiquer le fichier avec les utilisateurs possible, sous la forme:<br> | ||
+ | ''root : root@raclette''<br> | ||
+ | ''user1 : user1@raclette''<br> | ||
+ | <br> | ||
+ | Dans ''/tmp'' il faut créer les répertoires des utilisateurs:<br> | ||
+ | ''/tmp/root/tmp''<br> | ||
+ | ''/tmp/root/new''<br> | ||
+ | <br> | ||
+ | ''/tmp/user1/tmp''<br> | ||
+ | ''/tmp/user1/new''<br> | ||
+ | Dans ''out.c'', dans la fonction ''scanCarteUtilisateur'' il manque ''==0'' dans le ''if'' avec le ''strcasecmp''<br> | ||
+ | Dans la fonction ''adresseVersUtilisateur'', erreur: ''strlen(destinataire)'' et non ''strlen(adresse)''<br> | ||
+ | <br> | ||
+ | Dans ''smtp.c'' dans la fonction ''gestion_RCPT'', il y avait encore la chaine de char tag liè à la modification de cette fonction durant la séance 22/03<br> | ||
+ | <br> | ||
+ | '''Le mail est bien recu et est stocké dans les dossiers associés'''<br> | ||
+ | <br> | ||
+ | <br> | ||
+ | Modification nécessaire dans ''smtp.c'':<br> | ||
+ | Dans la fonction ''gestion_DATA'' et ''SMTP_gestion'' dans le while ligne 111, toujours en renvoi de ''SUCCESS_DATA_CODE''<br> | ||
+ | <br> | ||
+ | Jusqu'à la prochaine séance je laisse tourner les deux serveurs:<br> | ||
+ | ''nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &''<br> | ||
+ | <br> | ||
+ | ''nohup ./SMTPin -l -j log.txt -n 255 &''<br> | ||
<br> | <br> | ||
− | = ''' | + | = '''05/04/2023:''' = |
− | = '''10/ | + | == '''Objectifs''' == |
+ | -Modif de ''smtp.c''<br> | ||
+ | -Commencer à débuger SMTPin<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | *Aucun segfault ou crash des deux serveurs<br> | ||
+ | <br> | ||
+ | *Pour envoyer un mail:<br> | ||
+ | nc localhost 25<br> | ||
+ | <br> | ||
+ | Modification de ''reseau.c'' dans la fonction ''connexionServeur'':<br> | ||
+ | <pre> | ||
+ | while(1){ | ||
+ | if(p->ai_family==AF_INET6) ipv6=1; | ||
+ | if(p->ai_family==AF_INET) ipv4=1; | ||
+ | p=p->ai_next; | ||
+ | } | ||
+ | </pre> | ||
+ | <br> | ||
+ | |||
+ | = '''31/05/2023: WORKSHOP''' = | ||
+ | == '''Objectifs''' == | ||
+ | Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | '''SMTPin:'''<br> | ||
+ | Les codes dans private_smtp.h ne sont pas correct<br> | ||
+ | On ajoute du code pour débuger dans smtp.c<br> | ||
+ | <pre> | ||
+ | static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){ | ||
+ | char ligne[MAX_LIGNE]; | ||
+ | #ifdef DEVERMINE | ||
+ | printf("SMTP -> retour generique\n"); | ||
+ | #endif | ||
+ | if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1; | ||
+ | ligne[MAX_LIGNE-1]='\0'; | ||
+ | int code; | ||
+ | int statut=sscanf(ligne,"%d",&code); | ||
+ | #ifdef DEVERMINE | ||
+ | printf("statut =%d\n", statut); | ||
+ | printf("succes =%d\n", succes); | ||
+ | printf("code =%d\n", code); | ||
+ | #endif | ||
+ | if(statut==1 && code!=succes){ | ||
+ | strncpy(erreur,ligne,taille-1); | ||
+ | #ifdef DEVERMINE | ||
+ | printf("retour_generique ERROR\n"); | ||
+ | #endif | ||
+ | } | ||
+ | return (statut==1 && code==succes)?0:-1;<br> | ||
+ | }<br> | ||
+ | </pre> | ||
+ | En lancant SMTPin avec strace on retrouve les codes attendus à modifier dans private_smtp.h<br> | ||
+ | <pre> | ||
+ | nc localhost 25 | ||
+ | HELO polytech-lille.net | ||
+ | MAIL FROM: root@raclette.site | ||
+ | RCPT TO: ldelepla@polytech-lille.net | ||
+ | DATA | ||
+ | SUBJECT: TEST | ||
+ | TEST | ||
+ | . | ||
+ | QUIT | ||
+ | </pre> | ||
+ | Le mail est bien reçu sur ma boîte polytech<br> | ||
+ | <br> | ||
+ | '''SMTPout:'''<br> | ||
+ | Le serveur ne stocke plus les mails<br> | ||
+ | <br> | ||
+ | |||
+ | = '''07/06/2023:''' = | ||
+ | == '''Objectifs''' == | ||
+ | *Verifier les deux serveurs<br> | ||
+ | *Tests de charge<br> | ||
+ | *Tests de charge avec erreurs aléatoires<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | SMTPout restock les mails reçus<br> | ||
+ | <br> | ||
+ | Soit le fichier test suivant: | ||
+ | HELO TEST | ||
+ | MAIL FROM: root@raclette.site | ||
+ | RCPT TO: ldelepla@polyetch-lille.net | ||
+ | DATA | ||
+ | SUBJECT: TEST | ||
+ | |||
+ | BONJOUR | ||
+ | . | ||
+ | QUIT | ||
+ | |||
+ | nc -C -q0 -i1 localhost 25 < test<br> | ||
+ | |||
+ | '''Le mail est bien reçu sur ma boîte mail polytech'''<br> | ||
+ | <br> | ||
+ | Pour automatiser:<br> | ||
+ | i=0 ; while [ $i -lt 10 ] ; do nc -C -q0 -i1 localhost 25 < test & i='expr $i + 1'; done<br> | ||
+ | '''Fonctionne en envoyant 100 mails'''<br> | ||
+ | <br> | ||
+ | '''Test pour le SMTPout:'''<br> | ||
+ | Même méthode mais sur une autre machine<br> | ||
+ | Pour automatiser:<br> | ||
+ | <pre> | ||
+ | #!/bin/bash | ||
+ | i=0 | ||
+ | while [ $i -lt $2 ] | ||
+ | do | ||
+ | nc -C -q0 -i1 $1 25 < $3 & | ||
+ | i=`expr $i + 1` | ||
+ | done | ||
+ | </pre> | ||
+ | ./test.sh <adresse> <nb_envoi> <fichier><br> | ||
+ | |||
+ | = '''14/06/2023:''' = | ||
+ | == '''Objectifs''' == | ||
+ | *Test de charge pour l'envoi<br> | ||
+ | *Test de charge avec erreurs aléatoires<br> | ||
+ | *Recherche des leaks avec valgrind<br> | ||
+ | |||
+ | == '''Def of done''' == | ||
+ | Lors de l'envoi de mail (SMTPin) j'ai remarqué qu'il faut obligatoirement les chevrons. Il faut modifier la fonction ''*adresseVersUtilisateur''. Maintenant le test de charge fonctionne correctement.<br> | ||
+ | |||
+ | '''Test de charge avec erreurs aléatoires:'''<br> | ||
+ | Pour créer des erreurs aléatoires j'ai écris en bash:<br> | ||
+ | <pre> | ||
+ | #!/bin/bash | ||
+ | i=0 | ||
+ | while [ $i -lt $2 ] | ||
+ | do | ||
+ | nombre=$RANDOM | ||
+ | nombre=`expr $nombre \% 5` | ||
+ | case $nombre in | ||
+ | 1) | ||
+ | nc -C -q0 -i1 $1 25 < $4 & | ||
+ | ;; | ||
+ | *) | ||
+ | nc -C -q0 -i1 $1 25 < $3 & | ||
+ | ;; | ||
+ | esac | ||
+ | i=`expr $i + 1` | ||
+ | done | ||
+ | </pre> | ||
+ | Avec comme premier argument l'adresse ip, le suivant le nombre de messages a envoyer, le suivant un fichier test.txt contenant aucune erreur, et un autre argument contenant des erreurs. Ainsi dans ce cas, il y a une chance sur cinq de tomber sur une erreur.<br> | ||
+ | <br> | ||
+ | Le serveur tient toujours la charge avec de nombreux mails contenant 1 fois sur 5 des erreurs.<br> | ||
+ | <br> | ||
+ | '''Fuites mémoires'''<br> | ||
+ | Avec:<br> | ||
+ | <code>valgrind --leak-check=full --show-leak-kinds=all -s ./SMTPout -i eth0 -u carte.txt > /tmp/log</code><br> | ||
+ | On vérifie les fuites mémoires. On constate que 30ko sont définitivement perdues.<br> | ||
+ | Après vérification il y a une erreur dans le malloc de la fonction adresseVersUtilisateur de out.c il faut ajouter un +1 dans le malloc dans le cas ou il n'y a aucun destinataire.<br> | ||
+ | Aussi, on remarque qu'il y a autant de blocks perdues que de messages envoyés, en fait, il n'y a pas de <code>free(donnees)</code> dans la fonction SMTP_gestion. |
Version actuelle datée du 14 juin 2023 à 15:45
Sujet:
https://rex.plil.fr/Enseignement/Systeme/Tutorat.IMA2a4.Messagerie/
Archive:
Fichier:2022-PSR-archive.zip
Sommaire
PROGRESS
- DONE : Pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro en respectant la RFC 5321 mais avec des simplifications ;
- DONE : Les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets ;
- DONE : 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 ;
- DONE : Le routage des messages ne doit pas être implémenté et la gestion des messages non transmis est optionnel ;
- 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 ;
- DONE : Les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;
- Les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ;
- Il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;
- DONE : 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 ;
- DONE : 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 ;
- DONE : 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 ;
- Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ;
- DONE : 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) ;
- DONE : Le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback ;
- DONE : Le serveur SMTP entrant ne doit être lié qu’à l’interface réseau menant à Internet.
Qq précisions:
- DONE : Ne doivent être stockés que les courriels à destination d’un utilisateur local ;
- DONE : 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);
- DONE : Chaque message entrant doit être ajouté au dossier de réception Maildir propre à l’utilisateur de destination ;
- DONE : 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 ;
- DONE : 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).
03/02/2023:
Def of done
Démarrage de la VM:
ssh pifou@capbreton
xen list pour voir la liste des VM déjà démarrées
xen create /etc/xen/dio1.cfg
Pour éteindre la VM : xen shut dio1
Installation de GCC:
ssh root@193.48.57.186
apt update
apt install gcc
Environment:
Serveur dans ~/ldelepla
scp -r ldelepla/ root@193.48.57.186:~
10/02/2023:
Def of done
Dans libs/Flux/mutex.c : ajout du free dans la fonction mutex_fin
Dégager le process qui écoute le port 25 :
ss -tpln
Pour trouver le process et
service <name> stop
On peut maintenant lancer les serveurs SMTP
Dans src/SMTPin/in.c ligne 56, vérification que la connexion est correctement faite et que le message s'est envoyé
MAILDIR_NEW avec le rename : dans src/SMTPout/out.c ligne 171
Ajout d'un MX sur la VM:
vi /etc/bind/db.raclette
cd raclette.site.dnssec/
dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key
service named restart
Pour le test SMTP : [1]
17/03/2023:
Objectifs
- Permettre aux deux serveurs de fonctionner ensemble: SMTPin sur l'interface loopback et SMTPout sur l'interface ETH0
- Essai d'envoi de message(voir site web pour le test juste au dessus)
Def of done
Faire fonctionner les deux serveurs ensemble
./SMTPin -l Pour mettre SMTPin sur loopback
Dans ~/ldelepla/src/SMTPout/args.c modification pour avoir l'interface ETH0:
- Ligne 12 dans la fonction AfficheSyntaxe: Ajout fprintf
- Ligne 24 dans la fonction AnalyseArguments
- Ligne 40 à 42 dans la fonction AnalyseArguments: strncpy de l'interface
Dans ~/ldelepla/src/SMTPout/args.h ajout d'un élément char nommé interface de taille max CONFIG_MAX_INTERFACE
Dans ~/ldelepla/libs/Reseau/reseau.c dans la fonction initialisation serveur à la ligne 44, si interface!=NULL alors il se met sur la bonne interface
Dans ~/ldelepla/src/SMTPout/out.c à la ligne 202 *interface = config.interface;
Dans le Makefile: -g à la compilation pour avoir la ligne du segfault avec valgrind
SMTPin et SMTPout fonctionnent ensemble respectivement sur lo et eth0
Tests
Effectués avec le site sur la section ci-dessus
Premiers résulats venant du site:
Connecting to 193.48.57.186
250 Welcome [143 ms]
EHLO keeper-us-east-1d.mxtoolbox.com
SendSMTPCommand: Timeout waiting for response after 15 seconds.
LookupServer 16003ms
Remarque: Compiler avec -j <nom du fichier> pour avoir les logs
En ouvrant le fichier de log, rien n'apparaît...
Essai d'envoi avec nc depuis une machine polytech
Remarque: compiler avec make debug et les arguments -j log.txt 255 pour remplir le journal
Toujours aucun résultat avec le site web
Pourtant /r/n présents dans le protocol
Avec strace, on remarque que le serveur continue de lire alors que le message est fini.
Pour cela, modification dans libs/SMTP/smtp.c : Dans la boucle de lecture commencant à la ligne 143, la boucle ne traite pas le cas où p->traitement == NULL, dans ce cas là, on a l'erreur 502
Ajout dans du renvoi d'erreur "Not Implemented"
(code 502) dans libs/SMTP/smtp_private.h à la ligne 24
22/03/2023:
Objectifs
- Réaliser les tests et corriger les premiers bugs
Def of done
Fonctionne avec netcat:
Sur une autre machine:
nc 193.48.57.186 25 HELO raclette.site MAIL FROM: ldelepla@polyetch-lille.fr RCPT TO: root@raclette.site DATA SUBJECT: <sujet> <corps du mail> . QUIT
Sur le terminal de la VM on reçoit bien le message
Mais à chaque commande SMTPout renvoi le code 502 à chaque commande
Il manque un break dans la modification du code faite à la séance précédente dans smtp.c à la ligne 171
Essai d'envoi avec la boite mail polytech
ERREUR
Il faut modifier la fonction gestion_MAIL et gestion_RCPT
L'erreur est lié au format de l'envoi des commandes
Modification avant et après les if(statut!=2)
En mode debug on voit maintenant la réception du mail sur le terminal
Le mail doit normalement être stocké dans /tmp mais il n'y à rien, Il faut permettre le debug avec le journal pour savoir où est l'erreur
Cela est fait dans SMTPout/out.c dans la fonction gestionCourriel
=>Ne passe pas le P(MUTEX_COMPTEUR):
INTER-SEANCE:
Objectifs
-Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT
Def of done
Pour éviter que les serveurs soient tuer par le signal SIGHUP en quittant la session à distance je lance le programme de cette manière:
nohup ./SMTPout -i eth0 -j log.txt -n 255 &
nohup ./SMTPin -l -j log.txt -n 255 &
Avec la commande:
ps -ef | grep SMTP
Même après avoir quitter la VM, on voit que SMTPin et SMTPout tournent toujours
29/03/2023:
Objectifs
Comprendre et corriger le bug lié au non stockage des mails reçus
Def of done
Résultat du test fait en INTER-SEANCE: pas de SEGFAULT
A la compilation, ajouter -u carte.txt pour indiquer le fichier avec les utilisateurs possible, sous la forme:
root : root@raclette
user1 : user1@raclette
Dans /tmp il faut créer les répertoires des utilisateurs:
/tmp/root/tmp
/tmp/root/new
/tmp/user1/tmp
/tmp/user1/new
Dans out.c, dans la fonction scanCarteUtilisateur il manque ==0 dans le if avec le strcasecmp
Dans la fonction adresseVersUtilisateur, erreur: strlen(destinataire) et non strlen(adresse)
Dans smtp.c dans la fonction gestion_RCPT, il y avait encore la chaine de char tag liè à la modification de cette fonction durant la séance 22/03
Le mail est bien recu et est stocké dans les dossiers associés
Modification nécessaire dans smtp.c:
Dans la fonction gestion_DATA et SMTP_gestion dans le while ligne 111, toujours en renvoi de SUCCESS_DATA_CODE
Jusqu'à la prochaine séance je laisse tourner les deux serveurs:
nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &
nohup ./SMTPin -l -j log.txt -n 255 &
05/04/2023:
Objectifs
-Modif de smtp.c
-Commencer à débuger SMTPin
Def of done
- Aucun segfault ou crash des deux serveurs
- Pour envoyer un mail:
nc localhost 25
Modification de reseau.c dans la fonction connexionServeur:
while(1){ if(p->ai_family==AF_INET6) ipv6=1; if(p->ai_family==AF_INET) ipv4=1; p=p->ai_next; }
31/05/2023: WORKSHOP
Objectifs
Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel
Def of done
SMTPin:
Les codes dans private_smtp.h ne sont pas correct
On ajoute du code pour débuger dans smtp.c
static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){ char ligne[MAX_LIGNE]; #ifdef DEVERMINE printf("SMTP -> retour generique\n"); #endif if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1; ligne[MAX_LIGNE-1]='\0'; int code; int statut=sscanf(ligne,"%d",&code); #ifdef DEVERMINE printf("statut =%d\n", statut); printf("succes =%d\n", succes); printf("code =%d\n", code); #endif if(statut==1 && code!=succes){ strncpy(erreur,ligne,taille-1); #ifdef DEVERMINE printf("retour_generique ERROR\n"); #endif } return (statut==1 && code==succes)?0:-1;<br> }<br>
En lancant SMTPin avec strace on retrouve les codes attendus à modifier dans private_smtp.h
nc localhost 25 HELO polytech-lille.net MAIL FROM: root@raclette.site RCPT TO: ldelepla@polytech-lille.net DATA SUBJECT: TEST TEST . QUIT
Le mail est bien reçu sur ma boîte polytech
SMTPout:
Le serveur ne stocke plus les mails
07/06/2023:
Objectifs
- Verifier les deux serveurs
- Tests de charge
- Tests de charge avec erreurs aléatoires
Def of done
SMTPout restock les mails reçus
Soit le fichier test suivant:
HELO TEST MAIL FROM: root@raclette.site RCPT TO: ldelepla@polyetch-lille.net DATA SUBJECT: TEST BONJOUR . QUIT
nc -C -q0 -i1 localhost 25 < test
Le mail est bien reçu sur ma boîte mail polytech
Pour automatiser:
i=0 ; while [ $i -lt 10 ] ; do nc -C -q0 -i1 localhost 25 < test & i='expr $i + 1'; done
Fonctionne en envoyant 100 mails
Test pour le SMTPout:
Même méthode mais sur une autre machine
Pour automatiser:
#!/bin/bash i=0 while [ $i -lt $2 ] do nc -C -q0 -i1 $1 25 < $3 & i=`expr $i + 1` done
./test.sh <adresse> <nb_envoi> <fichier>
14/06/2023:
Objectifs
- Test de charge pour l'envoi
- Test de charge avec erreurs aléatoires
- Recherche des leaks avec valgrind
Def of done
Lors de l'envoi de mail (SMTPin) j'ai remarqué qu'il faut obligatoirement les chevrons. Il faut modifier la fonction *adresseVersUtilisateur. Maintenant le test de charge fonctionne correctement.
Test de charge avec erreurs aléatoires:
Pour créer des erreurs aléatoires j'ai écris en bash:
#!/bin/bash i=0 while [ $i -lt $2 ] do nombre=$RANDOM nombre=`expr $nombre \% 5` case $nombre in 1) nc -C -q0 -i1 $1 25 < $4 & ;; *) nc -C -q0 -i1 $1 25 < $3 & ;; esac i=`expr $i + 1` done
Avec comme premier argument l'adresse ip, le suivant le nombre de messages a envoyer, le suivant un fichier test.txt contenant aucune erreur, et un autre argument contenant des erreurs. Ainsi dans ce cas, il y a une chance sur cinq de tomber sur une erreur.
Le serveur tient toujours la charge avec de nombreux mails contenant 1 fois sur 5 des erreurs.
Fuites mémoires
Avec:
valgrind --leak-check=full --show-leak-kinds=all -s ./SMTPout -i eth0 -u carte.txt > /tmp/log
On vérifie les fuites mémoires. On constate que 30ko sont définitivement perdues.
Après vérification il y a une erreur dans le malloc de la fonction adresseVersUtilisateur de out.c il faut ajouter un +1 dans le malloc dans le cas ou il n'y a aucun destinataire.
Aussi, on remarque qu'il y a autant de blocks perdues que de messages envoyés, en fait, il n'y a pas de free(donnees)
dans la fonction SMTP_gestion.