Voor jouw e-mail maak je waarschijnlijk gebruik van een gratis dienst, zoals GMail. Maar waarom beheer je niet je eigen mailserver? Dat is niet eens zo heel erg moeilijk! In deze tweedelige artikelenreeks leggen we uit hoe je mail host voor jouw eigen domein met Linux, Postfix en Dovecot.

De eerste vraag is natuurlijk op welke machine je jouw e-mail wilt hosten. Misschien denk je spontaan aan een Raspberry Pi of een ander klein en zuinig systeem bij je thuis? Helaas is dat bij de meeste internetabonnementen voor thuisgebruik onmogelijk. Een incorrect geconfigureerde mailserver trekt immers erg snel spammers aan. Daardoor wordt het netwerk zwaar belast en komt de provider van dat netwerk mogelijk op allerlei blacklists terecht. Dat risico willen de providers natuurlijk niet lopen. Daarom blokkeren zij alle inkomende en uitgaande verbindingen op poort 25. Dat is de poort die door mailservers gebruikt wordt om onderling e-mails uit te wisselen. Daarnaast steunt de correcte aflevering van e-mails op DNS MX-records: een vast IP-adres voor je mailserver is dus wel een vereiste. Om die redenen heb je een zogenaamde VPS (Virtual Private Server) nodig voor jouw mailserver.

 

VPS

Een VPS is in feite een virtuele machine in een datacenter met een vast IP-adres zonder enige firewall-restricties. Er zijn heel wat VPS-providers actief in Nederland en daarbuiten. Zelf hebben we goede ervaringen met het Nederlandse Tilaa. Voor minder dan €7,- per maand krijg je bij hen een VPS met 512MB RAM en 20GB schijfruimte, wat volstaat voor de meeste mailservers. Extra schijfruimte kost minder dan €1,- per maand per 10GB en kan in de toekomst eenvoudig toegevoegd worden. De meeste VPS-providers bieden minimale installatie-images aan van verschillende distributies. Die zijn een prima uitgangspunt om je eigen server te installeren: kies gewoon de distributie waarmee je het meest vertrouwd bent. Bedenk wel dat je je mailserver wellicht niet om de haverklap wilt upgraden of herinstalleren. Je kan dus beter bij distributies blijven met een langere support cycle, zoals CentOS, Ubuntu LTS of Debian Stable. Uiteraard heb je ook je eigen domeinnaam nodig, die meteen je mogelijke e-mailadressen bepaalt. Maak ook een MX-record aan voor jouw domein dat verwijst naar jouw mailserver. In onze voorbeelden gebruiken we Debian 7.8 met Postfix 2.9.6 en Dovecot 2.1.7 op een machine met de hostname tai.filipvervloesem.be. Die server zal mail hosten voor het domein candf.be. Het is dus perfect mogelijk dat jouw server mail host voor andere domeinen dan zijn eigen domein.

 

MTA, MSA, MDA, …?

Als we spreken over een “mailserver” hebben we het niet over één pakket dat alle taken op zich neemt, zoals bijvoorbeeld Apache dat doet op een webserver. Een mailserver bestaat immers uit verschillende – deels optionele – componenten. Elk component heeft zijn eigen afkorting volgens het schema MxA, waarbij de M staat voor Mail en de A voor Agent. De meest eenvoudige set-up, die we hier verder uitwerken, bestaat uit vier componenten:

 

1. MTA (Mail Transfer Agent): de MTA verstuurt inkomende e-mails naar de juiste bestemming. Dat kan een andere MTA zijn voor e-mails die gericht zijn naar andere domeinen (bijvoorbeeld gmail.com) of een lokale MDA voor e-mails die gericht zijn naar jouw eigen domein. Postfix is wellicht de meest gebruikte open source MTA. Alternatieven zijn onder andere het oudere (en minder veilige) Sendmail of Exim. MTA’s communiceren onderling met het SMTP-protocol over poort 25.

 

2. MDA (Mail Delivery Agent): de MDA levert e-mails af in de mailbox van de juiste gebruiker. De MDA-functionaliteit maakt meestal deel uit van een POP3/IMAP-server zoals Dovecot. Andere bekende POP3/IMAP-servers zijn bijvoorbeeld Cyrus IMAP of UW IMAP. De communicatie tussen de MTA en MDA op de mailserver gaat lokaal via het LMTP-protocol.

 

