Linux mailrelay installeren met postfix en mysql back-end

  •  
  •  

Door onderstaand plan te volgen, kun je een relay server of fallback server installeren die alleen mail accepteert voor domeinen die in het systeem bekend zijn. De domeinen en de instellingen zijn opgeslagen in een mysql-database (d.m.v. transport-maps). Doordat het systeem alleen mail accepteert van domeinen die bekend zijn spreken we van een closed-relay. In de praktijk wordt deze configuratie o.a. gebruikt als:

  1. Fallback server:
    De server wordt ingesteld op het secondaire MX-record van een domein (het MX record heeft een lagere prioriteit dan het primaire record) en zal alleen e-mail moeten afhandelen wanneer de primaire mailserver niet meer beschikbaar is. Op die manier kan het betreffende domein altijd mail accepteren en wordt deze zodra de primaire mailserver weer online is alsnog doorgezet.
  2. Relaying server:
    De e-mail wordt standaard door deze server opgevangen en eventueel gecontroleerd op virussen en/of spam. Vervolgens kan de e-mail worden doorgezet naar de betreffende partij op basis van een ip-adres en eventueel een andere poort dan de standaard poort 25 voor SMTP. Vaak blokkeren providers deze poort, maar via een relay-server wordt de mail op een andere poort doorgezet naar de uiteindelijke ontvanger, zodat de mail gewoon kan worden bezorgd.
  3. Load-balancing server:
    Wanneer deze mailrelay, samen met eventueel nog een tweede relay op de MX-records wordt ingesteld en de MX-records krijgen dezelfde prioriteit, dan zal een afzender een semi-willekeurig MX-record kiezen (dat doet de mailserver van de afzende automatisch). Op die manier worden er ongeveer evenveel mails afgeleverd bij beide mailservers. Wordt het aantal mails ook voor de twee ingestelde servers te zwaar, dan zet je er simpelweg een derde bij met dezelfde MX-prioriteit.

Er wordt in dit stappenplan vanuit gegaan dat je basiskennis van Linux hebt en dat je op een recente Linux distributie werkt.

Let op!

Deze instructie legt je niet uit hoe je een volledige e-mailserver met mailboxen kunt installeren, de uiteindelijke server kan alleen gebruikt worden in bovenstaande situaties als fallback-, relaying- of load-balancing mailserver. Dat betekent dus dat je deze server in combinatie met een andere mailserver met mailboxes dient te gebruiken. Hierbij maakt het niet uit of je bijvoorbeeld Exchange, Postfix/Dovecot, Exim of iets anders gebruikt.

Perfacilis E-mail

De Perfacilis E-mail service maakt ook gebruik van deze techniek. Bijvoorbeeld om de grote stroom mails (troughput) aan te kunnen, om Exchange SMTP-connectors te maken, of om te zorgen dat als onze primaire mailserver het even niet doet, de mail op onze fallback servers wordt bewaard.

Meer leren?

Basisinstallatie van Postfix

Start met het installeren van de benodigde pakketten:

apt-get install postfix postfix-mysql mysql-server

Tijdens het installeren krijg je de vraag wat het type mailsysteem is dat je wilt installeren. Kies bij de vraag "General type of mail-configuration" voor "Internet Site":
postfix-configuration-as-internet-site

Zorg dat je op de vraag voor "System mail name" een unieke naam kiest voor jouw relayserver. Kies bijvoorbeeld "relay.jouwdomein.nl" of "fallback.jouwdomein.nl":

postfix-conguratie-fqdn

Postfix basisinstellingen

Wanner de pakketten geïnstalleerd zijn dient Postfix op de juiste manier geconfigureerd te worden. Zorg hiertoe dat onderstaande regels in het bestand /etc/postfix/main.cf aanwezig zijn. Pas hiervoor eventueel de regels die al aanwezig zijn in het bestand aan. Eventueel kun je het main.cf bestand ook hernoemen naar bijvoorbeeld main.original en vervolgens een nieuw main.cf-bestand aan te maken met onderstaande inhoud.

# debug
debug_peer_list = your-test-mail-server.com
debug_peer_level = 2

# message size of 500MB
message_size_limit = 524288000
mailbox_size_limit = 0

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
append_dot_mydomain = no
#alias_maps= hash:/etc/aliases

mydestination = localhost
relayhost =

# sender and recipient restictions (spam protection)
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_invalid_hostname,
reject_unauth_pipelining,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit

Postfix koppelen aan Mysql

Mysql gebruiker en database instellen

Op basis van de mysql handleiding loggen we in bij Mysql en maken we een gebruiker aan. Pas in onderstaand voorbeeld PASSWORD naar wens aan en bewaar dit wachtwoord in ieder geval tot de stap waar de Virtualmaps worden ingesteld. Desgewenst kun je de gebruikersnaam en het ip-adres ook aanpassen.

mysql --defaults-file=/etc/mysql/debian.cnf
> CREATE DATABASE mail;
> CREATE USER 'mail'@'127.0.0.1' IDENTIFIED BY 'PASSWORD';
> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'127.0.0.1';
> FLUSH PRIVILEGES;

Vervolgens installeren we de database. Plak onderstaande queries één voor één in mysql.

USE mail;

CREATE TABLE `domains` (
`domain` VARCHAR(255) NOT NULL,
`relay_host` VARCHAR(512) NOT NULL,
`relay_port` INT(5) UNSIGNED NOT NULL,
`enable_virus_spam_scan` VARCHAR(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`domain`)
) ENGINE MyISAM DEFAULT CHARSET=latin1;

Virtualmaps instellen

