Restrykcje tworzymy w tym celu, aby nasz serwer SMTP nie był tzw. serwerem OpenRelay-em, czyli uniemożliwiamy wysyłanie wiadomości z hostów nie będących członkami naszej sieci oraz użytkowników bez wcześniejszej autoryzacji itd.
Aby zrozumieć jak działają restrykcje (tzn. na jakim poziomie sesji SMTP są weryfikowane i ich kolejność) należy zrozumieć samą sesję SMTP. Poniżej przedstawiono przykład takiej sesji z zaznaczeniem odpowiednich restrykcji, które możemy wykorzystać w konfiguracji Postfix-a:
220 mail.moja-domena.pl ESMTP Postfix # <-smtpd_client_restrictions
EHLO mail.moja-domena.pl # <-smtpd_helo_restrictions
250 mail.moja-domena.com #
MAIL FROM: # <-smtpd_sender_restrictions
250 2.1.0 Ok #
RCPT TO: # <-smtpd_recipient_restrictions
250 2.1.5 Ok #
DATA # <-smtpd_data_restrictions
354 End data with . #
To: # <-header_checks
From: #
Subject:SMTP Test #
This is a test message # <-body_checks
rn
Na najwyższm poziomie mamy restrykcję dotyczącą klienta nawiązującego połączenie (smtpd_client_restrictions). Poniżej smtpd_helo_restrictions (jak "przedstawia" się klient nawiązujący połączenie). Następne smtpd_sender_restrictions (MAIL FROM), czyli restrykcje dotyczące wysyłającego oraz smtpd_recipient_restrictions (RCPT TO) do kogo wiadomość zostaje przesłana. Kolejna restrykcja to smtpd_data_restrictions. Następna header_checks analizuje nagłówki wiadomości (np. temat – subject), a kolejna body_checks treść tej wiadomości (np. pod kątem zawartości słów niedozwolonych itp.).
Przykłady restrykcji:
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
W powyższym przypadku dopuszczaj połączenia z sieci wyszczególnionych w zmiennej konfiguracyjnej mynetworks oraz odrzuć hosty których brak w DNS. W przypadku poprawnej weryfikacji przejdź do sprawdzenia następnej restrykcji dotyczącej EHLO.
smtpd_helo_required = yes # wymagaj helo / ehlo. Ta opcja mówi, że jeżeli klient nie poda nic więcej po EHLO natychmiast zakończ połączenie.
smtp_helo_restrictions = permit_mynetworks, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, permit
reject_non_fqdn_helo_hostname – odrzuć połączenia od hostów, które w ehlo nie podały w pełni kwalifikowaną nazwę hosta (FQDN)
reject_invalid_helo_hostname – odrzuć połączenia klienta z niepoprawną nazwą hosta w ehlo.
permit – wyjdź z bieżącego łańcucha restrykcji i przejdź do sprawdzania kolejnego (jeżeli występuje).
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain
permit_sasl_authenticated – pozwolenie wysłania wiadomości tylko dla istniejącego użytkownika (po uprzedniej poprawnej autoryzacji).
reject_unknown_sender_domain – odrzucaj nadawcę jeżeli po znaku @ brakuje wyszczególnionej domeny lub tej domeny nie ma w DNS. Pamiętaj, że jeżeli to dotyczy użytkowników lokalnych wcale nie muszą podawać pełnej nazwy jeżeli ustawimy opcję myorgin.
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unknown_recipient_domain, reject_non_fqdn_recipient, reject_rbl_client zen.spamhaus.org
reject_unauth_destination – odrzuć połączenie nie sprawdzając pozostałych ograniczeń, jeżeli nasz serwer nie jest serwerem docelowym
reject_unknown_recipient_domain – odrzuć jeżeli adres docelowy nie istnieje w DNS
reject_non_fqdn_recipient – odrzuć jeżeli adres odbiorcy nie jest podany w postaci pełnokwalifikowanej (FQDN)
reject_rbl_client zen.spamhaus.org – odrzuć adresy które znajdują się na liście spamerów – RBL (w tym przypadku zen.spamhaus.org).
rn
Sprawdźmy działanie przykładowej restrykcji. W sesji telnet pominiemy ehlo i spróbujemy wysłać maila. Poniżej wynik testu:
telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is '^]'.
220 SMTP server
mail from: pkania@moja-domena.pl
503 5.5.1 Error: send HELO/EHLO first
quit