PSR SE2a4 2022/2023 G7 : Différence entre versions
(→Def of done) |
(→Def of done) |
||
Ligne 186 : | Ligne 186 : | ||
-Pour envoyer un mail:<br> | -Pour envoyer un mail:<br> | ||
''nc localhost 25''<br> | ''nc localhost 25''<br> | ||
+ | <br> | ||
+ | Modification de ''reseau.c'' dans la fonction ''connexionServeur'':<br> | ||
+ | while(1){<br> | ||
+ | if(ipv4==1 && ipv6==1)<br> | ||
+ | { freeaddrinfo(origine); return -1; }<br> | ||
+ | if(p==NULL) p=origine;<br> | ||
+ | if((ipv6==0 && p->ai_family==AF_INET6) || (ipv6==1 && ipv4==0 && p->ai_family==AF_INET)){<br> | ||
+ | #ifdef DEBUG<br> | ||
+ | fprintf(stderr,"Connexion sur "%s" ipv6=%d ipv4=%d famille=%d\n",hote,ipv6,ipv4,p->ai_family);<br> | ||
+ | #endif<br> | ||
+ | }<br> | ||
+ | /* Creation d'une socket */<br> | ||
+ | s=socket(p->ai_family,p->ai_socktype,p->ai_protocol);<br> | ||
+ | if(s<0){ perror("connexionServeur.socket"); exit(EXIT_FAILURE); }<br> | ||
+ | <br> | ||
+ | /* Connection de la socket a l'hote */<br> | ||
+ | if(connect(s,p->ai_addr,p->ai_addrlen)==0) break;<br> | ||
+ | <br> | ||
+ | if(p->ai_family==AF_INET6) ipv6=1;<br> | ||
+ | if(p->ai_family==AF_INET) ipv4=1;<br> | ||
+ | <br> | ||
+ | p=p->ai_next;<br> | ||
+ | }<br> | ||
<br> | <br> |
Version du 5 avril 2023 à 14:55
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 ;
-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 ;
-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 ;
-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 TO: ldelepla@polyetch-lille.fr
RCPT FROM: 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/user1/tmp
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(ipv4==1 && ipv6==1)
{ freeaddrinfo(origine); return -1; }
if(p==NULL) p=origine;
if((ipv6==0 && p->ai_family==AF_INET6) || (ipv6==1 && ipv4==0 && p->ai_family==AF_INET)){
- ifdef DEBUG
fprintf(stderr,"Connexion sur "%s" ipv6=%d ipv4=%d famille=%d\n",hote,ipv6,ipv4,p->ai_family);
- endif
}
/* Creation d'une socket */
s=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
if(s<0){ perror("connexionServeur.socket"); exit(EXIT_FAILURE); }
/* Connection de la socket a l'hote */
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;
}