Wszystkie posty
devops

Własny serwer mailowy: Postfix + Dovecot + SPF/DKIM/DMARC na Debianie 12

Pełny tutorial postawienia własnego serwera mailowego na Debian 12 z Postfix, Dovecot, OpenDKIM, SPF i DMARC. Konfiguracja krok po kroku, troubleshoot, realne pułapki.

6 min czytaniaAktualizacja: 30 czerwca 2026

Własny serwer mailowy to dziś rzadkość. Google Workspace i Microsoft 365 są tanie i bezpieczne — dla 90% ludzi to lepszy wybór. Ale są sytuacje, gdy własny serwer ma sens: regulacje RODO, custom integracje, duża skala. Ten post to kompletny tutorial, z którym postawisz serwer w 4-6h.

Wymagania wstępne

  • Serwer Debian 12 (lub Ubuntu 24.04) z publicznym IPv4
  • Domena ze skonfigurowanym NS (własny nameserver lub zarządzany)
  • Reverse DNS (PTR) — musisz mieć możliwość jego ustawienia (DigitalOcean, Hetzner, OVH — tak; tani hosting — często nie)
  • Otwarte porty: 25 (SMTP), 587 (submission), 993 (IMAPS)

PTR record to krytyczna sprawa. Bez niego Twoje maile trafiają do spamu. Sprawdź zanim zaczniesz:

Terminal window
# Sprawdź reverse DNS
dig -x 1.2.3.4 +short
# Powinno zwrócić np. "mail.example.com"

Jeśli zwraca coś innego (np. “static.1-2-3-4.provider.com”) — napisz do supportu providera i poproś o zmianę PTR.

Instalacja pakietów

Terminal window
sudo apt update
sudo apt install postfix postfix-policyd-spf-python \
dovecot-core dovecot-imapd dovecot-lmtpd \
opendkim opendkim-tools \
certbot

Podczas instalacji Postfix zapyta o:

  • General type: Internet Site
  • System mail name: example.com (twoja domena)

Konfiguracja Postfix

main.cf

Edytuj /etc/postfix/main.cf:

/etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
# Hostname i domena
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# Sieć
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = all
inet_protocols = ipv4
# SASL (dla klientów pocztowych)
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
# TLS (szyfrowanie)
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_tls_security_level = encrypt
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_ciphers = high
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, SRP, DSS, AECDH, ADH
# Ograniczenia antyspamowe
smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service unix:private/policyd-spf
# Relay restrictions (krytyczne - chroni przed open relay)
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
# Alias
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
virtual_mailbox_maps = hash:/etc/postfix/virtual
virtual_mailbox_domains = example.com
virtual_transport = lmtp:unix:private/dovecot-lmtp

Kluczowe ustawienia, które robią różnicę:

  • smtpd_relay_restrictions z defer_unauth_destination — chroni przed open relay. NIGDY nie usuwaj tego. Testuj konfigurację na https://www.mail-tester.com.

  • smtpd_tls_protocols z wykluczeniem starych TLS — bez tego serwer akceptuje SSLv3 (podatny na POODLE). Wykluczenie !TLSv1.1 i starszych = bezpieczeństwo.

  • check_policy_service unix:private/policyd-spf — włącza sprawdzanie SPF (o tym za chwilę).

master.cf

Dodaj do /etc/postfix/master.cf (na końcu):

# Dovecot SASL
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# PolicyD SPF
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf

Weryfikacja Postfix

Terminal window
# Sprawdź składnię
sudo postfix check
# Przeładuj konfigurację
sudo systemctl reload postfix
# Sprawdź status
sudo systemctl status postfix

Konfiguracja Dovecot

/etc/dovecot/dovecot.conf

Terminal window
protocols = imap lmtp
listen = *, ::

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

Terminal window
mail_location = maildir:~/Maildir
mail_privileged_group = mail

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

Terminal window
disable_plaintext_auth = yes
auth_mechanisms = plain login

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

Terminal window
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}

Tworzenie użytkownika

Terminal window
# Użytkownik systemowy (bez /bin/sh dla bezpieczeństwa)
sudo useradd -m -s /usr/sbin/nologin jan
sudo passwd jan

