Je eigen Mail Server

Doel 

Mail onder je eigen dak laten afleveren ipv in een Amerikaans datacenter

Benodigdheden 
Tutorial 

Ben je Gmail zat, wil je echt oneindig grote mails versturen, wil je meer controle over je email adres of vind je het gewoon een fijn idee dat je email onder je eigen dak wordt afgeleverd in plaats van ergens in een Amerikaans serverpark? Dan ben je toe aan een eigen email server... We bouwen het rustig op door eerst basis componenten te installeren voor het versturen en ontvangen van mails. Later in de tutorial installeren we software om via imap bij je mail te kunnen en mails te versturen via je telefoon bijvoorbeeld. En daarna maken we een webmail interface. Uiteraard maken we scheutig gebruik van encryptie, als de overheid het ooit nalaat ons rechtvaardige burgers te dienen, dan willen we ons natuurlijk nog wel veilig kunnen te organiseren middels digitale communicatie.

DNS

Voordat je ook maar iets kunt doen heb je een zogeten DNS, MX record nodig. Een DNS record is wat er voor zorgt dat een bepaalde domeinnaam naar jouw mail server (naar jouw IP adres) wijst als iemand er een mail heen stuurt. Dit deel is even erg complex en alleen maar nodig als je mails wilt ontvangen (niet om ze te sturen.) Je kunt om te experimenteren beginnen met een gratis domeinnaam bij nl.eu.org (deze website gebruikt ook zo'n gratis domeinnaam). Er zijn ontelbare andere partijen die je een domeinnaam kunnen geven, al dan niet tegen betaling (zoals TransIP of Awardspace).

Hier ga ik er vanuit dan je een domeinnaam aanvraagt van nl.eu.org. Maak daar eerst een account aan en log in. Je komt op de overzichtspagina, waar nog niets staat vermoed ik. Klik op "Nieuw domein". Je moet een MX record hebben welke weer naar een A record verwijst... welke weer naar het IP adres van je RPi verwijst. En dan niet naar het interne IP adres van RPi maar naar het externe IP adres wat je van je provider krijgt (je kunt dat IP adres hier checken.) Op je eigen router moet je dan weer instellen welke poorten je wilt doorsturen naar je RPi, hoe dat moet ga ik hier niet op in maar je mag het vragen in de comments hieronder, misschien kan ik je helpen. Goed... we gingen een MX record aanmaken wat wijst naar een A record. We beginnen met de A record. Typ de gewenst domeinnaam (ik koos rpi voor de .nl.eu.org), laat de "Soort aanvraag" op "Address record" staan en vul in het bovenste van de "DNS records" je IP adres in (wat je hier vond.) Klik op "Aanvragen!" en volg de bevestigingsinstructies. Maak nog een domein aan net als hierboven en ook met dezelfde domeinnaam (bij mij was het rpi.nl.eu.org) maar kies nu bij "Soort aanvraag" voor "MX record". Vul onder "DNS records" weer je domeinnaam in (bij mij rpi.nl.eu.org), verander verder niets, klik op "Aanvragen!".

Mails verstuurd naar wat-dan-ook@jouwdomeinnaam.nl.eu.org worden nu verstuurd naar het IP adres wat je hebt opgegeven als "Address record". Op dat IP adres moet dan uiteraard ook software draaien deze mail opvangt, correct afhandelt en netjes voor je neerzet waar jij er bij kunt...

De mailserver software op de RPi

Om die software klaar de maken log je in op je RPi. Voor het gemak worden we maar meteen root door su te gebruiken. Installeer postfix:
pacman -Sy postfix
Zet postfix aan en zorg er ook gelijk voor dat postfix na een reboot ook meteen weer wordt opgestart:
systemctl start postfix
systemctl enable postfix
Om even te testen of postfix inderdaad draait typ je:
telnet localhost 25
Je ziet iets als:
Trying 127.0.0.1...
Connected to www.mymail.com.
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix

Typ "quit" om de telnet sessie af te sluiten. Postfix werkt, nu gaan we het programma configureren.
Open de postfix configuratie file:
nano /etc/postfix/main.cf
Er zijn een aantal parameters die je moet veranderen, je moet ook de "#" weghalen voor deze parameters, de # wordt namelijk gebruikt om commentaar te geven en de tekst erachter wordt genegeerd door postfix:
myhostname, vul je domeinnaam, voor het adres van deze site zou deze regel dus worden:
myhostname = rpi.nl.eu.org
Haal de "#" voor:
mydestination = $myhostname, localhost.$mydomain, localhost
en haal de "#" weg voor: myorigin = $myhostname
Voor later is het handig om meteen de Maildir methode te kiezen voor het ordenen van mail in je home map:
home_mailbox = Maildir/
Dat was het, sluit nano af (ctrl-x, Y, enter) en herstart postfix:
systemctl restart postfix Nu moeten we nog even middels het commando " newaliases" vertellen aan postfix dat onze gebruiker postfx mag gebruiken (ofziets, wat " newaliases" ook doet, als je het niet doet, werkt het niet):
newaliases
Maak nu de mappen voor de Maildir structuur:
mkdir ~/Maildir
mkdir ~/Maildir/new && mkdir ~/Maildir/cur && mkdir ~/Maildir/tmp

Laten we een mailtje sturen om te testen of alles werkt, typ:
mail je.eigen@gmail.adres.nl
Vul een onderwerp in, druk enter, vul een berichtje in, druk enter, druk ctrl-d. Je mail is verstuurd. Komt hij aan op het gekozen adres? Mooi (of niet mooi...) reply dan op de mail en kijk of de weer aankomt op je RPi door te kijken in de map ~/Maildir/new (ls ~/Maildir/new), hopelijk zie je dan dat je 1 mail hebt (een file als 1391370652.Vb305I20134M40746.rpi.nl.eu.org). Je kunt de mail bekijken met nano Overigens denken veel mensen dat het een probleem is voor hun email bezorging wanneer hun internet een keer uitvalt of de RPi even niet online is, maar dat is niet zo, de email protocollen zijn ontworpen om hier mee om te gaan, de versturende server blijft het wel 72 uur proberen om een bericht af te leveren.

Mutt, een cli mailclient

Mutt is een cli mail client, handig om te gebruiken met je huidige erg minimale mailserver. Je kunt deze stap ook overslaan maar Mutt neemt niet veel ruimte in en is zo geconfigureerd. Installeer mutt:
pacman -S mutt
Maak de file .muttrc aan in je eigen home directory:
nano ~/.muttrc
Ik ga niet op alle opties in die hieronder staan, Google-is-your-friend maar ik configureer mutt met de volgende opties:

set mbox_type=Maildir

set folder="~/Maildir"
set mask="!^\\.[^.]"
set mbox="~/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
set spoolfile="~/Maildir"

mailboxes `echo -n "+ "; find ~/Maildir -maxdepth 1 -type d -name ".*" -printf "+'%f' "`

macro index c "?" "open a different folder"
macro pager c "?" "open a different folder"

macro index C "?" "copy a message to a mailbox"
macro index M "?" "move a message to a mailbox"

macro compose A "?" "attach message(s) to this message"

set editor="nano"

set from="Freek "
sluit nano af (ctrl-x, Y, enter)
Nu kun je mutt openen door mutt te typen. Het is niet zo gebruiksvriendelijk als Outlook of Thunderbird maar je kunt mailen vanaf je eigen server.

Mail op een andere computer binnenhalen

Je kunt nu dus mailen en gemaild worden op je eigen RPi, handig maar het programma "mail" is verre van gebruiksvriendelijk en je wilt natuurlijk ook je mail binnenhalen op je telefoon/tablet/pc. Daarvoor gebruiken we het programma Dovecot. Installeer Dovecot:
pacman -Sy dovecot
Kopieer de voorbeeld config file:
cp /etc/ssl/dovecot-openssl.cnf{.sample,} Edit de file /etc/ssl/dovecot-openssl.cnf als je wilt, er zijn wat dingen je je misschien wilt veranderen, bijvoorbeeld dat je 2048 bit encryptie wil, net als Google:
Optioneel: nano /etc/ssl/dovecot-openssl.cnf
Voor het script uit om de certificaten te maken:
/usr/lib/dovecot/mkcert.sh
Het script maak een certificaten sleutelpaar, /etc/ssl/certs/dovecot.pem en /etc/ssl/private/dovecot.pem.
We gebruiken PAM authenticatie in dovecot, dat betekend dat alle gebuikers in /etc/passwd (alle gebruikers op het systeem) meteen ook van dovecot gebruik kunnen maken. Om dit zo in te stellen open je /etc/pam.d/dovecot:
nano /etc/pam.d/dovecot En kopieer/plak de volgende tekst in de file:
auth required pam_unix.so nullok
account required pam_unix.so
Kopieer de dovecot.conf en conf.d/* configuratie files vanuit /usr/share/doc/dovecot/example-config naar /etc/dovecot:
cp /usr/share/doc/dovecot/example-config/dovecot.conf /etc/dovecot
cp -r /usr/share/doc/dovecot/example-config/conf.d /etc/dovecot
Om het Maildir formaat (en Maildir map met submappen in de home map van de gebruiker) te gebruiken edit je /etc/dovecot/conf.d/10-mail.conf:
nano /etc/dovecot/conf.d/10-mail.conf
En zorg dat de volgende optie geen "#" er voor heeft staan:
mail_location = maildir:~/Maildir
nano /etc/dovecot/conf.d/10-auth.conf, voeg login toe aan de volgende regel:
auth_mechanisms = plain login
sluit nano af (ctrl-x, Y, enter) en open de volgende config file:
nano /etc/dovecot/conf.d/10-ssl.conf, haal het # weg en verander ssl = yes in:
ssl = required Start dovecot en zorg dat het na een reboot ook opstart:
systemctl start dovecot
systemctl enable dovecot

Je hebt nu een werkende mailserver die je vanuit bijvoorbeeld je mobiel kunt benaderen. Maar alleen als je ook de juiste gaten in je router firewall hebt ingesteld. Voor het versturen van mail moet poort 25 openstaan. Om imap te gebruiken moet poort 143 open staan. Als je op je RPi ufw hebt draaien wil je deze ook goed instellen:
ufw allow smtp
ufw allow 143
Poort 993 (imaps) hoeft niet open staan want dovecot biedt STARTTLS, de verbinding gaat over de standaard poort maar is wel SSL/TLS beveiligd.

Op dit moment heb je een imap verbinding die met TLS is beveiligd maar als je mail verstuurd via je postfix smtp server gaat dat nog zonder beveiliging (zonder encryptie.) Dat betekend dat je login informatie onversleuteld over het internet gaat. Om dat te voorkomen willen we ook TLS gebruiken voor communicatie met de SMTP server. De instructies hoe je dat voor elkaar krijgt staan hieronder maar ik moet toegeven dat ik nogal moeite had om het voor elkaar te krijgen. Het werkt nu hier maar ik weet vrijwel zeker dat het beter kan... ik sta open voor suggesties.

nano /etc/dovecot/conf.d/10-auth.conf
Haal de "#" weg voor
disable_plaintext_auth = yes
Zet de volgende text onderaan het bestand:
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
# Assuming the default Postfix user and group
user = postfix
group = postfix
}

Voeg dit aan de onderkant van /etc/postfix/main.cf:
nano /etc/postfix/main.cf

# Can be an absolute path, or relative to $queue_directory
# Debian/Ubuntu users: Postfix is setup by default to run chrooted, so it is best to leave it as-is below
smtpd_sasl_path = private/auth
# On Debian Wheezy path must be relative and queue_directory defined
#queue_directory = /var/spool/postfix
# and the common settings to enable SASL:
smtpd_sasl_auth_enable = yes
# With Postfix version before 2.10, use smtpd_recipient_restrictions
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtpd_use_tls = yes
Als je grotere mails dan ongeveer 10 MB wilt kunnen ontvangen voeg je onderaan toe:
message_size_limit = 40960000
Met dit voorbeeld worden mails boven de ongeveer 40 MB geweigerd.

Voeg aan de onderkant van de file /etc/postfix/master.cf de volgende tekst toe:
nano /etc/postfix/master.cf

submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
#  -o smtpd_sasl_tls_security_options=noanonymous
# if you are activating the feature in the line above, also add noplaintext the options
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
##  -o smtpd_sender_restrictions=reject_sender_login_mismatch
#  -o smtpd_sender_restrictions=reject_authenticated_sender_login_mismatch
##  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_aut$
De opties met ## ervoor worden wel aangeraden maar ik kreeg het zelf niet voor elkaar om het aan de praat te krijgen met die opties actief, advies is welkom.

Nu kun je in je email client (Thunderbird, Outlook, je telefoon) aangeven dat je alleen verbindingen wilt maken met SSL/TLS. Wat er precies gebeurd als de mail die je verstuurd e smtp server verlaat weet ik niet precies maar ik denk niet dat de mail dan nog encrypted is. Wil je dit wel zou je over PGP kunnen lezen en ons hier in de comments op de hoogte brengen of zelf een tutorial schrijven voor op deze website :)

Om een beetje te troubleshooten kun je je smtp en imap server telnetten, een voorbeeld:
telnet rpi.nl.eu.org 25
Je ziet:
Trying xx.xx.xx.xx... Connected to rpi.nl.eu.org. Escape character is '^]'. 220 rpi.nl.eu.org ESMTP Postfix
Typ:
ehlo test
Je ziet:
250-rpi.nl.eu.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

SLuit af door quit te typen
Wat alles betekend weet ik niet maar 1 van de opties STARTTLS betekend dat de server graag begint met het opzetten van TLS beveiligde verbinding. Als je die verbinding opzet, typ op de commando:
openssl s_client -connect rpi.nl.eu.org:587 -starttls smtp
Er komt van alles aan informatie langs wat te maken heeft met de TLS verbinding.
Typ weer:
ehlo test
Je ziet nu andere opties:
250-rpi.nl.eu.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Dat je nu 250-AUTH PLAIN LOGIN ziet staan betekend dat je nu wel kunt inloggen met een wachtwoord en gebruikersnaam. Met andere woorden, je moet eerst een beveiligde verbinding opzetten voor je kunt inloggen, je wachtwoord gaat dus altijd alleen over een beveiligde verbinding... zo zien we het graag.

Bronnen