Installation d’un serveur mail
[TOC]
Introduction
Bonjour, je vais vous montrer comment installer un serveur mail pour remplacer gmail, outlook ou autre. Ce serveur mail fonctionnera avec postfix et dovecot. L’administration des noms de domaines et des comptes se fera avec postfixadmin et le tout sera stocké dans une base sqlite. Vous pouvez aussi suivre le tutoriel en utilisant mysql au lieu de sqlite je l’ai déjà fait cependant pour un usage personnelle ou même pour vos proches sqlite est largement suffisant (et consomme beaucoup moins).
Technologies :
- nginx : serveur web
- php : langage côté serveur (pour postfixadmin)
- sqlite : base de données
- Postfixadmin : permet de gérer les domaines et users virtuel
- Dovecot : met les mails dans la bonne boite mail
Installation
apt install wget dbconfig-common sqlite3 php-fpm php-cli php-mbstring php-imap php-sqlite3
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m
Nginx
apt install nginx
vim /etc/nginx/sites-available/postfixadmin
server {
listen 80;
server_name postfixadmin.mail.private;
root /var/www/postfixadmin-3.0;
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ index.php;
}
location ~* \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}
ln -s /etc/nginx/sites-available/postfixadmin /etc/nginx/sites-enabled/postfixadmin
systemctl restart nginx
systemctl enable nginx
PostfixAdmin
wget -q -O - "http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.0/postfixadmin-3.0.tar.gz" | tar -xzf - -C /var/www
chown www-data:www-data -R /var/www/postfixadmin-3.0
/var/www/postfixadmin-3.0/config.inc.php
$CONF['configured'] = true;
$CONF['database_type'] = 'sqlite';
$CONF['database_name'] = '/var/vmail/postfixadmin.db';
// $CONF['database_host'] = 'localhost';
// $CONF['database_user'] = 'postfix';
// $CONF['database_password'] = 'postfixadmin';
$CONF['domain_path'] = 'NO';
$CONF['domain_in_mailbox'] = 'YES';
Database
Tout ce que vmail à accès, www-data pourras aussi y accéder
usermod -a -G vmail www-data
Création de la base de données sqlite
touch /var/vmail/postfixadmin.db
Avec sqlite il faut donner les droits à www-data (nginx) sur le fichier mais aussi sur le dossier.
chown vmail:vmail /var/vmail/postfixadmin.db
chmod 774 /var/vmail/postfixadmin.db
chmod 774 /var/vmail
Après cette étape faut tout relancer… Ok !
Navigateur http://postfixadmin.domain/setup.php
Alors perso je suis tombé sur l’erreur suivante : ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver
Avec un peu de recherche (merci LV1 l’allemand) et du débogage à foison, il faut simplement créer un dossier templates_c
avec les droits pour www-data.
Voili voilou
Sur cette page, ajouter un admin en remplissant le formulaire. Si tout ce passe bien, il devrai apparaître dans la table admin de la base
L’erreur Connect: given database path does not exist, is not writable, or $CONF['database_name'] is empty.
c’est un problème sur la base de données.
Suivez l’installation comme ça vous aurez un administrateur. Comme indiqué vous pourrez vous connecter sur la page login.php
Ajouter un domaine
- Domaine : nom du domaine
- Alias : 0
- Compte : 0
abuse est un alias qui permet de signaler un spam en provenance d’un domaine.
Et vous pouvez aussi vous créer une boite mail dans add mailbox.
Postfix
apt install postfix postfix-sqlite libsasl2-modules sasl2-bin
Faut mettre site internet.
Configuration
Le fichier de configuration est /etc/postfix/main.cf. Nous allons mettre chaque requête dans un sous-fichier et ajouter un lien dans le fichier principal.
Domaines
/etc/postfix/sqlite_virtual_mailbox_domains.cf
dbpath = /var/vmail/postfixadmin.db
query = SELECT 1 FROM domain WHERE domain='%s' AND active = '1'
Pour l’activer :
Cette commande va ajouter la configuration au fichier principal /etc/postfix/main.cf.
postconf -e virtual_mailbox_domains=sqlite:/etc/postfix/sqlite_virtual_mailbox_domains.cf
Pour tester :
postmap -q arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_mailbox_domains.cf
Ici la requête doit juste renvoyer quelque chose (ici 1)
Boite mail
/etc/postfix/sqlite_virtual_mailbox_maps.cf
dbpath = /var/vmail/postfixadmin.db
query = SELECT 1 FROM mailbox WHERE username='%s'
Pour l’activer :
postconf -e virtual_mailbox_maps=sqlite:/etc/postfix/sqlite_virtual_mailbox_maps.cf
Pour tester :
postmap -q omer@arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_mailbox_maps.cf
Alias
/etc/postfix/sqlite_virtual_alias_maps.cf*
dbpath = /var/vmail/postfixadmin.db
query = SELECT goto FROM alias WHERE address='%s'
pour l’activer :
postconf -e virtual_alias_maps=sqlite:/etc/postfix/sqlite_virtual_alias_maps.cf
pour tester :
postmap -q omer@arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_alias_maps.cf
Le port 587
Le port 25 est considéré comme spam (par les FAI) donc on met le port 587 à la place.
Pour pouvoir faire ça, il faut dé-commenter cette ligne dans la config
/etc/postfix/master.cf
submission inet n - - - - smtpd
SASL
J’ai pas encore bien compris ce que c’est mais ça permet de ne pas se faire trop spammer.
Toujours dans le fichier /etc/postfix/main.cf ajouter :
Virer le arkalo.ovh de mydestination
et ajouter
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
/etc/default/saslauthd
START=yes
systemctl restart saslauthd
Dovecot
Dovecot sert à recevoir de postfix les mails et les ranger comme il faut.
Installation
apt install dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-sqlite dovecot-pop3d dovecot-managesieved
Configuration
La configuration de dovecot se situe dans le répertoire /etc/dovecot/conf.d/
Authentification
Alors si j’ai bien compris, dovecot utilise des utilisateurs linux. Mais nous c’est login mot de passe dans la base de données. Du coup /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
...
!include auth-sql.conf.ext
Et ensuite dans le fichier auth-sql.conf.ext
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
- %d : domaine
- %n : user (et oui ça aurait pu être logique avec un %u mais bon…)
10-mail.conf :
mail_location = maildir:/var/vmail/%d/%n/Maildir
Master
10-master.conf :
# smtp-auth de postfix
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
J’avais pas trop pigé au début mais mode c’est les droits mais le 0 au début je sais pas…
SSL
Générer des certificats
openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/mailserver.pem -keyout /etc/ssl/private/mailserver.pem
10-ssl.conf
ssl_cert = </etc/ssl/certs/mailserver.pem
ssl_key = </etc/ssl/private/mailserver.pem
Et pensez à mettre
ssl = yes
Normalement il y a déjà cette option mais bon…
LDA
15-lda.conf
protocol lda {
# Space separated list of plugins to load (default is global mail_plugins).
mail_plugins = $mail_plugins sieve
}
sieve est un plugin qui permet de mettre les fichiers au bon endroit
PTDR ça commence à devenir chaud à comprendre là wesh !
SQL
/etc/dovecot/dovecot-sql.conf.ext
driver = sqlite
...
connect = /var/vmail/postfixadmin.db
...
password_query = SELECT username,domain,password FROM mailbox WHERE username='%u';
systemctl restart dovecot
Normalement à cette étape dovecot et postfix sont lancé et fonctionne :
systemctl status postfix
systemctl status dovecot
Si c’est le cas, il faut juste que quand postfix reçoit un mail il le dise à dovecot de le stocker.
Ajouter ces ligne dans /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}
Attention c’est deux espace avant flags (comme ces P***** de M**** de fichier yaml)
systemctl restart postfix
Ensuite on applique cette conf à postfix (tu connais maintenant oh !) :
postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1
J’ai eu un bug : Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission denie))
En cherchant un peu sur internet, j’ai trouvé ceci : Rajouter à la fin dans /etc/dovecot/dovecot.conf c’est un peu le bordel mais bon…
service stats {
unix_listener stats-reader {
user = vmail
group = vmail
mode = 0660
}
unix_listener stats-writer {
user = vmail
group = vmail
mode = 0660
}
}
Voilà…
Les tests
Maintenant testouillons tout ça !
Normalement à cette étape vous pouvez envoyer un mail :
echo test | mail omer@arkalo.ovh
Et le recevoir dans /var/vmail/arkalo.ovh/omer/Maildir/new
Les log postfix ne se sont pas affiché au début /var/log/mail.log, j’ai trouvé sur un forum qui fallait installer le paquet rsyslog
apt install rsyslog
Récupérer les mails
Voila la configuration que j’ai mis en place pour Thunderbird : En réception, IMAPS :
serveur : example.com
port : 143
nom d'utilisateur : user@example.com
sécurité : StartTLS
Méthode d'authentification : Mot de passe normal
En envoi :
serveur : example.com
port : 587
nom d'utilisateur : user@example.com
sécurité : StartTLS
Méthode d'authentification : Mot de passe normal
Dans un conteneur lxc il faut NATER les ports 587 143 et 25 Comme d’habitude j’ai fait ça avec iptables :
iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 25 -j DNAT --to 10.0.30.11:25
iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 143 -j DNAT --to 10.0.30.11:143
iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 587 -j DNAT --to 10.0.30.11:587
iptables a trouvé tout seul le nom des protocoles et ouiii !!!!!
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:submission to:10.0.30.11:587
DNAT tcp -- anywhere anywhere tcp dpt:imap2 to:10.0.30.11:143
DNAT tcp -- anywhere anywhere tcp dpt:smtp to:10.0.30.11:25
Ah oui aussi ! Dans le DNS J’ai rajouté une une entrée : IN MX 10 arkalo.ovh
Tester si votre ip est ban :