De mysql database wordt gekoppeld aan Postfix met virtualmaps. Er wordt een map opgesteld voor de relay_domains, waarin wordt aangegeven voor welke domeinen de relaying geldt — voor welke domeinen de server e-mail mag accepteren.

Maak eerst het bestand /etc/postfix/mysql-relay-domains.cf aan met de volgende inhoud:

user = mail
password = PASSWORD
hosts = 127.0.0.1
dbname = mail
query = SELECT domain FROM domains WHERE domain = '%s'

En hetzelfde voor het bestand /etc/postfix/mysql-transport-domains.cf:

user = mail
password = PASSWORD
hosts = 127.0.0.1
dbname = mail
query = SELECT CONCAT('smtp:[', relay_host , ']:', relay_port) FROM domains WHERE domain = '%s'

Pas in ieder geval het PASSWORD aan en eventueel de overige velden zodat de instellingen overeenkomen met Mysql.

Vervolgens dienen deze 'maps' te worden aangeroepen in /etc/postfix/main.cf:

# mysql virtual domains
relay_domains = proxy:mysql:/etc/postfix/mysql-relay-domains.cf
transport_maps = proxy:mysql:/etc/postfix/mysql-transport-domains.cf

De "proxy:" prefix zorgt dat resultaten gecached worden tot Postfix herladen of opnieuw gestart wordt. Zo lang je het systeem aan het testen bent kun je dit eventueel weglaten, wanneer je echter service postfix reload uitvoert zal de cache worden geleegd.

Configuratie testen

Door een mail direct aan de relaying server te sturen via telnet kun je kijken hoe de server reageert:

telnet 1.2.3.4 smtp
> EHLO localhost
> MAIL FROM: <test@friet.pan>
> RCPT TO: <test@friet.pan>

Op dit moment zou het systeem de melding "454 ... Relay Access Denied" moeten geven. Een melding als "451 ... Temporary Lookup Failure" betekent dat je ergens in de configuratie fout hebt staan. Gebruik de maillog voor meer details:

tail -f /var/log/mail.info

Open Relay

Wanneer het systeem na de "RCPT TO" opdracht de melding "250 Ok" geeft, dan is het systeem een zogenaamde open-relay, jouw mailserver accepteert dan e-mail voor elk willekeurig domein; Een absoluut ongewenste situatie! De server mag alleen e-mail toestaan voor domeinen die bekend zijn in het systeem, dus die aanwezig zijn in de domains tabel in mysql. Gezien de domains-tabel nog leeg is betekent dit dat er ergens in de configuratie iets niet juist zit.

Domeinen toevoegen en instellen

Vervolgens kun je domeinen waarvoor je de relaying wilt gaan toestaan toevoegen aan de domains-tabel via Mysql:

mysql --defaults-file=/etc/mysql/debian.cnf
> USE mail;
> INSERT INTO domains (domain, relay_host, relay_port) VALUES ('friet.pan', 'mail.friet.pan', 25);

Je kunt voor het veld relay_host een ipv4- of ipv6-adres of een hostnaam gebruiken, zo lang deze maar verwijst naar de uiteindelijke mailserver, dus de server waar de mail normaliter op bezorgd zou worden. Poort 25 is de standaardpoort voor SMTP maar je kunt dit ook desgewenst aanpassen (in de praktijk wordt dit weleens gebruikt om de firewall van providers die mail via poort 25 weigeren te omzeilen).

Spam, Antivirus en Autowhitelist (AWL)

Zoals je in de query ziet om de tabel domains te maken, bevat deze tabel de kolom "enable_virus_spam_scan". Hiermee kan worden aangegeven of het antivirus en spamfilter actief moet zijn voor het betreffende domein. Het is bij spammers bekend dat relays vaak een zwakkere beveiliging hebben dan primaire mailservers. Zorg daarom dat de uiteindelijk mailserver goede filtering biedt of zorg dat de mailrelay uitgerust wordt met eem spam- en antivirusfilter.

Address Verification

Je kunt gebruik maken van de Address Verification techniek die standaard in Postfix is geïmplementeerd. Wanneer een afzender dan een e-mail aanbiedt wordt het adres van de ontvanger gecontroleerd. Als het e-mailadres niet bestaat wordt er teruggegeven aan de afzender dat er een ongeldig e-mailadres wordt gebruikt. Dit is natuurlijk een perfecte methode om e-mailadressen te valideren, waartoe ons advies is om deze techniek absoluut te vermeiden.

Conclusie

Binnen een paar simpele stappen heb je een fallback server staan waarmee je een stukje extra zekerheid voor jouw e-mailservice kunt bieden. Zodra jouw primaire mailserver niet meer reageert wordt de mail namelijk vastgehouden door de fallback server.

Het zwakke punt van deze mailserver is dat de inkomende mail niet gecontroleerd wordt: zodra een spammer een mail voor een door deze server geaccepteerd domein aanbiedt, wordt deze mail standaard geaccepteerd en doorgezet naar jouw primaire mailserver. Op jouw primaire mailserver dient daarom een goede bescherming aanwezig te zijn. Spammers maken in de praktijk gretig gebruik van deze tekortkoming, je kunt vaak al na een paar uur in de logs zien dat er pogingen worden ondernomen. Er zijn voldoende methoden om je server hier tegen te beschermen (denk o.a. aan een spam- en antivirusfilter, maar ook aan fail2ban of je eigen firewall of blacklist), maar het blijft lastig om deze server 100% waterdicht te krijgen.

Desondanks wordt dit type mailserver in de praktijk veelvuldig gebruikt, simpelweg omdat deze server, mits juist geconfigureerd, voor voldoende toepassingen ingezet kan worden.