Hasło to zarazem hasło do IMAP/SMTP. Dla większego bezpieczeństwa użyj virtual users (patrz: dalsza rozbudowa), ale to poza zakresem tego tutoriala.

Konfiguracja OpenDKIM

DKIM podpisuje każdą wiadomość kryptograficznie. Bez niego Gmail i inni traktują Cię podejrzliwie.

Generowanie kluczy

Terminal window
sudo mkdir -p /etc/opendkim/keys/example.com
cd /etc/opendkim/keys/example.com
sudo opendkim-genkey -s default -d example.com
sudo chown opendkim:opendkim default.private default.txt

/etc/opendkim.conf

/etc/opendkim.conf
Domain example.com
KeyFile /etc/opendkim/keys/example.com/default.private
Selector default
# Standard
Canonicalization relaxed/simple
Mode sv
SubDomains no
AutoRestart yes
AutoRestartRate 10/1M
Background yes
DNSTimeout 5
UserID opendkim:opendkim
# Socket
Socket inet:12301@localhost

/etc/default/opendkim

Terminal window
SOCKET="inet:12301@localhost"

Dodanie do Postfix

W /etc/postfix/main.cf dodaj:

Terminal window
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

Restart i test

Terminal window
sudo systemctl restart opendkim
sudo systemctl restart postfix

DNS Records

Dodaj następujące rekordy w DNS domeny:

A record dla mail.example.com

mail.example.com. 3600 A 1.2.3.4

MX record

example.com. 3600 MX 10 mail.example.com.

SPF record (TXT)

example.com. 3600 TXT "v=spf1 mx ~all"

~all oznacza soft fail — maile z innych serwerów są podejrzane, ale nie odrzucane. Bezpieczniejsze niż -all na początku.

DKIM record (TXT)

Pobierz klucz publiczny:

Terminal window
sudo cat /etc/opendkim/keys/example.com/default.txt

Dodaj do DNS:

default._domainkey.example.com. 3600 TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSq..."

DMARC record (TXT)

_dmarc.example.com. 3600 TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; pct=100"

p=quarantine oznacza: jeśli SPF+DKIM fail, mail trafia do spamu. rua= to adres do raportów (kto próbuje podszywać się pod Twoją domenę).

SSL/TLS z Let’s Encrypt

Terminal window
# Stop Postfix/Dovecot temporarily (potrzebny port 80)
sudo systemctl stop postfix dovecot
# Pobierz cert
sudo certbot certonly --standalone -d mail.example.com
# Start usługi
sudo systemctl start postfix dovecot
# Test auto-renewal
sudo certbot renew --dry-run

Certbot automatycznie odnowi certyfikat (skrypt w /etc/cron.d/certbot). Postfix i Dovecot automatycznie użyją nowego certyfikatu po restarcie — warto dodać do crona:

/etc/cron.d/postfix-reload-after-certbot
0 3 1 * * /usr/bin/systemctl reload postfix dovecot

Testowanie

1. mail-tester.com

Wyślij maila z jan@example.com na adres podany na mail-tester.com. Powinien dostać 9+/10. Jeśli <7 — masz coś źle.

2. Wysyłka na Gmail

Wyślij maila na swoje konto Gmail. Sprawdź Show original — powinny być:

  • SPF: PASS
  • DKIM: PASS
  • DMARC: PASS

3. Wysyłka na własny adres

Terminal window
# Sprawdź czy mail dochodzi lokalnie
echo "Test" | mail -s "Test" jan@example.com
mailq # kolejka
sudo tail -f /var/log/mail.log # logi

4. Test TLS

Terminal window
# Sprawdź czy submission używa TLS
openssl s_client -connect mail.example.com:587 -starttls smtp

Troubleshooting

Mail nie dochodzi, logi: “relay denied”

smtpd_relay_restrictions nie pozwala. Sprawdź czy klient się autoryzuje (SASL).

SPF=neutral mimo rekordu

Częsty błąd: PTR wskazuje na 1-2-3-4.provider.com zamiast mail.example.com. Bez prawidłowego reverse DNS SPF nie przejdzie.

DKIM=FAIL

