Héberger son propre serveur mail sur Raspberry Pi (avec Citadel)

Au rayon “bonnes idées pour l’exercice mais aucunement pour tout le reste”, je voudrais “héberger son propre serveur mail”.
Avant tout chose, sachez que la chose est incroyablement aléatoire, dépend majoritairement de votre FAI ainsi que de votre box internet (oui), ainsi que des serveurs mail auxquels vous allez envoyer des mails.

Autrement dit : y’a limite plus de chances que ça foire que ça ne fonctionne.

Prérequis

Ce qu’il vous faut :
– Un Raspberry Pi que vous savez manier et qui est en état de fonctionnement
– Un domaine (cette fois, ça sera malheureusement payant, eh oui! – je suis chez OVH et le présent domaine me coûte 5.99 par an : c’est gérable). Ou alors, vous arrivez à trouver un fournisseur de domaines gratos qui autorise les enregistrements MX et DNS…
– Une adresse IP fixe pour votre box Internet (qui n’est pas une garantie de succès! La demande d’une IP fixe peut être demandée via vos options de souscription Internet)
– Connaître l’IP locale de votre Raspberry Pi (genre 192.168.1.2). Si vous ne savez pas comment la récupérer, sachez que vous aller passer un sale moment et qu’il vaut mieux laisser tomber : vous n’êtes malheureusement pas encore prêt(e).

Et en option :
Nginx que j’utilise déjà avec ses certificats HTTPS.

Procédure

1- Désactiver Exim

Exim est un gestionnaire de mail qui est fourni de base avec Raspbian et, si j’ai bien compris, Ubuntu au général.
Dans notre cas, il va surtout royalement nous emmerder et j’aime autant vous dire que j’ai ramé pour trouver la cause au fait que j’étais infoutu de recevoir le moindre mail…
Exim a cette particularité d’empêcher votre serveur Citadel, que nous n’avons pas encore installé, d’utiliser correctement les ports SMTP nécessaires au bon fonctionnement de Citadel.
Comment? En étant déjà intégré en tant que gestionnaire de mail dont on se fout éperdument, mais sans être officiellement déclaré comme installé!
Ce qui signifie ce que sinistre étron ne peut pas être désinstallé (puisqu’il n’est pas déclaré comme installé), il ne peut qu’être désactivé, ce que nous allons faire.

sudo service exim4 stop
sudo systemctl disable exim4.service --now

Maintenant, on va pouvoir travailler.

2- Installer Citadel

Pour ça, je ne vais pas me casser le bol et partir de l’excellent tuto de PiMyLifeUp.

sudo apt install build-essential curl g++ gettext shared-mime-info libssl-dev zlib1g-dev
curl https://easyinstall.citadel.org/install | sudo bash

Si à curl, ça déconne, il y a un contournement rigolo que voici :

curl https://easyinstall.citadel.org/install > install
sudo chmod +x ./install
sudo ./install

Les choix à faire durant l’installation sont globalement Y puis Enter jusqu’à l’étape de la définition du mot de passe administrateur.
Notez que l’installation de Citadel demande sa compilation et cela peut prendre plusieurs dizaines de minutes – sur mon Pi, ça a pris de mémoire environ 30 minutes.

Arrivé à l’étape de définition de l’utilisateur administrateur, vous pouvez laisser admin par défaut. Vous pouvez l’appeler Robert si ça vous chante, mais quand vous enverrez un mail en tant qu’administrateur, le réceptionnaire recevra un mail de Robert. Ca peut être rigolo.

Etape suivante, le mot de passe pour admin. Prenez-en un corsé et pas juste citadel comme entré de base. C’est pas un moulin, ici.

Puis, définissez l’utilisateur. Par défaut, il indique root, mais nous, on va rentrer citadel, parce que c’est pas la foire à la saucisse, chez nous.

Ceci fait, il demande l’ip d’écoute pour le serveur. Entrez 0.0.0.0, pas de sectarisme ici.

Suit le choix du port sur lequel Citadel tournera : laissez 504 par défaut. 504, c’est bien un port dont tout le monde se fout. Et c’est 405 à l’envers, comme une Peugeot 405. Comment? Y’a eu une Peugeot 504? C’est vrai.

