Wat dit bouwt
Een complete mailserver voor één domein: Postfix voor transport, Dovecot voor IMAP en lokale bezorging, rspamd voor filtering en DKIM-ondertekening, en de drie DNS-records die bepalen of grote ontvangers je mail in de inbox plaatsen of in een map die niemand opent. Het verzendt, het ontvangt, het authenticeert, en het is geen open relay.
Het runnen van je eigen mail is een onmodieus advies en meestal om goede redenen. Bezorgbaarheid is het moeilijke deel, niet de software. Als je DNS verkeerd staat, plaatst de meest zorgvuldig geconfigureerde Postfix ter wereld berichten regelrecht in het niets.
Voordat je begint
- Een R-8 of groter. Filtering is CPU-gebonden en rspamd gebruikt met plezier elke core die je geeft tijdens een spamgolf.
- Een domein waarvan je de DNS beheert, en geduld voor propagatie.
- Reverse DNS ingesteld op het instance-adres naar je mailhostname. Het is bewerkbaar in het paneel en het is verplicht: ontvangers wijzen niet-resolveerbare afzenders af.
- Eén ticket naar support met de vraag of uitgaande poort 25 open is op je instance. Vraag dit voordat je bouwt, niet erna.
mail.example.comoveral. Vervang door je eigen waarden.
1. Hostname en DNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -yPubliceer deze records nu, want de certificaatstap heeft het A-record nodig en de ondertekeningsstap heeft een plek nodig om een sleutel te plaatsen. Waarden in de tabel zijn wat elk record doet, niet wat je moet plakken.
| Record | Naam | Inhoud |
|---|---|---|
| A / AAAA | mail | De instance-adressen uit het paneel |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s |
| PTR | instance-adres | mail.example.com — ingesteld in het paneel |
Het SPF-record zegt: mijn MX-hosts verzenden mijn mail, al het andere is vervalst. Hard fail in plaats van soft fail, want ~all nodigt ontvangers uit om hun eigen beslissing te nemen en hun beslissing zal niet de royale zijn. DMARC begint bij p=none, zodat je een week lang rapporten verzamelt voordat er iets wordt afgewezen namens jou.
2. Certificaten
apt install -y certbot
certbot certonly --standalone -d mail.example.comEr luistert nog niets op poort 80, dus standalone-modus is de eenvoudigste weg. Vernieuwingshooks komen aan het eind, zodra de daemons bestaan om te herladen.
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-serverStel nu de transportconfiguratie in. Elke regel hieronder is bewust; postconf schrijft ze op hun plaats, dus er is geen editor om fout te doen:
postconf -e "myhostname = mail.example.com"
postconf -e "mydestination = localhost"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "inet_interfaces = all"
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem"
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtp_tls_security_level = dane"
postconf -e "smtpd_tls_mandatory_protocols = >=TLSv1.2"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_recipient_domain reject_unauth_destination"
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
postconf -e "virtual_mailbox_domains = example.com"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
postconf -e "milter_default_action = accept"De belangrijkste regel is smtpd_relay_restrictions. Deze eindigt met reject_unauth_destination, wat voorkomt dat het hele internet jouw machine gebruikt om mail te verzenden. Een open relay zorgt ervoor dat je binnen enkele uren wordt geweerd en het is bovendien een schending van de acceptabel gebruiksvoorwaarden.
Schakel de submission-poort in zodat je eigen clients kunnen verzenden, met authenticatie vereist en geen anonieme toegang:
postconf -M submission/inet="submission inet n - y - - smtpd"
postconf -P "submission/inet/syslog_name=postfix/submission"
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"4. Dovecot
Mailboxen in Maildir onder één systeemgebruiker houdt deze build klein. Maak de gebruiker en de opslag:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 -d /var/vmail -m vmail
install -d -o vmail -g vmail -m 700 /var/vmail/example.comSchrijf /etc/dovecot/conf.d/99-local.conf:
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
auth_mechanisms = plain login
disable_plaintext_auth = yes
passdb {
driver = passwd-file
args = scheme=ARGON2ID username_format=%u /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}Maak een mailbox. Het commando vraagt tweemaal en schrijft een hash, nooit het wachtwoord zelf:
echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users5. rspamd en DKIM
Genereer de ondertekeningssleutel en publiceer daarna de publieke helft:
install -d -o _rspamd -g _rspamd -m 750 /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -b 2048 -d example.com -k /var/lib/rspamd/dkim/example.com.mail.key
chown _rspamd:_rspamd /var/lib/rspamd/dkim/example.com.mail.key
chmod 400 /var/lib/rspamd/dkim/example.com.mail.keyDat commando drukt een DNS-record af op de standaarduitvoer. Publiceer het als een TXT-record op mail._domainkey.example.com, precies zoals afgedrukt, met de geciteerde segmenten samengevoegd zoals je DNS-provider verwacht. Vertel daarna rspamd waar de sleutel leeft, in /etc/rspamd/local.d/dkim_signing.conf:
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;Bind de milter en stel een wachtwoord in voor de webinterface:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pwPlak de resulterende hash in /etc/rspamd/local.d/worker-controller.inc als password = "...". Bereik de interface via een SSH-tunnel in plaats van poort 11334 open te stellen voor de wereld.
6. Start alles
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failedVoeg een vernieuwingshook toe zodat een nieuw certificaat beide daemons bereikt:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.shVerifieer het
Drie tests. De eerste is lokaal, de tweede is degene die ertoe doet, de derde is degene die je van blocklists houdt.
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"Stuur daarna een bericht van je nieuwe server naar een mailbox die je bezit bij een grote webmailprovider, open het ontvangen bericht en lees de ruwe headers. Je zoekt naar één regel:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.comDrie keer geslaagd en je bent klaar. Een dkim=none betekent dat rspamd niet ondertekent, dus controleer rspamadm configdump dkim_signing. Een spf=fail betekent bijna altijd dat het bericht via IPv6 vertrok terwijl je SPF-record alleen het v4 MX-adres dekt.
Als laatste, bewijs dat je geen relay bent. Maak vanaf een andere machine verbinding en probeer mail te verzenden tussen twee domeinen die je niet bezit:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.comHet juiste resultaat is een afwijzing in de ontvangstfase: 554 5.7.1 Relay access denied. Al het andere betekent dat je een machine hebt geconfigureerd die binnen een dag zal worden misbruikt, en je moet stoppen en stap drie opnieuw lezen.
Daarna
Laat DMARC op p=none staan voor een week en lees de aggregatierapporten. Zodra ze alleen je eigen server tonen die je eigen mail ondertekent, ga je naar p=quarantine en vervolgens naar p=reject twee weken later. Voeg off-node back-up toe voor /var/vmail terwijl je bezig bent, want mail is het enige waarvan gebruikers nooit een tweede kopie hebben, en onze back-up add-on schrijft naar een andere site dan de instance.