1. SMTP: Transfer Poczty Między Serwerami
Prosty Protokół Transferu Poczty (Simple Mail Transfer Protocol, SMTP) jest protokołem warstwy aplikacji służącym do przesyłania poczty między programem pocztowym a serwerem zgłaszania wiadomości oraz między serwerami przekazującymi wiadomości w internecie. Definiuje polecenia, odpowiedzi i reguły transakcji używane, gdy serwer przyjmuje wiadomość do dostarczenia. SMTP opisuje transfer wiadomości, natomiast klient skrzynki korzysta z odrębnego protokołu do ich pobierania i odczytu. SMTP nie definiuje sposobu przechowywania skrzynki ani interfejsu użytkownika. Serwer odbiorczy może przyjąć, zakolejkować, przekazać lub odrzucić wiadomość zgodnie z lokalną polityką, dlatego pomyślna transakcja SMTP oznacza przyjęcie przez ten serwer, lecz nie potwierdza dotarcia do końcowej skrzynki.
Jego główną rolą jest obsługa wysyłania poczty. Po wybraniu polecenia "Wyślij" program pocztowy, czyli MUA, rozpoczyna transakcję SMTP i zgłasza wiadomość do MTA dostawcy. Ten MTA może następnie wystąpić jako klient SMTP i przekazać wiadomość do kolejnego MTA, aż trafi ona na serwer odpowiedzialny za skrzynkę odbiorcy. SMTP jest protokołem typu . Nie pobiera poczty do wyświetlenia. Typowe funkcje pobierania skrzynki zapewniają POP3 i IMAP. Na każdym etapie przekazywania MTA odbierający zwraca odpowiedź, która określa, czy nadawca może kontynuować, powinien spróbować później, czy zakończyć próbę. Wiadomość może pozostać w kolejce do czasu następnej próby dostarczenia.
2. Podstawowe Zasady Działania SMTP
SMTP wykorzystuje model klient-serwer, uporządkowany i niezawodny strumień transportowy, tekstowe polecenia z kodami odpowiedzi oraz przypisane porty usług.
- Architektura Klient-Serwer
SMTP działa w modelu klient-serwer. W każdej transakcji jedna maszyna inicjuje żądanie, a druga nasłuchuje i przyjmuje pocztę. Ten sam serwer może przy przekazywaniu pełnić każdą z tych ról:
- Wysyłanie (Submission): Twój program pocztowy (MUA) działa jako klient SMTP, łącząc się z serwerem poczty wychodzącej Twojego dostawcy (MTA), który działa jako serwer SMTP.
- Przekazywanie (Relay): Serwer pocztowy Twojego dostawcy (MTA) następnie działa jako klient SMTP, aby połączyć się z serwerem pocztowym odbiorcy (inny MTA), który w tej nowej transakcji pełni rolę serwera.
- Zależność od TCP w Celu Zapewnienia Niezawodności
SMTP zwykle działa w oparciu o Protokół Kontroli Transmisji (TCP). TCP zapewnia niezawodny, uporządkowany strumień bajtów oraz obsługuje numerowanie, wykrywanie błędów i retransmisję utraconych segmentów. Połączenie może jednak ulec awarii, dlatego SMTP interpretuje odpowiedzi, a kolejka pocztowa ponawia dostarczanie zgodnie ze swoją polityką. SMTP może zatem skupiać się na regułach transferu poczty, zamiast obsługiwać kolejność pakietów.
- Polecenia Tekstowe
Komunikacja między klientem a serwerem SMTP używa poleceń tekstowych i numerycznych kodów odpowiedzi. Polecenia takie jak HELO, MAIL FROM i RCPT TO korzystają ze składni ASCII, co ułatwia implementację oraz diagnostykę. Sesja Telnet może pokazać tę wymianę podczas testów, jeśli serwer na to pozwala, lecz sam Telnet nie zapewnia szyfrowania transportu.
- Wyznaczone Porty Komunikacyjne
Usługi SMTP korzystają z przypisanych portów o różnych rolach:
- Port 25: Klasyczny port do przekazywania poczty między serwerami (MTA-do-MTA). Wielu dostawców internetu ogranicza połączenia wychodzące na port 25 z sieci klientów indywidualnych, aby zmniejszyć nadużycia z zainfekowanych komputerów.
- Port 587: Standardowy port do zgłaszania wiadomości (MUA-do-MTA). Programy pocztowe często uwierzytelniają się na tym porcie i podnoszą ochronę przez STARTTLS, gdy serwer je reklamuje.
- Port 465: Zgłaszanie wiadomości z niejawnym TLS, czyli z rozpoczęciem TLS już przy ustanawianiu połączenia. RFC 8314 opisuje tę usługę. Port 465 jest używany obok portu 587 z STARTTLS.
3. Sesja SMTP
Transakcja SMTP to ustrukturyzowana rozmowa między klientem a serwerem. Poniższa sekwencja przedstawia typowe zgłoszenie lub przekazanie wiadomości.
- Ustanowienie połączenia
Najpierw maszyna klienta ustanawia połączenie TCP z serwerem na odpowiednim porcie (zwykle 587 do wysyłania lub 25 do przekazywania). Po nawiązaniu połączenia, serwer rozpoczyna konwersację, wysyłając komunikat gotowości, zazwyczaj zaczynający się kodem '220'.
Serwer: 220 poczta.przyklad.pl ESMTP Usługa gotowa - Identyfikacja klienta
Klient przedstawia się za pomocą polecenia 'EHLO' (dla rozszerzonego SMTP) lub starszego 'HELO', po którym następuje jego nazwa domenowa. 'EHLO' jest preferowane, ponieważ informuje serwer, że klient rozumie nowoczesne rozszerzenia SMTP.
Klient: EHLO klient.domena.plSerwer odpowiada serią kodów '250', potwierdzając powitanie i wymieniając wszystkie obsługiwane przez siebie rozszerzone funkcje, takie jak metody uwierzytelniania i limity rozmiaru wiadomości.
Serwer: 250-poczta.przyklad.pl Witaj klient.domena.pl
Serwer: 250-SIZE 52428800
Serwer: 250-AUTH LOGIN PLAIN
Serwer: 250-STARTTLS
Serwer: 250 HELP - Koperta transakcji pocztowej
Klient używa polecenia 'MAIL FROM', aby zadeklarować ścieżkę zwrotną, nazywaną także nadawcą koperty. Końcowy nagłówek Return-Path jest dodawany podczas dostarczania i nie należy go utożsamiać z widocznym nagłówkiem From.
Klient: MAIL FROM:<nadawca@przyklad.org>Serwer potwierdza, że można kontynuować.
Serwer: 250 OKNastępnie klient określa odbiorcę (odbiorców) za pomocą jednego lub więcej poleceń 'RCPT TO'.
Klient: RCPT TO:<odbiorca@przyklad.com>Serwer sprawdza, czy może przyjąć pocztę dla tego odbiorcy i odpowiada.
Serwer: 250 OK - Dane wiadomości
Po zaakceptowaniu ścieżki zwrotnej i odbiorców klient sygnalizuje, że wyśle dane wiadomości, za pomocą polecenia 'DATA'.
Klient: DATASerwer daje zielone światło za pomocą kodu odpowiedzi '354'.
Serwer: 354 Zakończ dane wpisując <CR><LF>.<CR><LF>Klient wysyła następnie treść e-maila jako blok tekstu. Obejmuje on nagłówki (takie jak 'From:', 'To:', 'Subject:' i 'Date:'), pustą linię oraz treśćwiadomości. Blok danych SMTP kończy sekwencja <CRLF>.<CRLF>, pokazana w przykładzie jako kropka w osobnej linii.
Klient: Subject: Spotkanie jutro
Klient: From: Nadawca <nadawca@przyklad.org>
Klient: To: Odbiorca <odbiorca@przyklad.com>
Klient:
Klient: Cześć,
Klient: Czy nasze jutrzejsze spotkanie o 10:00 jest aktualne?
Klient: Dzięki.
Klient: .Serwer potwierdza, że otrzymał wiadomość i przyjął ją do dostarczenia.
Serwer: 250 OK: zakolejkowano jako 12345 - Zakończenie sesji
Na koniec klient kończy połączenie w sposób uporządkowany za pomocą polecenia 'QUIT'.
Klient: QUITSerwer potwierdza i zamyka połączenie.
Serwer: 221 Do widzenia
4. Kody Odpowiedzi SMTP
Każda odpowiedź SMTP zawiera trzycyfrowy kod. Pierwsza cyfra wskazuje ogólny wynik, co pomaga klientowi i administratorowi diagnozować transakcję oraz zdecydować, czy dostarczenie można ponowić.
- 2xx - Sukces: Kody zaczynające się od '2' oznaczają sukces. Żądana akcja została pomyślnie zakończona. Na przykład, '250 OK' to najczęstszy kod sukcesu.
- 3xx - Odpowiedź Pośrednia: Kody zaczynające się od '3' to odpowiedzi pośrednie. Wskazują, że polecenie zostało zaakceptowane, ale serwer potrzebuje więcej informacji od klienta, aby zakończyć akcję. Najlepszym przykładem jest '354', który serwer wysyła po poleceniu 'DATA', aby poinformować klienta, że może zacząć wysyłać treść wiadomości.
- 4xx - Błąd Tymczasowy: Kody zaczynające się od '4' wskazują na błąd tymczasowy. Serwer nie był w stanie w tej chwili zrealizować żądania, ale problem może być przejściowy. Klient powinien spróbować wysłać wiadomość ponownie później. Jest to znane jako . Przykłady to '421 Usługa niedostępna' lub '452 Żądana akcja nie została wykonana: niewystarczająca ilość pamięci systemowej'.
- 5xx - Błąd Stały: Kody zaczynające się od '5' oznaczają stały, fatalny błąd. Serwer nie może zrealizować żądania w podanej postaci, a klient nie powinien powtarzać dokładnie tego żądania w tej samej sekwencji bez usunięcia przyczyny. Jest to znane jako . Przykłady to '550 Nie ma tu takiego użytkownika' lub '501 Błąd składni w parametrach lub argumentach'.
5. Rozszerzenia Bezpieczeństwa SMTP
Bazowy SMTP sam nie szyfruje ruchu ani nie uwierzytelnia użytkownika zgłaszającego wiadomość. Rozszerzenia ESMTP dodają uwierzytelnianie, negocjację TLS i kontrole domenowe używane przez współczesne systemy pocztowe.
- Uwierzytelnianie SMTP (SMTP-AUTH)
Otwarty przekaźnik przyjmuje i przekazuje pocztę bez ograniczenia nadawcy, co umożliwia nadużycia. SMTP AUTH pozwala klientowi uwierzytelnić się za pomocą mechanizmu SASL ogłoszonego w odpowiedzi serwera na 'EHLO'. Niektóre mechanizmy używają nazwy użytkownika i hasła, inne korzystają z odmiennych wymian poświadczeń. Serwer może wymagać poprawnego uwierzytelnienia przed przyjęciem zgłoszenia.
- Transport Layer Security (STARTTLS)
SMTP może rozpocząć wymianę jako protokół tekstowy, dlatego poświadczenia i dane wiadomości wymagają dodatkowej warstwy ochrony. Rozszerzenie STARTTLS podnosi ochronę połączenia do szyfrowanego kanału z użyciem . Proces działa następująco:
- Klient łączy się z serwerem na standardowym porcie (np. 587).
- Klient wysyła polecenie 'EHLO' i widzi, że serwer obsługuje STARTTLS.
- Klient wysyła polecenie 'STARTTLS'.
- Serwer i klient wykonują uzgodnienie TLS (TLS handshake), aby ustanowić szyfrowany tunel.
- Po pomyślnym uzgodnieniu TLS oraz sprawdzeniu certyfikatu lub polityki klient i serwer ponownie wysyłają EHLO, a kolejne polecenia SMTP trafiają przez chroniony kanał.
- Zapobieganie Spamu i Nadużyciom
Oprócz uwierzytelniania, nowoczesne serwery pocztowe używają pakietu innych technologii, które współpracują z SMTP w celu weryfikacji legalności przychodzącej poczty. Należą do nich:
- SPF (Sender Policy Framework): Pozwala właścicielowi domeny opublikować listę serwerów, które są upoważnione do wysyłania e-maili w imieniu tej domeny.
- DKIM (DomainKeys Identified Mail): Dodaje podpis cyfrowy związany z domeną, pozwalając serwerowi odbiorczemu sprawdzić, czy podpisana treść i wybrane nagłówki nie zostały zmienione. Sam DKIM nie rozstrzyga wszystkich aspektów autoryzacji nadawcy.
- DMARC (Domain-based Message Authentication, Reporting, and Conformance): Stosuje reguły zgodności domen dla SPF i DKIM oraz pozwala domenie opublikować politykę dla nieudanych kontroli, na przykład brak działania, kwarantannę albo odrzucenie.