Winkelwagen

/ VPS-Infrastructuur

Alles over de zelfontwikkelde VPS-infrastructuur

Register now

/ Up to date

/ Nieuws

Lancering PerformanceVPS

Meer info
Hulp nodig?

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    Postfix & Dovecot installeren en configureren

    Op Linux mailservers wordt meestal Exim of Postfix (MTA) in combinatie met Dovecot (MDA) gebruikt. Exim en Postfix zorgen voor het versturen van mail van de ene mailserver naar de andere. Dovecot zorgt dat mail die aan je VPS wordt geleverd, daadwerkelijk bij het juiste mailadres uit komt.

    In deze tutorial laten wij zien hoe je Postfix en Dovecot installeert op een Linux-VPS met AlmaLinux 9, CentOS Stream 9, Rocky Linux 9, Ubuntu 22.04+, of Debian 12+ . In deze tutorial laten wij zien hoe je een lijst van 'virtual domains en mailboxes' gebruikt om mail te verwerken. Hiervoor maken wij gebruik van een database die beheerd wordt via MariaDB. Daarnaast laten wij zien hoe je SSL (TLS) van Let's Encrypt gebruikt om de verbinding te beveiligen en je firewall configureert voor je mailserver.



    Een database aanmaken

     

    Voor de virtuele mailadressen raden wij aan een database te gebruiken. Hiermee is het eenvoudiger om domeinen en mailadressen toe te voegen dan vanuit de Postfix-configuratie zelf, bijvoorbeeld als je zelf een controlepaneel aanbiedt van waaruit mensen dit zelf kunnen doen. Je kunt dan eenvoudig gebruik maken van SQL statements.

     

    Stap 1

    Verbind met je VPS via SSH of de VPS-console in het TransIP-controlepaneel.


     

    Stap 2

    Update je VPS zodat je de meest recente software tot je beschikking hebt:

    Ubuntu & Debian:

    apt -y update && apt -y upgrade

    CentOS, AlmaLinux & Rocky Linux:

    dnf -y update

    Wij raden aan na een update je VPS te herstarten. Veel updates worden pas daadwerkelijk doorgevoerd na een reboot. Hierdoor komen eventuele problemen in de configuratie van je server dan sneller aan het licht en kun je eventueel nog een back-up terugplaatsen.


     

    Stap 3

    Start nu eerst een SQL-shell. Een nadere toelichting van SQL-commando's vind je in ons artikel over MariaDB beheren via command-line.

    mysql -u root -p


    Stap 4

    Vervolgens genereer je de SQL-gebruiker, database en tabelen voor je mailserver. Eerst maak je de database aan met het volgende commando. Je bent vrij de naam 'mailserver' aan te passen.

    CREATE DATABASE mailserver;


    Stap 5

    Maak de gebruiker aan met het commando (vervang 'user' en 'password' naar wens):

    GRANT SELECT ON mailserver.* TO 'user'@'127.0.0.1' IDENTIFIED BY 'password';

    Pas deze wijziging toe met het commando:

    FLUSH PRIVILEGES;

     

    Stap 6

    Schakel over naar de database 'mailserver' die je zojuist hebt aangemaakt met het commando:

    USE mailserver;

     

    Stap 7

    Maak vervolgens een tabel aan voor respectievelijk de virtuele domeinen, e-mailadressen (inclusief wachtwoord) en aliassen. De code hieronder kun je in zijn geheel kopiëren en plakken in Putty.

    CREATE TABLE virtual_domains (
     DomainId INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     DomainName VARCHAR(50) NOT NULL
    );
    
    CREATE TABLE virtual_mailboxes (
     MailId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     DomainId INT NOT NULL,
     password VARCHAR(255) NOT NULL,
     Email VARCHAR(100) UNIQUE KEY NOT NULL,
     FOREIGN KEY (DomainId) REFERENCES virtual_domains(DomainId) ON DELETE CASCADE
    );
    
    CREATE TABLE virtual_aliases (
     AliasId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     DomainId INT NOT NULL,
     Source VARCHAR(100) NOT NULL,
     Destination VARCHAR(100) NOT NULL,
     FOREIGN KEY (DomainId) REFERENCES virtual_domains(DomainId) ON DELETE CASCADE
    );

     

    Stap 8

    Sluit voor nu de SQL-shell met:

    exit


    Postfix installeren en configureren

     

    Stap 1

    Installeer Postfix met het commando:

    Ubuntu & Debian:

    dnf -y install postfix postfix-mysql policycoreutils-python-utils

    Je krijgt na de installatie automatisch een korte installatiewizard te zien. Er wordt gevraagd om je hostname, die standaard al ingevuld wordt.

    ubuntu postfix configuration mail name

    Vervolgens moet je een mail server configuration type selecteren. Kies hier voor 'internet site'.

    ubuntu postfix configuration

    CentOS, AlmaLinux & Rocky Linux :

    dnf -y install postfix postfix-mysql policycoreutils-python-utils

    Het kan zijn dat Postfix al aanwezig is op je VPS. Bij een minimal install van oudere CentOS-versies was dit het geval.


     

    Stap 2

    De configuratie van Postfix wordt aangestuurd via /etc/postfix/main.cf. Open dit bestand, bijvoorbeeld met:

    nano /etc/postfix/main.cf
    

     

    Stap 3

    Pas de volgende waardes aan/voeg ze toe in het geopende bestand. Een deel van deze opties zijn optioneel. In de toelichting onder de code leggen wij de functie van deze opties uit en welke waardes je kunt gebruiken.

    Een overzicht van alle beschikbare configuratieopties voor Postfix vind je hier.

    Heb je voor de installatie van je VPS een SSH, one time password, of Cloud-Init installatie gebruikt? Stel dan voor de correcte werking van mydestination eerst je hostname in, zie deze handleidingen voor Ubuntu en CentOS.

    myhostname = mail.example.com
    mydomain = example.com
    myorigin = $mydomain
    smtp_bind_address = 123.123.123.123
    smtp_bind_address6 = 2a01:7c8:d001:2::1
    inet_interfaces = all
    inet_protocols = all
    mydestination = $myhostname, localhost.$mydomain, localhost
    smtpd_recipient_restrictions = permit_mynetworks
    home_mailbox = Maildir/
    Toelichting
    • myhostname: Wanneer je VPS mail stuurt namens de localhost / host name, gebruikt Postfix als domein de waarde van de variabele $myhostname. Standaard gebruikt Postfix als waarde de localhost van je VPS.
      Wil je dat Postfix een ander domein gebruikt voor $myhostname? Uncomment / verwijder dan de # bij een van de aanwezige #myhostname regels (omstreeks regel 80-90) en geef de gewenste domeinnaam op.
       
    • mydomain: De variabele $mydomain wordt een aantal keer gebruikt in de Postfix-configuratie, voornamelijk om andere variabelen aan te vullen (zie bijvoorbeeld myorigin hieronder).
      Postfix gebruikt hiervoor de waarde van $myhostname min het eerste deel. Is bijvoorbeeld server.example.com de waarde van $myhostname, dan wordt de $mydomain variabele automatisch ingevuld als 'example.com'.
      Wil je dit zelf aanpassen? Uncomment dan 'mydomain' en pas die naar wens aan.
       
    • myorigin: Voor lokale mail (binnen je VPS) gebruikt Postfix standaard de waarde van $myhostname. Het is netter dit aan te passen naar de waarde van $mydomain. Uncomment 'myorigin = $mydomain'.
       
    • smtp_bind_address (optioneel): Postfix gebruikt voor het versturen van mail een willekeurig beschikbaar IP-adres van je VPS. Wil je hier meer controle over, dan kun je een IP-adres specificeren door onderaan in het configuratiebestand de volgende regel toe te voegen. Vervang hierbij 123.123.123.123 door het IP-adres dat je wil gebruiken. Deze optie is niet aanwezig in CentOS 8.
       
    • smtp_bind_address6 (optioneel): Net als smtp_bind_address kun je smtp_bind_address6 gebruiken om aan een specifiek IPv6-adres te binden. Deze optie is niet aanwezig in CentOS 8.
       
    • inet_interfaces: De netwerk interfaces waarop Postfix mail ontvangt. Je kan hier IP-adressen specificeren.
       
    • inet_protocols: Wil je enkel IPv4 of IPv6 gebruiken? Pas dan de waarde van inet_protocols aan naar ipv4 of ipv6, bijvoorbeeld:
      inet_protocols=ipv4
      
       
    • mydestination: De domeinen waarvoor de $local_transport mail transport wordt gebruikt. Voor andere domeinen wordt de SQL-constructie gebruikt die we in dit artikel opzetten.
       
    • smtpd_recipient_restrictions: De waarde permit_mynetworks vertelt Postfix om verbindingen die in $mynetworks staan toe te staan voor 'RCPT TO'commando's.
       
    • home_mailbox: De mapnaam waar de mailbox in wordt aangemaakt. Stel dat je hier 'Maildir' invult, dan wordt met de configuratie die je in dit artikel doorloopt de mailbox aangemaakt in /home/vmail/<jedomeinnaam>/<gebruikersnaam>/Maildir/.
       

     

    Stap 4

    De Postfix-configuratie heeft (bijna) geen default of uitgecommentarieerde code voor SSL/TLS. Scroll naar het eind van het bestand en voeg de volgende code toe/pas de bestaande waardes aan. In de toelichting leggen wij de code nader toe.

    Let op: In de versie van december 2021 van Postfix is er een kopje 'TLS parameters' aanwezig. Voeg de onderstaande code daar toe / pas de bestaande code aan waar nodig.

    #TLS configuration options
    append_dot_mydomain = no
    biff = no
    config_directory = /etc/postfix
    dovecot_destination_recipient_limit = 1
    smtp_tls_security_level = may
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
    smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem
    smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_security_options = noanonymous, noplaintext
    smtpd_sasl_tls_security_options = noanonymous
    smtpd_tls_auth_only = yes
    smtpd_tls_security_level = may
    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
    smtpd_use_tls=yes
    Toelichting
    • append_dot_mydomain: lokale mail gericht aan gebruikers zonder domeinnaam krijgen de opgegeven domeinnaam toegevoegd. Gebruik 'no' of je hostname, e.g. server.voorbeeld.nl.
       
    • biff: Stuurt gebruikers op je besturingssysteem een 'new mail' notificatie als er nieuwe mail komt. Als je VPS als mailserver wordt opgezet en niet als remote werkplek, gebruik je 'no' als waarde om dit uit te schakelen.
       
    • config_directory: de locatie waar main.cf en master.cf zijn opgenomen.
       
    • dovecot_destination_recipient_limit: Geeft mails op je mailserver af aan maximaal het opgegeven aantal gebruikers tegelijkertijd.
       
    • smtp_tls_security_level: Het standaard beveiligingsniveau van de Postfix SMTP client. De optie 'may' zorgt ervoor dat TLS gebruikt wordt als de remote SMTP server waar mail naar verstuurd wordt dit ondersteund. Zo niet, dan wordt plaintext gebruikt.
       
    • smtp_ & smtpd_tls_session_cache_database: De naam van het SMTP en SMTPD session cache bestand, zie deze pagina voor meer informatie over session caching.
       
    • smtpd_tls_cert_file & smtpd_tls_key_file: De locatie van je SSL-certificaat en private key. Vervang mail.example.com door het subdomein dat je wil gebruiken om mail over te sturen en ontvangen.
       
    • smtpd_sasl_auth_enable: Staat SASL-authenticatie toe. SASL is een technologie waarmee authenticatie losgekoppeld kan worden van de applicatie. Onze VPS-mailservice gebruikt bijvoorbeeld SASL. In deze handleiding gebruiken we het om Dovecot en Postfix met elkaar te kunnen laten communiceren.
       
    • smtpd_sasl_security_options: Verbied anonieme verbindingen en plaintext wachtwoorden voor SASL-verbindingen. Dit gebruikt Postfix voor het afleveren van mail aan Dovecot.
       
    • smtpd_sasl_tls_security_options: Verbied anonieme verbindingen voor TLS versleutelde SMTP sessies.
       
    • smtpd_tls_auth_only: Met de waarde 'yes' wordt een TLS-verbinding vereist. Onveilige verbindingen zonder encryptie worden niet toegestaan.
       
    • smtpd_tls_security_level: De waarde 'may' laat remote SMTP clients weten dat STARTTLS ondersteund wordt op je server. Het wordt niet verplicht door deze optie, daar zorgt smtpd_tls_auth_only = yes voor.
       
    • smtpd_use_tls: Vereist TLS van remote SMTP clients met de waarde 'yes' (dit is aanzienlijk veiliger dan de default optie 'no').

     

    Stap 5

    In deze stap voeg je de benodigde code toe om gebruik te maken van virtual mailboxes. Voeg aan het eind van het bestand de volgende code toe. In de toelichting leggen wij virtual mailboxes en de code nader toe.

    # Virtual mail settings
    virtual_transport = dovecot
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    virtual_mailbox_domains = mysql:/etc/postfix/virtual-mailbox-domains.conf
    virtual_mailbox_maps = mysql:/etc/postfix/virtual-mailbox-users.conf
    virtual_alias_maps = mysql:/etc/postfix/virtual-alias-maps.conf
    
    Toelichting

    In de inleiding van dit artikel gaven wij aan dat wij virtual mailboxes gebruiken. In Linux heb je systeem users, zoals root en gebruikersaccounts die je zelf aanmaakt. Standaard worden die gebruikt voor het sturen van mail, met bijvoorbeeld als versturend domein je hostname. Dit werkt prima wanneer je één domein host, zoals voorbeeld.nl, maar als je twee of meer domeinen host, hoe maak je dan onderscheid tussen bijvoorbeeld info@voorbeeld.nl en info@example.com? Die zouden beide het gebruikersaccount 'info' gebruiken.

    Voor dergelijke scenario's raden wij virtual mailboxes aan (en omdat het overzichtelijk werkt). Hiermee specificeer je duidelijk welke domeinen op je VPS mail mogen ontvangen en versturen.

    Dat brengt ons bij de code:

    • virtual_transport: Geeft aan welke LMTP (Local Mail Transfer Protocol) gebruikt wordt voor het afleveren van mail. In dit geval is dat die van Dovecot.
       
    • virtual_sasl_type: Geeft aan welk type SASL-authenticatie gebruikt wordt. Hier is dat Dovecot.
       
    • virtual_sasl_path: Geeft aan waar de authenticatie-socket zich bevindt relatief gezien ten opzichte van de Postfix spool directory (standaard /var/spool/postfix)
       
    • virtual_mailbox_domains: geeft aan waar een overzicht te vinden is van de (virtuele) domeinen die via je VPS mail versturen / ontvangen. In dit geval wordt een mysql-verbinding gebruikt waarvan de configuratie bepaalt is in /etc/postfix/mysql-virtual-mailbox-domains.conf (dit bestand maak je aan in de volgende stap).
       
    • virtual_mailbox_maps: bepaalt waar de virtuele mailboxes te vinden zijn. In dit geval verwijst dit ook naar een configuratiebestand waarin een sql-verbinding is geconfigureerd.
       
    • virtual_alias_maps: Hiervoor geldt hetzelfde als bij virtual_mailbox_maps, maar dan voor mail aliases.

    Sla hierna de wijzigingen op en sluit het bestand (ctrl + > > enter).


     

    Stap 6

    In de vorige stap heb je de locatie opgegeven van de virtual_mailbox_domains-, virtual_mailbox_maps- en virtual_alias_maps-configuratiebestanden. Met de code hieronder maak je deze bestanden aan en configureer je ze.

    Pas de waardes 'user', 'password' en 'mailserver' aan naar respectievelijk de naam en het wachtwoord van de database-gebruiker en de databse naam die je in stap 5 en 4 van het eerste onderdeel hebt ingesteld.

    Tip: Je kunt de code bijvoorbeeld naar een tekst editor kopiëren en plakken, waar nodig de gegevens aanpassen en daarna in Putty plakken.

    echo 'user = user' > /etc/postfix/virtual-mailbox-domains.conf
    echo 'password = password' >> /etc/postfix/virtual-mailbox-domains.conf
    echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-mailbox-domains.conf
    echo 'dbname = mailserver' >> /etc/postfix/virtual-mailbox-domains.conf
    echo "query = SELECT 1 FROM virtual_domains WHERE DomainName ='%s'" >> /etc/postfix/virtual-mailbox-domains.conf
    
    echo 'user = user' > /etc/postfix/virtual-mailbox-users.conf
    echo 'password = password' >> /etc/postfix/virtual-mailbox-users.conf
    echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-mailbox-users.conf
    echo 'dbname = mailserver' >> /etc/postfix/virtual-mailbox-users.conf
    echo "query = SELECT 1 FROM virtual_mailboxes WHERE Email='%s'" >> /etc/postfix/virtual-mailbox-users.conf
    
    echo 'user = user' > /etc/postfix/virtual-alias-maps.conf
    echo 'password = password' >> /etc/postfix/virtual-alias-maps.conf
    echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-alias-maps.conf
    echo 'dbname = mailserver' >> /etc/postfix/virtual-alias-maps.conf
    echo "query = SELECT Destination FROM virtual_aliases WHERE Source='%s'" >> /etc/postfix/virtual-alias-maps.conf
    
    Toelichting
    • Met de echo commando's wordt de code rechtstreeks in de opgegeven bestanden toegevoegd.
    • Het eerste echo commando in ieder blok maakt het bijbehorende bestand aan.
    • De >> in de commando's voegt de respectievelijke regel aan het eind van het bestand toe.
    • Het laatste commando in ieder blok gebruikt dubbele quotes omdat anders de apostrof niet meegenomen wordt.

     

    Stap 7

    Pas de rechten aan op de bestanden zodat de root-user ze kan lezen en schrijven en de groep ze kan lezen:

    chmod 640 /etc/postfix/virtual-mailbox-domains.conf
    chmod 640 /etc/postfix/virtual-mailbox-users.conf
    chmod 640 /etc/postfix/virtual-alias-maps.conf

     

    Stap 8

    Open /etc/postfix/master.cf:

    nano /etc/postfix/master.cf

     

    Stap 9

    De configuratie in dit bestand beheerst alle processen die door Postfix worden gestart. Pas de configuratie aan, zodat het eerste deel er uit ziet als in het voorbeeld hieronder.

    #
    # Postfix master process configuration file.  For details on the format
    # of the file, see the master(5) manual page (command: "man 5 master" or
    # on-line: http://www.postfix.org/master.5.html).
    #
    # Do not forget to execute "postfix reload" after editing this file.
    #
    # ==========================================================================
    # service type  private unpriv  chroot  wakeup  maxproc command + args
    #               (yes)   (yes)   (no)    (never) (100)
    # ==========================================================================
    smtp      inet  n       -       n       -       -       smtpd
    #smtp      inet  n       -       n       -       1       postscreen
    #smtpd     pass  -       -       n       -       -       smtpd
    #dnsblog   unix  -       -       n       -       0       dnsblog
    #tlsproxy  unix  -       -       n       -       0       tlsproxy
    submission inet n       -       n       -       -       smtpd
      -o syslog_name=postfix/submission
      -o smtpd_tls_security_level=encrypt
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_tls_auth_only=yes
      -o smtpd_reject_unlisted_recipient=no
    #  -o smtpd_client_restrictions=$mua_client_restrictions
    #  -o smtpd_helo_restrictions=$mua_helo_restrictions
    #  -o smtpd_sender_restrictions=$mua_sender_restrictions
      -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
      -o milter_macro_daemon_name=ORIGINATING
    #smtps     inet  n       -       n       -       -       smtpd
    #  -o syslog_name=postfix/smtps
    #  -o smtpd_tls_wrappermode=yes
    #  -o smtpd_sasl_auth_enable=yes
    #  -o smtpd_reject_unlisted_recipient=no
    #  -o smtpd_client_restrictions=$mua_client_restrictions
    #  -o smtpd_helo_restrictions=$mua_helo_restrictions
    #  -o smtpd_sender_restrictions=$mua_sender_restrictions
    #  -o smtpd_recipient_restrictions=
    #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
    #  -o milter_macro_daemon_name=ORIGINATING
    #628       inet  n       -       n       -       -       qmqpd
    pickup    unix  n       -       n       60      1       pickup
    cleanup   unix  n       -       n       -       0       cleanup
    qmgr      unix  n       -       n       300     1       qmgr
    #qmgr     unix  n       -       n       300     1       oqmgr
    tlsmgr    unix  -       -       n       1000?   1       tlsmgr
    rewrite   unix  -       -       n       -       -       trivial-rewrite
    bounce    unix  -       -       n       -       0       bounce
    defer     unix  -       -       n       -       0       bounce
    trace     unix  -       -       n       -       0       bounce
    verify    unix  -       -       n       -       1       verify
    flush     unix  n       -       n       1000?   0       flush
    proxymap  unix  -       -       n       -       -       proxymap
    proxywrite unix -       -       n       -       1       proxymap
    smtp      unix  -       -       n       -       -       smtp
    relay     unix  -       -       n       -       -       smtp
            -o syslog_name=postfix/$service_name
    #       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
    showq     unix  n       -       n       -       -       showq
    error     unix  -       -       n       -       -       error
    retry     unix  -       -       n       -       -       error
    discard   unix  -       -       n       -       -       discard
    local     unix  -       n       n       -       -       local
    virtual   unix  -       n       n       -       -       virtual
    lmtp      unix  -       -       n       -       -       lmtp
    anvil     unix  -       -       n       -       1       anvil
    scache    unix  -       -       n       -       1       scache

    Ga naar het eind van het bestand en voeg daar nog de volgende regels toe:

    Ubuntu & Debian:

    dovecot   unix  -       n       n       -       -       pipe
      flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

    CentOS, AlmaLinux & Rocky Linux:

    dovecot   unix  -       n       n       -       -       pipe
      flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
    

    Sla tot slot je wijzigingen op en sluit het bestand (ctrl + > > enter).



    Dovecot installeren en configureren

     

    Stap 1

    Installeer Dovecot met het commando:

    Ubuntu & Debian:

    apt -y install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

    CentOS, AlmaLinux & Rocky Linux:

    dnf -y install dovecot dovecot-mysql


    Stap 2

    De configuratie van Dovecot is verspreid over meerdere specifieke bestanden. Eerst pas je de algemene configuratie aan in /etc/dovecot/dovecot.conf.

    nano /etc/dovecot/dovecot.conf

     

    Stap 3

    Pas de waardes van de onderstaande opties aan in het bestand zodat die overeenkomen met dit voorbeeld.

    Ubuntu & Debian:

    !include_try /usr/share/dovecot/protocols.d/*.protocol
    listen = *, :: 
    !include conf.d/*.conf 
    !include_try local.conf

    CentOS, AlmaLinux & Rocky Linux:

    protocols = imap pop3 lmtp
    listen = *, ::
    !include conf.d/*.conf
    !include_try local.conf

    Sla de wijzigingen op en sluit tot slot het bestand (ctrl + > > enter).

    Optioneel:

    Optioneel kun je in hetzelfde bestand met de onderstaande code de log output van Dovecot naar een ander bestand laten wegschrijven dan waar Postfix naar wegschrijft. Zo houd je je logbestanden overzichtelijker in geval van problemen.

    log_path = /var/log/dovecot.log

    Maak het opgegeven logbestand aan en pas de rechten aan, zodat Dovecot er gegevens naar kan wegschrijven.

    touch /var/log/dovecot.log
    chmod 666 /var/log/dovecot.log

    Sla de wijzigingen op en sluit tot slot het bestand (ctrl + > > enter).


     

    Stap 4

    Open de SSL-configuratie in het bestand 10-ssl.conf:

    nano /etc/dovecot/conf.d/10-ssl.conf

     

    Stap 5

    Voeg onderstaande inhoud toe aan het bestand/pas de bestaande waarde aan:

    ssl_cert = </etc/letsencrypt/live/mail.voorbeeld.nl/fullchain.pem 
    ssl_key = </etc/letsencrypt/live/mail.voorbeeld.nl/privkey.pem

    Sla daarna je wijzigingen op en sluit het bestand (ctrl + > > enter).

    Toelichting

    ssl_cert & ssl_key: verwijzen naar de locatie waar je Let's Encrypt SSL-certificaat staat.

    • Verander mail.jedomein.nl naar het subdomein die je wil gebruiken als server-naam voor inkomende en uitgaande mail.
       
    • Het certificaat genereer je in de laatste paragraaf van deze handleiding.
       

    Aanvullende informatie

    Je komt hier bij veel hanleidingen meestal de optie SSL = yes tegen. Standaard staat Dovecot ingesteld op SSL = required. SSL = required vereist in alle gevallen SSL/TLS en authenticatie voor SSL/TLS is ingeschakeld zal altijd falen. Dit is een veilige optie en daarom laten wij die op required staan.

    Wanneer je gebruik maakt van SSL = yes en disable_plaintext_auth=no (plaintext in deze context is een niet versleuteld wachtwoord), is je verbinding onveilig tenzij je enkel plaintext mechanismes gebruikt (e.g. auth { mechanisms = plain login }). Dan werkt SSL = yes in essentie hetzelfde als SSL = required. Er is dus geen reden om een andere optie dan 'required' te gebruiken.


     

    Stap 6

    Vervolgens open je de mail-configuratie. Hierin geef je aan waar de mailbox zich bevindt op je server.

    nano /etc/dovecot/conf.d/10-mail.conf

     

    Stap 7

    Pas in het bestand de onderstaande variabelen aan waar nodig:

    mail_location = maildir:/home/vmail/%d/%n/Maildir
    namespace inbox {
      inbox = yes
    }
    mail_privileged_group = mail
    mbox_write_locks = fcntl

    Sla daarna je wijzigingen op en sluit het bestand (ctrl + > > enter).

    Toelichting

    Met maildir: geef je aan dat je het maildir-format gebruikt. /home/vmail/%d/%n/Maildir geeft aan de folder te gebruiken die overeenkomt met /home/vmail/<domein>/<naam>/Maildir (%d vult het domein in en %n is een variabele die automatisch de naam die voor de domeinnaam staat in <naam>@<domein.com> invult).


     

    Stap 8

    Je geeft Postfix toestemming om Dovecot's authenticatiesysteem te gebruiken in 10-master.conf. Open dit bestand met:

    nano /etc/dovecot/conf.d/10-master.conf

     

    Stap 9

    Pas de inhoud aan zodat de services die hieronder staan in je configuratie overeenkomen. De uitgecommentarieerde stukken, herkenbaar aan dat de regels beginnen met #, hebben wij voor leesbaarheid er uit gelaten.

    service imap-login {
      inet_listener imap {
        port = 143
      }
      inet_listener imaps {
      port = 993
      ssl = yes
      }
    }
    
    service pop3-login {
      inet_listener pop3 {
        port = 110
      }
      inet_listener pop3s {
      port = 995
      ssl = yes
      }
    }
    
    
    service lmtp {
     unix_listener /var/spool/postfix/private/dovecot-lmtp {
       mode = 0600
       user = postfix
       group = postfix
     }
    }
    
    service auth {
    
      unix_listener auth-userdb {
        mode = 0600 
        user = vmail 
      }
    
      unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix 
      }
    
      user = dovecot
    }
    
    service auth-worker {
      user = vmail
    }
    
    service dict {
      unix_listener dict {
      }
    }
    Toelichting

    10-master.conf bevat configuraties van verschillende 'sockets' waarin bepaald wordt welke gebruiker welke rechten heeft bij het uitvoeren van de betreffende socket en waar die uitgevoerd wordt (gedefinieerd als de unix_listener).


     

    Stap 10

    Open het bestand waar de authenticatie in wordt verzorgt:

    nano /etc/dovecot/conf.d/10-auth.conf

     

    Stap 11

    Pas in dit bestand de volgende waardes aan zodat die er uit zien zoals hieronder:

    disable_plaintext_auth = yes
    auth_mechanisms = plain login
    
    #!include auth-system.conf.ext
    !include auth-sql.conf.ext

    Sla daarna je wijzigingen op en sluit het bestand (ctrl + > > enter).

    Toelichting
    auth_mechanisms = plain login: voegt ondersteuning voor plain en login toe. Dit zijn authenticatiemethodes die door (nagenoeg) alle mailsoftware ondersteund wordt.

    auth-system-conf.ext: Door deze optie uit te commentariëren, voorkom je dat de standaard aanwezige authenticatie systemen conflicteren met de authenticatie voor SQL die je zelf insteld.

    auth-sql.conf.ext: Het bestand waarin de authenticatie via SQL wordt verzorgd.

     

    Stap 12

    Open vervolgens het bestand auth-sql.conf.ext:

    nano /etc/dovecot/conf.d/auth-sql.conf.ext

     

    Stap 13

    Pas de passdb- en userdb-driver aan als volgt:

    passdb {
      driver = sql
      args = /etc/dovecot/dovecot-sql.conf.ext
    }
    
    userdb {
      driver = static
      args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
    } 

    Sla je wijzigingen op en sluit het bestand (ctrl + > > enter).


     

    Stap 14

    in auth-sql.conf.ext zag je misschien al dat passdb verwijst naar /etc/dovecot/dovecot-sql.conf.ext. Dit bestand bestaat nog niet maar hierin moeten de gegevens voor de MySQL-verbinding komen. Maak het aan met de commando's hieronder, waarbij je de waardes 'mailserver', 'user' en 'password' in de 2e regel vervangt door de gegevens zoals je die in stap 4 en 5 van het eerste deel van deze handleiding hebt ingesteld.

    echo 'driver = mysql' > /etc/dovecot/dovecot-sql.conf.ext
    echo 'connect = "host=127.0.0.1 dbname=mailserver user=user password=password"' >> /etc/dovecot/dovecot-sql.conf.ext
    echo 'default_pass_scheme = SHA512-CRYPT' >> /etc/dovecot/dovecot-sql.conf.ext
    echo "password_query = SELECT Email as User, password FROM virtual_mailboxes WHERE Email='%u';" >> /etc/dovecot/dovecot-sql.conf.ext


    Vmail-gebruiker aanmaken

    In de stappen hierboven heb je een paar keer als user 'vmail' ingesteld. In de stappen hieronder maak je deze user aan en pas je waar nodig rechten tot directories e.d. aan.

     

    Stap 1

    Maak de vmail user, group en bijbehorende home directory aan met:

    useradd -u 5000 vmail -d /home/vmail/
    usermod -a -G vmail vmail
    groupmod -g 5000 vmail
    mkdir /home/vmail/

    Het mkdir-commando is normaal gesproken niet nodig, maar uit voorzorg toegevoegd mocht je OS niet met het -d argument bij useradd de home directory correct aanmaken.


     

    Stap 2

    Pas de rechten van de vmail-user aan voor /home/vmail en /etc/dovecot als volgt:

    chown -R vmail:vmail /home/vmail
    chown -R vmail:dovecot /etc/dovecot
    chmod -R o-rwx /etc/dovecot


    Firewall en gerelateerde instellingen

    Voor de correcte werking van je mail en het genereren van Let's Encrypt certificaten, is het nodig enkele poorten open te zetten. Dit doe je met de commando's:

    Ubuntu & Debian:

    ufw allow 80
    ufw allow 443
    ufw allow 25
    ufw allow 465
    ufw allow 587
    ufw allow 993
    ufw allow 995

    CentOS Stream, AlmaLinux & Rocky Linux:

    firewall-cmd --zone=public --permanent --add-port=80/tcp
    firewall-cmd --zone=public --permanent --add-port=443/tcp
    firewall-cmd --zone=public --permanent --add-port=25/tcp
    firewall-cmd --zone=public --permanent --add-port=465/tcp
    firewall-cmd --zone=public --permanent --add-port=587/tcp
    firewall-cmd --zone=public --permanent --add-port=993/tcp
    firewall-cmd --zone=public --permanent --add-port=995/tcp
    firewall-cmd --reload
    • Poort 80 en 443 zijn nodig voor de Let's Encrypt-validatie (de acme-challenge).
    • Poort 993 en 995 zijn respectievelijk de IMAP- en POP3-poorten die Dovecot gebruikt voor TLS-verbindingen.
    • Poort 25, 465 en 587 zijn de poorten die Postfix gebruikt voor het versturen en ontvangen van e-mail.

     

    Selinux

    Gebruik je Selinux (te controleren met 'sestatus')? Voeg dan de nodige poorten ook hierin toe met:

    semanage port --add -t ssh_port_t -p tcp 80
    semanage port --add -t ssh_port_t -p tcp 443
    semanage port --add -t ssh_port_t -p tcp 25
    semanage port --add -t ssh_port_t -p tcp 465
    semanage port --add -t ssh_port_t -p tcp 587
    semanage port --add -t ssh_port_t -p tcp 993
    semanage port --add -t ssh_port_t -p tcp 995

     

    Uitgaande mailpoorten openzetten

    Bij nieuwe VPS'en zijn de mailpoorten om veiligheidsredenen gesloten in het TransIP-controlepaneel. In dit artikel laten wij zien hoe je ze open zet.


     

    VPS-firewall

    Gebruik je de VPS-firewall in het TransIP-controlepaneel? Zet dan ook daarin de poorten 80, 443, 993, 995 en 587 open.


     

    Fail2ban

    Gebruik je Fail2Ban? De logpath voor de Postfix-jail is /var/log/maillog



    SSL

     

    In dit onderdeel maak je een SSL-certificaat aan met Let's Encrypt en automatiseer je het vernieuwen ervan.

     

    Stap 1

    Installeer Let's Encrypt met het commando:

    Ubuntu & Debian:

    apt -y install certbot

    CentOS Stream, AlmaLinux & Rocky Linux:

    yum -y install certbot

     

    Stap 2

    In deze stap genereer je een standalone certificaat met het onderstaande commando. Vervang hier mail.voorbeeld.nl door het subdomein dat je wil gebruiken om in je mailclient in te stellen als server voor inkomend en uitgaand verkeer.

    Er zal je om een e-mailadres en toestemming gevraagd worden voor de algemene voorwaarden, en voor het delen van je e-mailadres met de Electronic Frontier Foundation (optioneel).

    certbot certonly --standalone -d mail.voorbeeld.nl

     

    Stap 3

    Je Let's Encrypt-certificaat en keyfile zijn opgeslagen in /etc/letsencrypt/live/<hostname>/ (de exacte locatie staat in de output van het commando in stap 2).

    Het voordeel van Let's Encrypt is dat je het verlengen van de certificaten kunt automatiseren. Dit doe je middels een cronjob die je aanmaakt met:

    crontab -e

     

    Stap 4

    De eerste keer dat je crontab start wordt gevraagd wat voor type editor je wil gebruiken. Wij gebruiken hier vi voor, waarbij Crontab in command mode opent en je overschakelt op insert mode met de toets 'i'. Voeg daarna de inhoud hieronder toe.

    SHELL=/bin/bash
    HOME=/
    @monthly certbot -q renew >> /var/log/le.log
    • De cronjob wordt iedere maand om 0:00 uitgevoerd.
    • -q zorgt ervoor dat er geen output wordt gegenereerd, behalve bij errors.
    • renew vernieuwt alle Let's Encrypt-certificaten die binnen 30 dagen verlopen. Let's Encrypt certificaten zijn 90 dagen geldig, dus hiermee wordt elke twee maanden een nieuw certificaat gegenereerd.
    • >> /var/log/le.log stuurt de output naar het bestand le.log. Deze maak je aan met het commando: touch /var/log/le.log (of gebruik de bestaande /var/log/letsencrypt/letsencrypt.log)

    Door achtereenvolgens esc > :wq! te typen sluit je de crontab en sla je je wijzigingen op. Als alles goed gaat krijg je de volgende bevestiging te zien:

    crontab: installing new crontab

     

    Stap 6

    Postfix en Dovecot hebben geen rechten tot de mappen waar de certificaten in zijn opgeslagen en tot het privkey1.pem bestand. Pas de rechten aan zodat beide er gebruik van kunnen maken:

    chmod 755 /etc/letsencrypt/archive
    chmod 755 /etc/letsencrypt/archive/mail.voorbeeld.nl
    chmod 644 /etc/letsencrypt/archive/mail.voorbeeld.nl/privkey1.pem
    chmod 755 /etc/letsencrypt/live
    chmod 755 /etc/letsencrypt/live/mail.voorbeeld.nl


    Een e-mailadres aanmaken

     

    Stap 1

    Maak eerst een directorie aan in /home/vmail/ voor het domein namens welke je mail gaat versturen en pas de eigenaar van die directorie aan, bijvoorbeeld:

    mkdir -p /home/vmail/voorbeeld.nl/

     

    Stap 2

    Maak een directorie aan voor de mail van de gebruiker en pas de eigenaar van deze en de onderliggende directorie aan:

    mkdir /home/vmail/voorbeeld.nl/gebruiker
    chown -R vmail:vmail /home/vmail/voorbeeld.nl/

     

    Stap 3

    Start vervolgens een SQL-shell:

    mysql -u root -p

     

    Stap 4

    Als je een mailadres wil toevoegen voor een domein dat nog niet in je database voorkomt (zoals wanneer je deze handleiding voor het eerst doorloopt), voeg je eerst het domein toe.

    De huidige domeinen in je database controleer je met het commando:

    SELECT * FROM mailserver.virtual_domains;
    

    Een nieuw domein voeg je vervolgens toe met:

    INSERT INTO mailserver.virtual_domains (DomainName) VALUES ('voorbeeld.nl');

    Vervang hier 'voorbeeld.nl' door de naam van het domein dat je wil toevoegen


     

    Stap 5

    Voeg vervolgens een e-mailadres toe met de onderstaande code.

    • Vervang 1 (de DomainId) door het id van het domein in de virtual_domains tabel, te controleren met:
      SELECT * FROM mailserver.virtual_domains;
    • Vervang transip@voorbeeld.nl en password door respectievelijk het gewenste mailadres en wachtwoord.
    INSERT INTO mailserver.virtual_mailboxes
      (DomainId, Email, Password)
    VALUES 
      ('1', 'transip@voorbeeld.nl', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))));

    of in één regel:

    INSERT INTO mailserver.virtual_mailboxes (DomainId, Email, Password) VALUES ('1', 'transip@voorbeeld.nl', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))));

     

    Stap 6

    Sluit vervolgens de SQL-shell met:

    exit

    Wanneer je voortaan een nieuw mailadres voor een bestaand domein aanmaakt, herhaal je stap 2, 3, 5 en 6 van dit onderdeel.


     

    Alles inschakelen

    Gefeliciteerd! Je bent nu klaar bent met de configuratie van je mailserver. Het enige dat nog resteert, is je mailserver in te schakelen en in je e-mail clients je mailadres toe te voegen. Schakel eerst je mailserver in met:

    systemctl enable postfix
    systemctl enable dovecot
    systemctl restart postfix
    systemctl restart dovecot


    E-mail instellen in mail software en apps

    Voor deze handleiding hebben wij een domein gebruikt waarbij het MX-record de waarde 10 mail heeft en het subdomein mail naar de VPS verwijst. Wij gaan ervan uit dat je dezelfde structuur aanhoudt, zo niet, pas dan onderstaande aan naar je eigen scenario.

    Voor het instellen van je mailadres in je mailsoftware gebruik je de volgende gegevens:

    • E-mailadres: het gewenste e-mailadres waar je mee wil mailen.
    • Username: hetzelfde e-mailadres als hierboven
    • Password: het bijbehorende (niet versleutelde) wachtwoord
    • Account naam: nogmaals hetzelfde e-mailadres
    • Send message using the name: De naam waarvan je wilt dat die verschijnt voor je e-mails.
       
    • Incoming server: mail.voorbeeld.nl (het subdomein dat verwijst naar je VPS)
    • Account type: imap of pop3. De verschillen worden hier uitgelegd.
    • Incoming port: 993 (IMAP) of 995 (POP3)
    • Require SSL: yes, of SSL/TLS
       
    • Outgoing (smtp) server: mail.voorbeeld.nl (het subdomein dat verwijst naar je VPS)
    • Outgoing port: 465 of 587
    • Require SSL: yes, of SSL/TLS
    • Outgoing server requires authentication: yes
    • Use the same user name and password for sending mail: yes

     

    Daarmee zijn wij aan het eind gekomen van deze handleiding. Hierin hebben wij de basis van het opzetten van een mailserver met Postfix en Dovecot met TLS-beveiliging via Let's Encrypt behandelt. Voor de beveiliging van je mailserver raden wij aan ook nog de volgende documentatie door te nemen:

    1717655739780-postfix.sh1717655739782-postfixuninstall.sh

    1717655810277-postfix.sh1717655810278-postfixuninstall.sh

    1717655739780-postfix.sh

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op