PSR SE2a4 2022/2023 G7 : Différence entre versions

De Wiki d'activités IMA
(Def of done)
(Def of done)
 
(48 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''' : 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 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''' : 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>
+
*'''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>
+
*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>
-Les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;<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>
+
*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>
+
*Il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;<br>
-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''' : 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 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>
-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>
+
*'''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>
+
*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''' : 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 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>
+
*'''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''' : 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''' : 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''' : 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''' : 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>
+
*'''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'' pour trouver le process et ''service <name> stop''<br>
+
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>
 
Ajout d'un MX sur la VM:<br>
 
Ajout d'un MX sur la VM:<br>
<br>
 
 
   ''vi /etc/bind/db.raclette''<br>
 
   ''vi /etc/bind/db.raclette''<br>
 
   ''cd raclette.site.dnssec/''<br>
 
   ''cd raclette.site.dnssec/''<br>
 
   ''dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key''<br>
 
   ''dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key''<br>
 
   ''service named restart''<br>
 
   ''service named restart''<br>
<br>
 
 
Pour le test SMTP : [https://mxtoolbox.com/diagnostic.aspx]<br>
 
Pour le test SMTP : [https://mxtoolbox.com/diagnostic.aspx]<br>
 
<br>
 
<br>
Ligne 61 : Ligne 71 :
 
= '''17/03/2023:''' =
 
= '''17/03/2023:''' =
 
== '''Objectifs''' ==
 
== '''Objectifs''' ==
-Permettre aux deux serveurs de fonctionner ensemble: SMTPin sur l'interface loopback et SMTPout sur l'interface ETH0<br>
+
*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>
+
*Essai d'envoi de message(''voir site web pour le test juste au dessus'')<br>
  
 
== '''Def of done''' ==
 
== '''Def of done''' ==
Ligne 69 : Ligne 79 :
 
<br>
 
<br>
 
Dans ''~/ldelepla/src/SMTPout/args.c'' modification pour avoir l'interface ETH0: <br>
 
Dans ''~/ldelepla/src/SMTPout/args.c'' modification pour avoir l'interface ETH0: <br>
-Ligne 12 dans la fonction ''AfficheSyntaxe'': Ajout fprintf<br>
+
*Ligne 12 dans la fonction ''AfficheSyntaxe'': Ajout fprintf<br>
-Ligne 24 dans la fonction ''AnalyseArguments''<br>
+
*Ligne 24 dans la fonction ''AnalyseArguments''<br>
-Ligne 40 à 42 dans la fonction ''AnalyseArguments'': strncpy de l'interface<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/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/libs/Reseau/reseau.c'' dans la fonction initialisation serveur à la ligne 44, si interface!=NULL alors il se met sur la bonne interface<br>
Ligne 102 : Ligne 112 :
 
Avec strace, on remarque que le serveur continue de lire alors que le message est fini.<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>
 
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 "Not Implemented" (code 502) dans ''libs/SMTP/smtp_private.h'' à la ligne 24<br>
+
Ajout dans  du renvoi d'erreur <code>"Not Implemented"</code> (code 502) dans ''libs/SMTP/smtp_private.h'' à la ligne 24<br>
 
<br>
 
<br>
 +
 
= '''22/03/2023:''' =
 
= '''22/03/2023:''' =
 
== '''Objectifs''' ==
 
== '''Objectifs''' ==
-Réaliser les tests et corriger les premiers bugs<br>
+
*Réaliser les tests et corriger les premiers bugs<br>
<br>
 
  
 
== '''Def of done''' ==
 
== '''Def of done''' ==
 
Fonctionne avec netcat:<br>
 
Fonctionne avec netcat:<br>
 
Sur une autre machine:<br>
 
Sur une autre machine:<br>
<br>
+
<pre>
   ''nc 193.48.57.186 25''<br>
+
   nc 193.48.57.186 25
   ''HELO raclette.site''<br>
+
   HELO raclette.site
   ''MAIL FROM: ldelepla@polyetch-lille.fr<br>
+
   MAIL FROM: ldelepla@polyetch-lille.fr
   ''RCPT TO: root@raclette.site''<br>
+
   RCPT TO: root@raclette.site
   ''DATA''<br>
+
   DATA
   ''SUBJECT: <sujet>''<br>
+
   SUBJECT: <sujet>
   ''<corps du mail>''<br>
+
   <corps du mail>
   ''.''<br>
+
   .
   ''QUIT''<br>
+
   QUIT
<br>
+
</pre>
 
Sur le terminal de la VM on reçoit bien le message<br>
 
Sur le terminal de la VM on reçoit bien le message<br>
 
Mais à chaque commande SMTPout renvoi le code 502 à chaque commande<br>
 
Mais à chaque commande SMTPout renvoi le code 502 à chaque commande<br>
Ligne 143 : Ligne 153 :
 
== '''Objectifs''' ==
 
== '''Objectifs''' ==
 
-Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT<br>
 
-Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT<br>
<br>
+
 
 
== '''Def of done''' ==
 
== '''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>
 
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>
<br>
 
 
   ''nohup ./SMTPout -i eth0 -j log.txt -n 255 &''<br>
 
   ''nohup ./SMTPout -i eth0 -j log.txt -n 255 &''<br>
 
<br>
 
<br>
 
   ''nohup ./SMTPin -l -j log.txt -n 255 &''<br>
 
   ''nohup ./SMTPin -l -j log.txt -n 255 &''<br>
<br>
 
 
Avec la commande:<br>
 
Avec la commande:<br>
 
   ''ps -ef | grep SMTP''<br>
 
   ''ps -ef | grep SMTP''<br>
Ligne 159 : Ligne 167 :
 
== '''Objectifs''' ==
 
== '''Objectifs''' ==
 
Comprendre et corriger le bug lié au non stockage des mails reçus<br>
 
Comprendre et corriger le bug lié au non stockage des mails reçus<br>
<br>
 
  
 
== '''Def of done''' ==
 
== '''Def of done''' ==
Ligne 165 : Ligne 172 :
 
<br>
 
<br>
 
A la compilation, ajouter ''-u carte.txt'' pour indiquer le fichier avec les utilisateurs possible, sous la forme:<br>
 
A la compilation, ajouter ''-u carte.txt'' pour indiquer le fichier avec les utilisateurs possible, sous la forme:<br>
''root : root@raclette''<br>
+
  ''root : root@raclette''<br>
''user1 : user1@raclette''<br>
+
  ''user1 : user1@raclette''<br>
 
<br>
 
<br>
 
Dans ''/tmp'' il faut créer les répertoires des utilisateurs:<br>
 
Dans ''/tmp'' il faut créer les répertoires des utilisateurs:<br>
''/tmp/root/tmp''<br>
+
  ''/tmp/root/tmp''<br>
''/tmp/user1/tmp''<br>
+
  ''/tmp/root/new''<br>
 
<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 ''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>
 
Dans la fonction ''adresseVersUtilisateur'', erreur: ''strlen(destinataire)'' et non ''strlen(adresse)''<br>
Ligne 184 : Ligne 193 :
 
<br>
 
<br>
 
Jusqu'à la prochaine séance je laisse tourner les deux serveurs:<br>
 
Jusqu'à la prochaine séance je laisse tourner les deux serveurs:<br>
<br>
 
 
   ''nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &''<br>
 
   ''nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &''<br>
 
<br>
 
<br>
Ligne 194 : Ligne 202 :
 
-Modif de ''smtp.c''<br>
 
-Modif de ''smtp.c''<br>
 
-Commencer à débuger SMTPin<br>
 
-Commencer à débuger SMTPin<br>
<br>
+
 
 
== '''Def of done''' ==
 
== '''Def of done''' ==
-Aucun segfault ou crash des deux serveurs<br>
+
*Aucun segfault ou crash des deux serveurs<br>
 
<br>
 
<br>
-Pour envoyer un mail:<br>
+
*Pour envoyer un mail:<br>
 
   nc localhost 25<br>
 
   nc localhost 25<br>
 
<br>
 
<br>
 
Modification de ''reseau.c'' dans la fonction ''connexionServeur'':<br>
 
Modification de ''reseau.c'' dans la fonction ''connexionServeur'':<br>
<br>
+
<pre>
   while(1){<br>
+
   while(1){
       if(p->ai_family==AF_INET6) ipv6=1;<br>
+
       if(p->ai_family==AF_INET6) ipv6=1;
       if(p->ai_family==AF_INET) ipv4=1;<br>
+
       if(p->ai_family==AF_INET) ipv4=1;
       p=p->ai_next;<br>
+
       p=p->ai_next;
   }<br>
+
   }
 +
</pre>
 
<br>
 
<br>
  
Ligne 213 : Ligne 222 :
 
== '''Objectifs''' ==
 
== '''Objectifs''' ==
 
Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel
 
Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel
<br>
+
 
 
== '''Def of done''' ==
 
== '''Def of done''' ==
'''SMTPin:'''
+
'''SMTPin:'''<br>
 
Les codes dans private_smtp.h ne sont pas correct<br>
 
Les codes dans private_smtp.h ne sont pas correct<br>
 
On ajoute du code pour débuger dans smtp.c<br>
 
On ajoute du code pour débuger dans smtp.c<br>
<br>
+
<pre>
  static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){<br>
+
  static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){
   char ligne[MAX_LIGNE];<br>
+
   char ligne[MAX_LIGNE];
   #ifdef DEVERMINE<br>
+
   #ifdef DEVERMINE
     printf("SMTP -> retour generique\n");<br>
+
     printf("SMTP -> retour generique\n");
   #endif<br>
+
   #endif
   if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1;<br>
+
   if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1;
   ligne[MAX_LIGNE-1]='\0';<br>
+
   ligne[MAX_LIGNE-1]='\0';
   int code;<br>
+
   int code;
   int statut=sscanf(ligne,"%d",&code);<br>
+
   int statut=sscanf(ligne,"%d",&code);
   #ifdef DEVERMINE<br>
+
   #ifdef DEVERMINE
     printf("statut =%d\n", statut);<br>
+
     printf("statut =%d\n", statut);
     printf("succes =%d\n", succes);<br>
+
     printf("succes =%d\n", succes);
     printf("code =%d\n", code);<br>
+
     printf("code =%d\n", code);
   #endif<br>
+
   #endif
   if(statut==1 && code!=succes){<br>
+
   if(statut==1 && code!=succes){
     strncpy(erreur,ligne,taille-1);<br>
+
     strncpy(erreur,ligne,taille-1);
   #ifdef DEVERMINE<br>
+
   #ifdef DEVERMINE
     printf("retour_generique ERROR\n");<br>
+
     printf("retour_generique ERROR\n");
   #endif<br>
+
   #endif
   }<br>
+
   }
 
  return (statut==1 && code==succes)?0:-1;<br>
 
  return (statut==1 && code==succes)?0:-1;<br>
 
  }<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>
 
<br>
En lancant SMTPin avec strace on retrouve les codes attendus à modifier dans private_smtp.h<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>
 
<br>
  nc localhost 25<br>
+
Le serveur tient toujours la charge avec de nombreux mails contenant 1 fois sur 5 des erreurs.<br>
  HELO polytech-lille.net<br>
 
  MAIL FROM: root@raclette.site<br>
 
  RCPT TO: ldelepla@polytech-lille.net<br>
 
  DATA<br>
 
  SUBJECT: TEST<br>
 
  TEST<br>
 
  .<br>
 
  QUIT<br>
 
 
<br>
 
<br>
Le mail est bien reçu sur ma boîte polytech<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

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.