PSR SE2a4 2022/2023 G4
De Wiki d'activités IMA
Groupe Numéro 4 Rayane et Simon
Sommaire
À 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
- 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
- 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 => Partiellement
- Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée => SMTP dialogue à modifier => commande EHLO => permet de connaitre les fonctions du serveur
- 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 => Partiellement fait, ajout du move dans la fonction gestionCourriel du fichier out.c
Séance 1:
- Lecture du Sujet
- On examine le code:- fonction in.c => fonction chercheMX (fct de résolution) => Permet d'obtenir le MX (nom d'un MTA) et donc le MTA (agent de transfert)
- Compilation du code
- Il faut determiner les tâches à effectuer
Prise en main de la VM (VMALAD):
- Allumer la VM => capbreton.plil.info => xen create /etc/xen/VMALAD.cfg
- Se connecter => ssh root@193.48.57.166 => mdp : glopglopglop
- Utilisation de la commande SCP pour déplacer nos fichiers sur la VM
Modif code:
- Changement dans gestionCourriel() -> in.c / changement pour éviter d'envoyer le message sur tout les mx mais sur celui qui marche
while(*p!=NULL){ #ifdef DEVERMINE printf("Serveur : %s\n",*p); #endif int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); FILE *dialogue=fdopen(ss,"a+"); if(dialogue==NULL){ perror("gestionCourriel.fdopen"); exit(EXIT_FAILURE); } char erreur[MAX_ERREUR]; int resultat=SMTP_dialogue(dialogue,donnees,erreur,MAX_ERREUR); fclose(dialogue); if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); // Logguer l'erreur else { break; } p++; } }
Séance 2:
- Explication du code en salle de cours (1h)
Modif code:
- Dans Mutex.c => ajout d'un free(mutexes) | Car le threads est détruit mais pas l'allocation mémoire des mutexes
- Dans out.c => fonction gestionCourriel => ajout d'un rename (move) du fichier TMP vers le fichier NEW
char new_fichier[MAX_CHEMIN]; sprintf(new_fichier, "%s/%s/%s/%ld_%010d_%010ld",dossier,id,MAILDIR_NEW,time_save,pid,messages); rename(fichier, new_fichier); }
Taches restantes:
En cours:
- 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 ê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
- 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 => Partiellement
- Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée => SMTP dialogue à modifier => commande EHLO => permet de connaitre les fonctions du serveur
Terminé:
- 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 => ajout du move dans la fonction gestionCourriel du fichier out.c
Séance 3:
- Remise en forme du Wiki
- Tester la communication de notre application et debuguer
- Problème: SMTPin & SMTPout sur la même interface du port 25 ==> Il faut trouver un moyen de déplacer l'un des 2 sur une autre interface
- Solution: Créer un argument a notre apllication pour pouvoir modifier l'interface, (précision de l'interface pour SMTPin & SMTPout)
Modif code:
- Dans SMTPout ==> args.h => ajout d'une variable "interface" à la structure "stmp_config
struct smtp_config { char journal[CONFIG_MAX_JOURNAL]; int niveau; char port[CONFIG_MAX_PORT]; char dossier[CONFIG_MAX_CHEMIN]; char carte[CONFIG_MAX_CHEMIN]; unsigned char local; char interface[CONFIG_MAX_INTERFACE]; };
- Dans SMTPout ==> args.c => ajout d'un case i "interface" dans le switch
static struct option long_options[] = { {"local",no_argument,0,'l'}, {"port",required_argument,0,'p'}, {"journal",required_argument,0,'j'}, {"niveau",required_argument,0,'n'}, {"dossier",required_argument,0,'d'}, {"utilisateurs",required_argument,0,'u'}, {"interfaces", required_argument,0, 'i'}, {0,0,0,0} };
while(1){ int c=getopt_long(argc,argv,"lp:j:n:d:u:i:",long_options,NULL); if(c<0) break; switch(c){ case 'l': config->local=1; break; case 'i': strncpy(config->interface,optarg,sizeof(config->interface)-1); break; case 'p': strncpy(config->port,optarg,sizeof(config->port)-1); break; case 'j': strncpy(config->journal,optarg,sizeof(config->journal)-1); break; case 'd': strncpy(config->dossier,optarg,sizeof(config->dossier)-1); break; case 'u': strncpy(config->carte,optarg,sizeof(config->carte)-1); break; case 'n': config->niveau=atoi(optarg); break; default: afficheSyntaxe(argv[0]); break; } }
Test solution:
- Commande pour lancer SMTPin sur la VM avec la séléction de l'interface local du port 25: root@VMALAD:~/SMTP/PSR-ReX-v6/src/SMTPin# ./SMTPin -l
- Commande pour lancer SMTPin sur la VM avec la séléction de l'interface eth0 du port 25: root@VMALAD:~/SMTP/PSR-ReX-v6/src/SMTPout# ./SMTPout -i eth0
- On utilise la commande suivante pour s'assurer que les 2 applications se trouvent sur les bons interfaces: root@VMALAD:~# ss -tlpn
Séance 4:
- Test du serveur SMTP avec l'envoi de mail grâce à l'outil Telnet => le process d'envoi de mail fonctionne
- A faire => relancer les applications en mode debug pour observer la sortie => Makedebug
Test:
- On lance dans un premier temps les 2 process SMTPin & SMTPout sur la VM
- Utilisation de Telnet, exemple:
Problèmes:
- Problème lors de l'envoi de mail car l'outil Telnet a été utilisé sur un pc externe, or SMTPin est sur l'interface locale
- Problème de MX lors de l'envoi du mail
A faire lors de la prochaine séance:
- Refaire le test d'envoi de mail en utilisant Telnet directement sur la VM
- Modification du code pour résoudre le problème de MX lors de l'envoi du mail
Séance 5:
- Refaire le test d'envoi de mail en utilisant Telnet directement sur la VM
- Modification du code pour résoudre le problème de MX lors de l'envoi du mail
Test d'envoi de mail:
- Il n'y a plus d'erreur lorque l'on envoi un mail sur une adresse Polytech (1 seul MX), mais il n'y a pas de réception du message dans la boite mail.
- Le problème persiste lorsqu'il y'a plusieurs MX (exemple avec Google)
Modif code (à completer):
A faire la prochaine fois:
- Modifier le code SMTP.C de 250 à 220
- Checker le multiMX
Séance 6:
Problèmes:
- Nous avons essayé d'envoyer un mail de notre serveur SMTP vers un autre serveur (polytech), cependant les clées de notre domaine minable.site ont expirées, de nouvelles clés ont été créer mais nous devons attendre que ces changements soient pris en compte => Nous passons donc sur la réception de mail.
- Après un nouveau test, il y a toujours un problème => Notre serveur n'a pas de MX => nous en avons créer un => il faut du temps afin que la modification soient prise en compte
Modifications:
- La fonction connexionserveur
Séance 7:
Problèmes:
- Il n'est actuellement pas possible d'effectuer l'envoi d'un mail vers une adresse gmail, car les serveurs de l'école n'autorise pas les adresses l'IPV6 (uniquement IPV4), or notre programme priorise la connexion IPV6.
- Les services Gmail sont très stricts en terme d'envoi et réception de mail, il nous faut un certain message ID, s'il n'y en a pas google refuse la réception du mail.
Modifications:
- Modification de la fonction "connexionServeur" L97, dans le chemin suivant: libs/Reseau/reseau.c
Avant
if((ipv6==0 && p->ai_family==AF_INET6) || (ipv6==1 && ipv4==0 && p->ai_family==AF_INET))
Après
if((ipv4==0 && p->ai_family==AF_INET) || (ipv4==1 && ipv6==0 && p->ai_family==AF_INET6))
Nous avons modifier la priorité, c'est désormais l'IPV4 qui est recherché en premier.