Klucz publiczny w DNS nie zgadza się z prywatnym. Sprawdź:

Terminal window
# Lokalny klucz
sudo cat /etc/opendkim/keys/example.com/default.private | head -1
# DNS
dig TXT default._domainkey.example.com +short

Maile trafiają do spamu mimo 10/10 na mail-tester

Dwa powody:

  1. Nowa domena — Gmail/Outlook traktują nowe domeny podejrzanie przez pierwsze 2-4 tygodnie. Rozwiązanie: wysyłaj regularnie prawidłowe maile, “rozgrzej” domenę.
  2. Treść maila — za dużo linków, brak tekstu alternatywnego, capital letters w subject. Popraw treść.

Hardening produkcyjny

  1. Fail2ban — automatyczny ban IP po 3 nieudanych próbach logowania:

    Terminal window
    sudo apt install fail2ban
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    # Włącz jail dla postfix i dovecot
    sudo systemctl enable --now fail2ban
  2. Postscreen — Postfix ma wbudowany anti-spam. Dodaj do master.cf:

    smtpd pass - - - - - smtpd
    -o smtpd_proxy_filter=127.0.0.1:10025
  3. Monitoring — Prometheus + Grafana + node_exporter dla metryk systemowych, sprawdzanie kolejki Postfix cronem.

  4. Backup konfiguracji/etc/postfix/, /etc/dovecot/, /etc/opendkim/. Bez tego po awarii odtwarzanie zajmuje 6h.

Co dalej

Jeśli potrzebujesz postawienia serwera mailowego w polskiej chmurze (DigitalOcean, Hetzner) z pełną konfiguracją SPF/DKIM/DMARC i monitoringiem — napisz do mnie. Robota na 1-2 dni, koszt od 1500 PLN.

Tagi:#linux#postfix#dovecot#mail#dkim

Najczęściej zadawane pytania

Czy warto stawiać własny serwer mailowy w 2025?
Dla większości przypadków NIE – Google Workspace ($6/user/m) lub Microsoft 365 ($6/user/m) są tańsze i bezpieczniejsze. Własny serwer ma sens gdy: (1) regulacje (RODO dla danych medycznych) wymagają hostingu w Polsce/UE, (2) potrzebujesz niestandardowych integracji (custom autorespondery, auto-archive), (3) masz >100 skrzynek i chcesz obniżyć koszty. Dla 1-5 skrzynek – nie warto.
Dlaczego mój mail trafia do spamu mimo poprawnej konfiguracji?
Trzy najczęstsze powody: (1) brak lub błędny PTR record (reverse DNS) – IP musi wskazywać na hostname serwera, (2) IP na blacklistach (Spamhaus, Spamcop) – sprawdź mxtoolbox.com, (3) brak DMARC rekordu lub polityka 'p=none' gdy powinna być 'quarantine'. W 80% przypadków jeden z tych trzech. Reszta to 20% (treść maila, za dużo linków, brak tekstu alternatywnego).
Czy potrzebuję IPv6 dla serwera mailowego?
Nie jest krytyczne, ale pomaga. W 2025 ok. 30-40% ruchu mailowego idzie po IPv6. Brak IPv6 = niektóre serwery (głównie chińskie, ale też część europejskich) traktują Cię jako 'mniej poważny nadawca'. Jeśli Twój provider daje IPv6 – włącz. Jeśli nie – działa i bez, ale konfiguruj mniej optymalnie.
Jak zabezpieczyć Postfix przed open relay?
Domyślnie Postfix na Debianie ma 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination' – to blokuje open relay. NIGDY nie ustawiaj 'smtpd_relay_restrictions = permit' ani nie kasuj 'defer_unauth_destination'. Test: po konfiguracji sprawdź na https://www.mail-tester.com (wynik powinien być 9+/10).

Powiązane posty

MAHAWIR IWANOWSKI · WROCŁAW

Przyszłość organizacji — budowana tam, gdzie psychologia spotyka inżynierię, renderowana w kodzie, dostarczana z intencją.

Przyszłość Organizacji w Kodzie

AI · Fullstack · Psychology

© 2026 Mahawir Iwanowski · Wszystkie prawa zastrzeżone.