Méthode d’authentification : laissez 0. Le reste est pénible. Comme mes voisins dans leur jardin dès qu’il y a un rayon de soleil dehors.

Ensuite, les ports HTTP et HTTPS. Là, ça se corse (comme le rallye de Corse, ou le moto-corse. Moto-cross?) :
– Soit vous avez un serveur HTTP et/ou HTTPS qui tourne déjà sur votre Pi, auquel cas ces ports sont déjà pris. Il suffit alors de sélectionner d’autres ports, genre 4080 (HTTP) et 4443 (HTTPS) par exemple.
– Soit vous n’avez pas d’autre instance de serveur HTTP(S), auquel cas vous pouvez laisser 80 et 443.

Si jamais un problème survient à la fin de cette configuration, et ainsi que le stipule l’excellent tutorial qui me sert de source :

sudo mkdir /etc/citadel/netconfigs
sudo chown citadel:citadel/etc/citadel/netconfigs
sudo service citadel restart
sudo /usr/local/citadel/setup

Pour relancer la configuration.

3- Accéder à Citadel

Maintenant que le cirque est installé, on peut commencer à aller jouer dedans. Rendez-vous via un navigateur à l’adresse IP locale de votre Raspberry suivi du port HTTP de Citadel, par exemple 192.168.1.2:4080.
Ce qui devrait vous afficher ça (en cliquant sur le bouton Administration à gauche) :

Cherchez pas, j’ai un problème de proxy, ça n’affiche pas les images que vous avez.
La chose à retenir, c’est comment vous rendre à cette page, qui est le coeur de votre système auto-hébergé. On va y revenir très souvent, ici.

4- Mise en place des redirections

Maintenant, nous allons nous rendre sur l’interface de gestion de nos domaines. J’ai opté pour OVH car, en bonne pince, il me fallait le moins cher, mais quand même reconnu.

Rendez-vous donc dans la partie Zone DNS de votre interface de gestion :


4.1 : Enregistrement MX

Dans la colonne Type, vous devriez déjà avoir deux lignes marquées MX. Cliquez sur les points de suspension à droite d’une de ces lignes, puis Supprimer l’entrée.
Ceci fait, modifiez l’entrée pour la seconde ligne (on s’en fout de laquelle, on va modifier de toute façon).