3. MSA (Mail Submission Agent): de MSA is een tweede instantie van de MTA die instaat voor het aanvaarden van uitgaande e-mails van jouw gebruikers. De MSA communiceert dus enkel met één of meerdere MUA’s en met je eigen MTA, maar nooit met externe MTA’s. De standaardpoort voor een mail submission service is 587 en het protocol is SMTP, meestal beveiligd via TLS.

 

4. MUA (Mail User Agent): een client-applicatie om e-mails te versturen en te ontvangen. Denk maar aan een webmail-applicatie, de Android Mail App of Mozilla Thunderbird. De MUA communiceert zowel met de MSA (om mails te versturen) als met een POP3/IMAP-server (om mails te ontvangen), maar nooit rechtstreeks met een MTA.

 

Meestal wordt een MTA nog aangevuld met verschillende extra services om spam tegen te houden, virussen te detecteren, enzovoort. Voor een eenvoudige mailserver met een beperkt aantal gebruikers heb je dat echter niet meteen nodig.

 

Dovecot

Omdat Postfix en Dovecot erg op elkaar steunen, installeer je beide pakketten voordat je met de configuratie start. Voor Postfix heb je slechts één pakket nodig dat alles bevat. Dovecot daarentegen is erg modulair opgebouwd: je hoeft dus enkel de onderdelen te installeren die je wilt gebruiken. In ons geval zijn dat de pakketten dovecot-imapd, dovecot-lmtpd en dovecot-mysql. Vervolgens maken we de directory /var/vmail aan (om de e-mails te bewaren) en de gebruiker vmail (om de IMAP-service te draaien): zie afbeelding 1.

 

 

Dovecots configuratie vind je hoofdzakelijk onder /etc/dovecot/conf.d (/etc/dovecot.conf hoe je niet aan te passen). Laat je niet afschrikken door het grote aantal configuratiebestanden: de meeste heb je pas nodig als je geavanceerde mogelijkheden wilt inschakelen. Het is verstandig om een kopie te maken van de volledige directory /etc/dovecot/conf.d naar bijvoorbeeld /etc/dovecot/conf.d.bak. Zo beschik je altijd over de volledige, gedocumenteerde versies van elk configuratiebestand. De hieronder vermelde bestanden kan je dan eenvoudig overschrijven met onze ingekorte voorbeelden (zie afbeelding 2).

 

 

Voorlopig zijn we enkel geïnteresseerd in volgende bestanden:

·        10-master.conf: configuratie van de verschillende services voor IMAP, POP3, authenticatie, enzovoort. Vergeet niet om het correcte IP-adres in te vullen in het onderdeel “inet_listener imap”.

·        10-mail.conf: bevat de locatie waar de e-mail bewaard moet worden. Met de hier gebruikte instellingen komt de mail terecht in /var/vmail/<domeinnaam>/<gebruikersnaam>/mail.

·        10-auth.conf: instellingen voor gebruikersauthenticatie. Het beste is om de optie “disable_plaintext_auth” te zetten op “yes”, maar daarvoor moet je eerst TLS-encryptie inschakelen. Voorlopig laten we dit dus op “no” staan.

·        10-logging.conf: om extra logging in te stellen, wat handig is bij het troubleshooten.

 

MySQL

Voor authenticatie gebruiken we een MySQL-database. Dat is iets complexer dan lokale users te gebruiken, maar wel veiliger én flexibeler. Met een MySQL-database host je immers gemakkelijk mail voor verschillende domeinen. Het bestand /etc/dovecot/dovecot-sql.conf.ext bevat alle details om met de database te verbinden en de juiste query’s uit te voeren. In afbeelding 2 zie je een mogelijke configuratie mét ondersteuning voor quota (daarmee gaan we pas later aan de slag). Uiteraard moet je die MySQL-database nu ook nog aanmaken en vullen met gegevens (zie afbeelding 3 voor een voorbeeld). Het laatste statement herhaal je voor elke gebruiker die je wilt aanmaken. Het wachtwoord in dat statement moet je trouwens van tevoren aanmaken met “doveadm pw -s SHA512”. De output van doveadm (maar zonder de ‘{SHA512}’ aan het begin) gebruik je dus in het SQL-statement.

 

 

Is er een firewall actief op je server? Dan moet je nu nog eerst een extra regel toevoegen om verbindingen op poort 143 toe te laten, bijvoorbeeld:

 

 

$ iptables -t filter -I INPUT -p tcp –dport 143 -j ACCEPT

 

 

