Co to buduje
Kompletny serwer poczty dla jednej domeny: Postfix dla transportu, Dovecot dla IMAP i lokalnego dostarczania, rspamd dla filtrowania i podpisywania DKIM oraz trzy rekordy DNS, które decydują, czy duzi odbiorcy umieszczą Twoją pocztę w skrzynce odbiorczej, czy w folderze, którego nikt nie otwiera. Wysyła, odbiera, uwierzytelnia i nie jest otwartym przekaźnikiem.
Prowadzenie własnej poczty to niemodna rada i w większości słusznie. Najtrudniejsza jest dostarczalność, a nie oprogramowanie. Jeśli źle skonfigurujesz DNS, nawet najlepiej skonfigurowany Postfix na świecie będzie wysyłał wiadomości w próżnię.
Zanim zaczniesz
- R-8 lub większy. Filtrowanie jest obciążające dla CPU, a rspamd chętnie wykorzysta każdy rdzeń podczas fali spamu.
- Domena, której DNS kontrolujesz, oraz cierpliwość do propagacji.
- Odwrotny DNS ustawiony na adresie instancji na nazwę hosta pocztowego. Można go edytować w panelu i jest obowiązkowy: odbiorcy odrzucają nadawców, których nie można rozwiązać.
- Jeden bilet do wsparcia z pytaniem, czy port wychodzący 25 jest otwarty na Twojej instancji. Zapytaj przed rozpoczęciem, a nie po.
mail.example.comw całym tekście. Zastąp własnymi.
1. Nazwa hosta i DNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -yOpublikuj te rekordy teraz, ponieważ krok certyfikatu potrzebuje rekordu A, a krok podpisywania potrzebuje miejsca na klucz. Wartości w tabeli opisują, co każdy rekord robi, a nie co wkleić.
| Rekord | Nazwa | Zawartość |
|---|---|---|
| A / AAAA | mail | Adresy instancji z panelu |
| 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 | adres instancji | mail.example.com — ustaw w panelu |
Rekord SPF mówi: moje serwery MX wysyłają moją pocztę, wszystko inne jest sfałszowane. Twarda porażka zamiast miękkiej, ponieważ ~all zachęca odbiorców do podjęcia własnej decyzji, a ich decyzja nie będzie hojna. DMARC zaczyna się od p=none, abyś przez tydzień zbierał raporty, zanim cokolwiek zostanie odrzucone w Twoim imieniu.
2. Certyfikaty
apt install -y certbot
certbot certonly --standalone -d mail.example.comNa porcie 80 nic jeszcze nie nasłuchuje, więc tryb standalone jest najprostszą ścieżką. Haki odnawiania pojawią się na końcu, gdy będą już demony do przeładowania.
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-serverTeraz ustaw konfigurację transportu. Każda poniższa linia jest celowa; postconf zapisuje je na miejscu, więc nie ma edytora do zepsucia:
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"Najważniejsza linia to smtpd_relay_restrictions. Kończy się na reject_unauth_destination, co powstrzymuje cały internet przed używaniem Twojej maszyny do wysyłania swojej poczty. Otwarty przekaźnik spowoduje umieszczenie Cię na listach ostrzegawczych w ciągu kilku godzin i jest naruszeniem polityki dopuszczalnego użytkowania.
Włącz port submission, aby Twoi klienci mogli wysyłać, z wymaganym uwierzytelnianiem i bez dostępu anonimowego:
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
Skrzynki w formacie Maildir pod jednym użytkownikiem systemowym utrzymują tę instalację w małych rozmiarach. Utwórz użytkownika i magazyn:
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.comZapisz /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
}
}Utwórz skrzynkę. Polecenie pyta dwa razy i zapisuje hash, nigdy samo hasło:
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 i DKIM
Wygeneruj klucz podpisujący, a następnie opublikuj część publiczną:
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.keyTo polecenie wypisuje rekord DNS na standardowe wyjście. Opublikuj go jako rekord TXT pod mail._domainkey.example.com, dokładnie tak, jak wydrukowano, z połączonymi segmentami w cudzysłowie w sposób, jakiego oczekuje Twój dostawca DNS. Następnie powiedz rspamdowi, gdzie znajduje się klucz, w /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;Podłącz milter i ustaw hasło dla interfejsu webowego:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pwWklej wynikowy hash do /etc/rspamd/local.d/worker-controller.inc jako password = "...". Uzyskaj dostęp do interfejsu przez tunel SSH, zamiast otwierać port 11334 na świat.
6. Uruchom wszystko
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failedDodaj hak odnawiania, aby nowy certyfikat dotarł do obu demonów:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.shZweryfikuj to
Trzy testy. Pierwszy jest lokalny, drugi jest tym, który się liczy, trzeci to ten, który trzyma Cię z dala od list ostrzegawczych.
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"Następnie wyślij wiadomość ze swojego nowego serwera na skrzynkę, którą posiadasz u dużego dostawcy poczty webowej, otwórz otrzymaną wiadomość i przeczytaj jej surowe nagłówki. Szukasz jednej linii:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.comTrzy zaliczone i gotowe. dkim=none oznacza, że rspamd nie podpisuje, więc sprawdź rspamadm configdump dkim_signing. spf=fail prawie zawsze oznacza, że wiadomość wyszła przez IPv6, podczas gdy Twój rekord SPF obejmuje tylko adres MX v4.
Na koniec udowodnij, że nie jesteś przekaźnikiem. Z dowolnej innej maszyny połącz się i spróbuj wysłać pocztę między dwiema domenami, których nie posiadasz:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.comPoprawnym wynikiem jest odrzucenie na etapie odbiorcy: 554 5.7.1 Relay access denied. Cokolwiek innego oznacza, że skonfigurowałeś maszynę, która zostanie wykorzystana w ciągu dnia, i powinieneś się zatrzymać i przeczytać ponownie krok trzeci.
Później
Pozostaw DMARC na p=none przez tydzień i czytaj raporty zbiorcze. Gdy pokażą, że tylko Twój serwer podpisuje Twoją pocztę, przejdź na p=quarantine, a następnie na p=reject dwa tygodnie później. Dodaj kopię zapasową poza węzłem dla /var/vmail przy okazji, ponieważ poczta to jedyna rzecz, której użytkownicy nigdy nie mają drugiej kopii, a nasz dodatek do kopii zapasowych zapisuje w innej lokalizacji niż instancja.