Laissez sous-domaine vide,
TTL par défaut,
Priorité 1,
et surtout Cible : mail.votredomaine.com. (n’oubliez pas le point à la fin!

Puis cliquez sur Suivant, et Valider dans l’écran suivant.

4.2 : enregistrement A

L’enregistrement MX est nécessaire à tout fonctionnement de service mail, mais il faut maintenant déclarer le fameux mail.votredomaine.com.

En haut à droite de la fenêtre de gestion, cliquez sur Ajouter une entrée.

Choisissez ensuite A dans Champs de pointage, puis :
– Sous-domaine : mail.votredomaine.com.
– TTL : par défaut
– Cible : votre IP externe (fixe).

4.3 : enregistrement SPF

Repérez dans la liste l’enregistrement de type SPF qui existe déjà, puis modifiez-le comme suit :
– Sous-domaine : vide
– TTL : par défaut
– Autoriser l’IP à envoyer des emails : oui
– Autoriser les serveurs MX à envoyer des emails : oui
– Autoriser tous les serveurs dont le nom se termine… : non
– D’autres serveurs… : laissez tout vide, SAUF “ip4” en entrant ip4:votre.adresse.ip.externe (genre ip4:1.2.3.4)
– Champ Include : laissez include:mx.ovh.com
– Est-ce que les informations décrivent… : Oui, mais utiliser le safe mode
Ceci fait, cliquez sur Suivant, puis Valider.

5- Retour à Citadel

5.1 : Administration > Configuration générale du site :

Onglet Globale :
Vous pouvez choisir un paquet de trucs, notamment :
– Nom du noeud : pas que ça serve des masses, j’ai laissé par défaut
– Nom de domaine pleinement qualifié : votredomaine.com (et PAS mail.votredomaine.com)
– Nom du noeud visible par un usager : peu importe, c’est ce qui s’affiche dans la barre du navigateur en tant que titre, j’ai choisi Nibelmail mais vous vivez votre vie 🙂
– Invite du paginateur : <more> (laissé par défaut)
– Localisation géographique du serveur : (null) (laissé par défaut)
– Nom de l’administrateur du système : admin@votredomaine.com (nom du compte admin, donc peut-être robert si vous avez suivi!)

Vous pouvez choisir un paquet de trucs, notamment :
– Nom du noeud : pas que ça serve des masses, j’ai laissé par défaut
– Nom de domaine pleinement qualifié : votredomaine.com (et PAS mail.votredomaine.com)
– Nom du noeud visible par un usager : peu importe, c’est ce qui s’affiche dans la barre du navigateur en tant que titre, j’ai choisi Nibelmail mais vous vivez votre vie 🙂
– Invite du paginateur : <more> (laissé par défaut)
– Localisation géographique du serveur : (null) (laissé par défaut)
– Nom de l’administrateur du système : admin@votredomaine.com (nom du compte admin, donc peut-être robert si vous avez suivi!)
Cliquez sur Save changes.

Onglet Accès :
Probablement le plus important si comme moi, vous ne voulez pas que n’importe qui se crée un compte sur votre serveur. Cochez Désactiver le libre-service […] (à ne réactiver que pour la création de vos comptes à vous avant de désactiver de nouveau).

5.2 : Administration > Configuration des noms de domaine et du courrier électronique

En haut à gauche, dans Pseudonymes de l’hôte local, ajoutez votredomaine.com
Tout simplement.


5.3 : Administration > Redémarrer

Comme le nom l’indique, redémarrons (et re des châtaignes) Citadel.

6- Réglages box internet

Cette partie va beaucoup dépendre de votre box internet. Si le port forwarding, aussi appelé NAT, est disponible partout, l’option de filtrage liée aux mails, elle, ne l’est peut-être pas (et ça peut marcher sans… Juste que, sur la mienne, non.).

6.1- Le filtrage mail

Ma box est une box SFR. Mais ça se voit assez vite. Trouvez l’option de filtrage (si elle existe…) dans Réseau v4 > Filtrage :

L’important ici est de décocher la seconde case!!

6.2 : Le transfert de ports

Dans Réseau v4 > NAT, il va falloir transférer les ports indiqués dans Citadel > Administration > Configuration globale > SMTP.
Normalement, ces ports sont 25, 587 et 465.

Rappel : vous devez indiquer le port en question et l’IP locale de votre Raspberry Pi. Encore une fois, si vous avez des soucis avec la notion de port forwarding, je crains que vous ne soyez que moyennement concernés par ce tuto…

Ce qu’il reste à faire

Je viens tout juste de terminer l’installation qui marche en mode nominal de mon serveur Citadel.
Il manque à ce tuto :
– L’installation d’un antispam,
– La gestion propre du SSL – pour le moment, l’accès extérieur à Citadel fonctionne via une configuration bêtement copiée/collée dans mon serveur Web, mais n’affiche pas les images : j’imagine qu’il y a un souci là-dedans, la grande question est : lequel.
Je vous attache la configuration nginx dont je me sers actuellement, en espérant pouvoir la parfaire bientôt et la partager avec vous!

server {
        listen 80;
        listen [::]:80;
        server_name domaine.fr;

        # Renvoi vers le port 443
        location / {
                return 301 https://$server_name$request_uri;
        }

}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name domaine.fr;

        # En avant pour SSL :)

        ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers             ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
        ssl_ecdh_curve          secp384r1;

        ssl_session_cache       shared:SSL:4m;
        ssl_session_timeout     1440m;
        ssl_stapling            on;
        ssl_stapling_verify     on;

        resolver                8.8.8.8 8.8.4.4;

        add_header              Strict-Transport-Security max-age=31536000;

        ssl_certificate /etc/letsencrypt/live/domaine.fr/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domaine.fr/privkey.pem;
        # Hop fini !

    location /webcit/ {
            proxy_pass         http://127.0.0.1:<port http Citadel>/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size       10m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
    location /listsub/ {
            proxy_pass         http://127.0.0.1:<port http Citadel>;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size       10m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
        location /groupdav/ {
            proxy_pass         http://127.0.0.1:<port http Citadel>/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size       10m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
        location /freebusy/ {
            proxy_pass         http://127.0.0.1:<port http Citadel>/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size       10m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

Leave a Reply

Your email address will not be published. Required fields are marked *