Tijd om je mailbox te testen! Voeg een account toe in Thunderbird met de hostname van jouw server, poort 143, geen SSL-encryptie, password-login en gebruik jouw e-mailadres als gebruikersnaam. Lukt het inloggen om de één of andere reden niet? Kijk dan naar de dovecot-entries in /var/log/mail.log op je server.

 

Aan de slag met Postfix

Nu onze mailbox klaar is, kan Postfix die gebruiken om mail af te leveren. Postfix configureer je via twee bestanden in /etc/postfix:

 

1. master.cf: dit bevat een opsomming van de verschillende services die Postfix moet opstarten. Een Mail Submission Agent is een voorbeeld van een extra Postfix-proces dat je hier definieert. Ook parameters voor specifieke processen voeg je hier toe. Meestal zijn er slechts enkele wijzigingen nodig in dit bestand.

 

2. main.cf: de eigenlijk configuratie van Postfix. De hier opgesomde parameters zijn voor alle Postfix-processen van toepassing. Het gros van de wijzigingen in Postfix’ configuratie vindt in dit bestand plaats.

 

Postfix bevat erg veel configuratie-opties: het commando “man 5 postconf” geeft je een volledig overzicht. Daarnaast is ook het postconf-commando erg handig bij het opstellen van een nieuwe configuratie (zie “man postconf”). Dat toont je de huidige configuratie van main.cf, inclusief alle standaardwaardes van parameters die je niet expliciet opgenomen hebt. Met de -n optie krijg je dan weer enkel die parameters te zien die je wél expliciet ingesteld hebt. Heb je een syntaxfout gemaakt, dan geeft postconf dat ook aan met “warning: /etc/postfix/main.cf: unused parameter: …”. Echt erg is dat niet: voor die parameter neemt Postfix zonder morren de standaardwaarde.

 

Naast het /var/log/mail.log-bestand is ook telnet onmisbaar voor het troubleshooten van je mailserver. Je kan immers wel testen met een mail client, zoals Thunderbird, maar die geeft erg weinig feedback over wat er precies misloopt als een mail bijvoorbeeld niet aanvaard wordt. Via een telnet-sessie krijg je daarentegen bij elk SMTP-commando meteen Postfix’ antwoord daarop. In afbeelding 4 zie je de benodigde commando’s om een eenvoudige test-mail te versturen. Postfix’ antwoorden beginnen steeds met een driecijferige statuscode (bijvoorbeeld 250).

 

 

 

Services

Verder in dit blad kan je lezen over Postscreen, een (optionele) Postfix-service om spammers op afstand te houden. Postscreen is erg gemakkelijk te configureren en werkt prima, dus waarom zou je het niet gebruiken? In master.cf vind je bovenaan een regel die begint met “smtp inet n…”. Dit is Postfix’ SMTP-service (smtpd). Vervang die regel door de code uit afbeelding 5 om Postscreen te activeren.

 

 

 

Op het externe IP-adres draaien we dus Postscreen als SMTP-proxy. Die voert een aantal tests uit en verbindt enkel de betrouwbare clients door met de smtpd-service. Op localhost draaien we wél gewoon de smtpd-service: lokale applicaties mogen zonder verdere restricties e-mail versturen. Postscreen bevat verschillende tests die je zelf nog moet inschakelen. In afbeelding 6 zie je een voorbeeld om de pregreet test, deep protocol tests (en dus greylisting) en blocklist servers in te schakelen. Plaats die parameters in main.cf. We raden je wel aan om Postscreen’s documentatie (http://www.postfix.org/POSTSCREEN_README.html) voor onze configuratie over te nemen.

 

 

 

Nu zijn we aanbeland bij de kern van de Postfix configuratie, namelijk de vraag of e-mails lokaal dan wel ergens anders afgeleverd moeten worden. Die beslissing hangt af van volgende parameters in main.cf:

·        myhostname: de hostname van jouw server.

·        mydomain: de domeinnaam van jouw server.

·        myorigin: het domein dat wordt toegevoegd aan uitgaande e-mails van lokale gebruikers. Standaard is dit $myhostname.$mydomain. In onze set-up is dit enkel van toepassing voor e-mails die bijvoorbeeld via cron of een lokale applicatie verstuurd worden.

·        mydestination: de domeinnamen waarvoor e-mails lokaal moeten worden afgeleverd.

·        mynetworks: vertrouwde netwerken die e-mails mogen versturen naar dezelfde bestemming. Standaard is dit alleen localhost. Voor andere clients aanvaardt Postfix uitsluitend e-mails die jouw domein (zoals ingesteld in mydestination) als bestemming hebben. Dat is erg belangrijk: als élke client via jouw mailserver e-mail zou kunnen versturen naar élke mogelijke bestemming, is jouw server een zogenaamde “open relay” en wordt hij binnen de kortste keren misbruikt door spammers.

 

Voor de integratie met Dovecot hebben we nog twee extra parameters nodig:

·        virtual_mailbox_domains: som hier alle domeinen op waarvoor je e-mailadressen hebt gedefinieerd in de MySQL-database “dovecot”. Uiteraard moet het MX-record voor elk van die domeinen ook verwijzen naar jouw mailserver!

·        virtual_transport: om aan te geven dat Postfix de lokaal af te leveren mail via LMTP aan Dovecot moet doorspelen.

 

In afbeelding 6 zie je ons main.cf-bestand (de smtp_helo_name hebben we toegevoegd, omdat sommige MTA’s geen e-mails aanvaarden wanneer jouw MTA $myhostname in plaats van $myorigin gebruikt in het HELO-commando). Herstart Postfix om de wijzigingen toe te passen en test nu met het telnet-commando (op jouw server) naar localhost poort 25 of je e-mails kan versturen van en naar jouw domein (zie afbeelding 7).

 

 

 

Gebruik bijvoorbeeld je GMail-account om te controleren of je mails naar buiten kan sturen. Mails naar jouw domein moeten uiteraard in je Dovecot mailbox terechtkomen, dus controleer dat ook even. Herhaal nu dezelfde test met het publiek IP-adres van je server, maar nog steeds vanaf jouw server (je provider blokkeert allicht uitgaande verbindingen op poort 25, dus je kan dit niet testen vanaf jouw pc). Vergeet ook niet om een firewall rule toe te voegen voor poort 25. Een e-mail naar jouw domein wordt initieel geblokkeerd met statuscode 450 “4.3.2 Service currently unavailable”. Dit is Postscreens greylisting in actie. Verbreek de telnet-verbinding en probeer het na vijf minuten opnieuw: je mail wordt dan wél netjes aangenomen door Postscreen. Een e-mail van jouw domein naar een ander domein wordt daarentegen nog steeds niet aanvaard. Je krijgt daarvoor de foutmelding “Relay access denied” (zie afbeelding 8). En dat is maar logisch ook. Iedereen kan immers verbinding maken met je mailserver en beweren dat hij een mail verstuurt vanaf jouw domein naar een extern e-mailadres.

 

MSA

Die laatste beperking is echter knap lastig. Hoe kunnen we nu e-mails versturen vanuit bijvoorbeeld Thunderbird of Android Mail? Die applicaties moeten toch verbinden met het publieke IP-adres van onze mailserver? De oplossing is eenvoudig: een Mail Submission Agent opzetten die enkel toegangelijk is na authenticatie. De benodigde parameters voor master.cf zie je in afbeelding 9.

 


 

Ook in main.cf moet je nog twee extra parameters opnemen (zie afbeelding 10). Met die parameters gebruikt Postfix de SASL-libraries van Dovecot voor authenticatie. Alle gebruikers uit de dovecot-database kunnen zich nu ook authenticeren bij Postfix’ submission service.

 

 

 

Probeer maar eens een e-mail te versturen via een telnet naar poort 587 van je server (deze test kan je wel vanaf je client uitvoeren). Dit zal steeds resulteren in de foutmelding “Client host rejected: Access denied”. In afbeelding 11 zie je de benodigde SMTP-commando’s om je te authentiseren bij Postfix. Op die manier kan je wél e-mails versturen. Werkt dit allemaal naar behoren? Configureer dan een SMTP-server in Thunderbird met de hostname van jouw server, poort 587, geen SSL-encryptie, password-login en gebruik wederom jouw e-mailadres als gebruikersnaam. Loopt het toch nog ergens mis, bekijk dan de postfix-entries in /var/log/mail.log op je server. Uiteraard moet je ook poort 587 openen in je firewall.

 


 

En verder

In dit eerste deel hebben we uitgelegd hoe je een mailserver installeert met IMAP-functionaliteit, eenvoudige anti-spammaatregelen en een MySQL-backend voor gebruikersbeheer. In Linux Magazine 3 breiden we Dovecot verder uit met enkele geavanceerde features: compressie, deduplicatie en quota om je schrijfruimte beter te beheren, server side filtering met Sieve, gedeelde IMAP-mappen en een webmail-client.