Zablokowany port 25 na VPS? Jak mimo to wysyłać maile

Jeśli Twój VPS nie wysyła maili, najpewniej dostawca chmury zablokował wychodzący port 25 — i u większości z nich blokada zostaje, dopóki nie poprosisz o jej zdjęcie, a czasem nie da się jej zdjąć wcale. Rozwiązanie, które działa praktycznie wszędzie, to rezygnacja z bezpośredniej wysyłki z serwera i przekazywanie poczty do uwierzytelnionego przekaźnika SMTP (relay) na porcie 587, 465 albo 2525. Port 25 jest Ci potrzebny tylko wtedy, gdy uruchamiasz własny serwer MTA, który doręcza pocztę prosto do serwerów odbiorców.
nc -vz -w 5 gmail-smtp-in.l.google.com 25: przekroczony czas oznacza, że port 25 jest filtrowany. DigitalOcean blokuje porty 25, 465 i 587 na każdym Droplecie; Hetzner Cloud blokuje 25 i 465, ale zostawia otwarty 587; AWS, Google Cloud, Azure (poza umowami enterprise) i Vultr domyślnie blokują 25. Wysyłaj przez relay, np. Amazon SES albo Mailgun, na porcie 587 (lub 2525/2587, gdy 587 też jest zamknięty), albo poproś o odblokowanie, jeśli naprawdę potrzebujesz bezpośredniego doręczania. Sam otwarty port nie wystarczy do skrzynki odbiorczej: potrzebujesz jeszcze PTR, SPF, DKIM, DMARC i rozgrzanego adresu IP.Jak sprawdzić, czy port 25 jest zablokowany na VPS?
Otwórz z serwera połączenie TCP do prawdziwego serwera pocztowego (MX) na porcie 25: powitanie 220 oznacza, że port jest otwarty, a przekroczony czas — że ruch odrzuca dostawca albo Twój własny firewall. Ten sam test zrób dla swojego przekaźnika na portach 587 i 465, żeby przed zmianą konfiguracji wiedzieć, która droga jest dostępna.
Krok 1: znajdź serwer MX do testu
# rekordy MX dużego dostawcy poczty
dig +short MX gmail.com
# 5 gmail-smtp-in.l.google.com.
# 10 alt1.gmail-smtp-in.l.google.com.
# ...
Krok 2: sprawdź wychodzący port 25
# netcat: -v szczegóły, -z tylko połączenie, -w 5 rezygnacja po 5 sekundach
nc -vz -w 5 gmail-smtp-in.l.google.com 25
# bez netcata: odczyt powitania SMTP przez /dev/tcp w bashu
timeout 10 bash -c 'exec 3<>/dev/tcp/gmail-smtp-in.l.google.com/25 && head -1 <&3' || echo "port 25 is blocked"
Jak czytać wynik:
| Co widzisz | Co to znaczy | Co dalej |
|---|---|---|
220 mx.google.com ESMTP … | Port 25 jest otwarty na całej trasie | Bezpośrednie doręczanie jest możliwe; sprawdź PTR i reputację |
Zawieszenie, potem timed out | Pakiety są po cichu odrzucane — typowa blokada dostawcy | Sprawdź zasady dostawcy poniżej i własne reguły ruchu wychodzącego |
Connection refused | Coś aktywnie odrzuca połączenie (często lokalny firewall albo proxy) | Sprawdź ufw/nftables i ewentualne proxy |
Name or service not known | Problem z DNS, nie z portem | Najpierw napraw resolver |
Krok 3: sprawdź relay na portach submission
Porty do wysyłki przez dostawcę (submission) używają TLS, więc testuj je narzędziem openssl s_client. Port 587 zaczyna jawnym tekstem i przechodzi na szyfrowanie przez STARTTLS; port 465 szyfruje od pierwszego bajtu.
# 587 ze STARTTLS (Amazon SES, przykładowo endpoint eu-west-1)
openssl s_client -starttls smtp -connect email-smtp.eu-west-1.amazonaws.com:587 -crlf -quiet
# oczekuj łańcucha certyfikatów i linii "250 ..."; wyjdź poleceniem QUIT
# 465 z TLS od początku połączenia
openssl s_client -connect email-smtp.eu-west-1.amazonaws.com:465 -crlf -quiet
# porty zastępcze, gdy 587 i 465 też są zablokowane (np. DigitalOcean)
nc -vz -w 5 email-smtp.eu-west-1.amazonaws.com 2587
nc -vz -w 5 smtp.mailgun.org 2525
💡 Wskazówka: Każdy test wykonaj dwa razy: znc -4i znc -6. Dostawcy potrafią inaczej filtrować IPv4 i IPv6, a Twój MTA chętnie spróbuje najpierw rekordu AAAA.
Którzy dostawcy chmury blokują port 25?
Większość dużych chmur domyślnie blokuje wychodzący port 25 na nowych serwerach, a różnią się głównie tym, czy da się blokadę zdjąć. Najostrzejszy jest DigitalOcean, bo blokuje też porty 465 i 587; Hetzner Cloud i Vultr rozpatrują prośby indywidualnie; AWS ma formularz; Google Cloud sam zdejmuje blokadę w projekcie, który uzna za mało ryzykowny.
| Dostawca | Wychodzący 25 domyślnie | 465 / 587 | Czy da się odblokować? |
|---|---|---|---|
| DigitalOcean (Droplety) | ✗ Zablokowany | ✗ Oba zablokowane, także przez Reserved IP | Dokumentacja nie opisuje odblokowania i zaleca zewnętrzną usługę pocztową (DigitalOcean) |
| Hetzner Cloud | ✗ Zablokowany | 465 zablokowany, ✓ 587 otwarty | ~ Po miesiącu i opłaceniu pierwszej faktury, przez „limit request” w Hetzner Console, decyzja indywidualna (Hetzner) |
| AWS EC2 i Lambda | ✗ Zablokowany, chyba że konto jest na liście dozwolonych | ✓ Otwarte | ~ Formularz, osobna prośba dla każdego regionu (AWS) |
| Google Cloud Compute Engine | ✗ Zablokowany do adresów zewnętrznych | ✓ Wyłączone z blokady | ~ Zdejmowana automatycznie, gdy Google uzna projekt za mało ryzykowny; stan pokazuje baner na stronie VPC networks (Google Cloud) |
| Azure (maszyny wirtualne) | ✓ Otwarty przy Enterprise Agreement i MCA-E; ✗ zablokowany przy pozostałych typach subskrypcji | ✓ 587 do uwierzytelnionych przekaźników bez ograniczeń | Enterprise Dev/Test: samodzielne zwolnienie w Diagnose and Solve; pozostałe: relay (Microsoft) |
| Vultr | ✗ Zablokowany na nowych instancjach | ✓ Otwarte | ~ Zgłoszenie do supportu z opisem zastosowania, SPF/DKIM, limitów i wolumenu; bez gwarancji (Vultr) |
Stan na listopad 2026, sprawdzony w dokumentacji każdego dostawcy 12 listopada 2026. Zasady się zmieniają — zanim zaufasz tej tabeli, zrób test z poprzedniej sekcji.
Mniejsi i polscy dostawcy (np. OVH, home.pl, nazwa.pl) mają własne reguły i nie zawsze je publikują. Jeśli bezpośrednie doręczanie jest dla Ciebie warunkiem koniecznym, zapytaj przed zakupem i zrób test nc pierwszego dnia.
Port 25, 587, 465 czy 2525: do czego służy każdy z nich?
Port 25 służy do doręczania między serwerami: Twój MTA łączy się z serwerem MX odbiorcy i przekazuje wiadomość bez logowania. Porty 587 i 465 służą do nadawania (submission): aplikacja albo klient poczty loguje się u swojego dostawcy, a ten doręcza wiadomość na porcie 25 ze swoich adresów o ustalonej reputacji. Port 2525 (oraz 2587/2465 w Amazon SES) to nieoficjalna alternatywa, którą przekaźniki udostępniają sieciom blokującym porty standardowe.
Nadawanie (submission) to uwierzytelnione przekazanie poczty z aplikacji do usługi pocztowej (587/465). Przekazywanie (relay) to wysyłka tej poczty przez usługę w Twoim imieniu. Doręczanie to ostatni krok SMTP do serwera MX odbiorcy na porcie 25. Gdy port 25 jest zablokowany, zostawiasz u siebie nadawanie, a doręczanie zlecasz.
| Port | Zastosowanie | Szyfrowanie | Logowanie |
|---|---|---|---|
| 25 | Doręczanie MTA → MX (przekaźniki też go przyjmują) | Opcjonalny STARTTLS | Brak wobec MX |
| 587 | Nadawanie do dostawcy | STARTTLS | Wymagane |
| 465 | Nadawanie z TLS od początku | TLS od pierwszego bajtu | Wymagane |
| 2525 / 2587 / 2465 | Zastępcze porty nadawania u części przekaźników | STARTTLS (2525, 2587) albo TLS (2465) | Wymagane |
Amazon SES przyjmuje STARTTLS na portach 25, 587 i 2587 oraz TLS Wrapper na 465 i 2465 (dokumentacja AWS SES); Mailgun przyjmuje 25, 465, 587 i 2525 (dokumentacja Mailgun). Dlatego Droplet, który nie dosięga portu 587, zwykle nadal połączy się z przekaźnikiem na 2525 albo 2587.
Co zrobić, gdy port 25 jest zablokowany?
Masz trzy realne wyjścia: przekaźnik pocztowy na porcie submission, prośbę do dostawcy o zdjęcie blokady albo przeniesienie bezpośredniej wysyłki na serwer, który ją dopuszcza. Dla aplikacji wysyłającej newslettery, maile transakcyjne czy powiadomienia w większości przypadków właściwy jest przekaźnik.
Opcja 1: relay przez dostawcę wysyłki (ESP) na 587, 465 lub 2525
Utwórz dane logowania SMTP u przekaźnika (Amazon SES, Mailgun, SendGrid, Postmark, SMTP2GO lub podobnego), zweryfikuj tam swoją domenę i wskaż aplikacji serwer przekaźnika. Minimalna konfiguracja Postfiksa przekazująca całą pocztę do Amazon SES wygląda tak:
# /etc/postfix/main.cf (istotne linie)
relayhost = [email-smtp.eu-west-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
# /etc/postfix/sasl_passwd
[email-smtp.eu-west-1.amazonaws.com]:587 SMTP_USERNAME:SMTP_PASSWORD
# potem
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl reload postfix
Na DigitalOcean zamień :587 na :2587 dla SES albo użyj smtp.mailgun.org:2525, bo Droplet nie dosięga portu 587. Pełną instrukcję dla SES, z wyjściem z sandboxa i rekordami DNS, znajdziesz w naszym poradniku konfiguracji Amazon SES SMTP.
✅ Zalety
- Działa u każdego dostawcy z tabeli, zwykle w kilka minut
- Adresy IP przekaźnika mają już historię wysyłki
- Odbicia, skargi i lista wykluczeń są obsługiwane za Ciebie
❌ Na co uważać
- Koszt za wiadomość i limity samego przekaźnika
- Adresy odbiorców przetwarza kolejna firma — wpisz ją do rejestru czynności przetwarzania (RODO)
- Współdzielone IP niosą reputację innych nadawców
Opcja 2: prośba o odblokowanie
Wybierz ją, gdy świadomie uruchamiasz własny MTA, np. żeby wysyłać z dedykowanych adresów IP. W następnej sekcji znajdziesz gotową treść. Licz się z ręczną weryfikacją, wymogiem stażu konta i możliwą odmową.
Opcja 3: doręczanie z innego serwera
Zostaw aplikację tam, gdzie jest, a sam MTA postaw u dostawcy lub na serwerze dedykowanym, który dopuszcza port 25, i nadawaj do niego na 587 przez sieć. Bierzesz wtedy na siebie wszystko, co zwykle robi przekaźnik: PTR, rozgrzewanie IP, monitorowanie czarnych list i obsługę odbić.
Jak poprosić dostawcę o odblokowanie portu 25?
Napisz krótką, konkretną prośbę, która pokazuje, że wysyłasz oczekiwaną pocztę, masz uwierzytelnianie i potrafisz zatrzymać nadużycia. Dostawcy czytają takie prośby ręcznie i odrzucają ogólnikowe, więc najpierw przygotuj DNS: rekord A dla nazwy hosta wysyłającego i — tam, gdzie da się go ustawić — rekord PTR wskazujący z powrotem na tę nazwę.
- Przygotuj DNS
Utwórz
mail.example.com→ IP serwera, ustaw reverse DNS namail.example.comw panelu dostawcy (AWS: na Elastic IP; formularz ma opcjonalne pole rDNS) i opublikuj SPF, DKIM i DMARC dla domeny nadawczej. - Sprawdź warunki formalne
Hetzner Cloud wymaga konta starszego niż miesiąc i opłaconej pierwszej faktury; AWS — osobnej prośby dla każdego regionu; Vultr pyta o SPF/DKIM, limity i wolumen.
- Wyślij prośbę
Formularzem albo zgłoszeniem w systemie dostawcy, nie wpisem na forum.
- Przetestuj ponownie
Niektórzy dostawcy wymagają restartu albo zatrzymania i uruchomienia maszyny, żeby nowa polityka zadziałała (Azure pisze o tym wprost przy zwolnionych subskrypcjach).
Prośba, która odpowiada na typowe pytania (dostawcy obsługują je zwykle po angielsku):
Subject: Request to allow outbound SMTP (TCP 25) for server 203.0.113.10
We run a self-hosted email platform for our own company (example.com) on this
server. It sends opt-in newsletters and transactional emails (order and account
notifications) to people who subscribed through a double opt-in form.
- Sending host: mail.example.com (A record and PTR set to 203.0.113.10)
- SPF, DKIM and DMARC (p=quarantine) are published for example.com
- Expected volume: about 2,000 messages per day, rate-limited to 300 per hour
- Every message has a one-click unsubscribe link; bounces and complaints are
suppressed automatically
- Abuse contact: postmaster@example.com
Please remove the outbound port 25 restriction for this server.
Podawaj prawdziwe liczby. Ogólnikową prośbę łatwo odrzucić, a dostawca może przywrócić blokadę, jeśli później napłyną skargi.
Dlaczego otwarty port 25 nie wystarczy?
Bo serwer odbiorcy ocenia adres IP, a nie samo połączenie: bez pasującego rekordu PTR, uwierzytelnionej domeny i historii wysyłki świeży adres z chmury zostanie odrzucony albo trafi do spamu. Gmail, Yahoo i Microsoft wymagają uwierzytelniania od nadawców masowych, a zgodny w obie strony reverse DNS jest częścią tego obrazu.
PTR (reverse DNS)
dig +short -x 203.0.113.10 # powinno zwrócić mail.example.com.
dig +short A mail.example.com # powinno zwrócić 203.0.113.10
# nazwa HELO/EHLO Twojego MTA powinna być tą samą nazwą hosta
Ogólna nazwa PTR nadana przez dostawcę albo brak PTR to częsty powód odrzuceń. Jeśli widzisz błąd Gmaila 550-5.7.26 albo podobne błędy uwierzytelniania, przejdź przez nasz poradnik o błędzie Gmail 550-5.7.26.
Reputacja IP i rozgrzewanie
Nowy adres IP nie ma historii, a zakresy chmurowe bywają traktowane podejrzliwie. Zacznij od małych dziennych wolumenów do najbardziej zaangażowanych odbiorców i zwiększaj je stopniowo przez kolejne tygodnie, pilnując odbić i skarg. Plan rozgrzewania i wymagania Gmaila, Yahoo i Outlooka zestawione obok siebie znajdziesz w poradniku o dostarczalności dla nadawców self-hosted.
Obciążenie operacyjne
Bezpośrednie doręczanie oznacza też samodzielną obsługę odroczeń (4xx), ponowień, pętli zwrotnych (feedback loops) i kontroli czarnych list. Jeśli to więcej pracy niż powód, dla którego chciałeś portu 25, wybierz przekaźnik.
Docker, firewall i IPv6: test na hoście przechodzi, a maile nie wychodzą
Udany test na hoście nie dowodzi, że kontener dosięgnie tego samego portu — i odwrotnie. Kontenery w sieci bridge Dockera wychodzą przez NAT w łańcuchu FORWARD, a procesy hosta przez OUTPUT, więc reguły ruchu wychodzącego mogą działać na jedno, a na drugie nie.
- Testuj z kontenera, który faktycznie wysyła. Wiele obrazów aplikacji ma PHP lub Pythona, ale nie ma
nc; to polecenie działa w każdym kontenerze z PHP:docker compose exec app php -r '$s=@fsockopen("email-smtp.eu-west-1.amazonaws.com",587,$e,$m,5); echo $s ? fgets($s) : "failed: $m\n";' - ufw z
default deny outgoingblokuje hosta, a reguły dodane przezufw allow out 587/tcpdotyczą ruchu hosta. Ruch wychodzący kontenerów przechodzi przez łańcuchy Dockera; jeśli chcesz go ograniczać, rób to wDOCKER-USER. - Firewalle chmurowe (security groups, Hetzner Firewalls, reguły egress w VPC) działają niezależnie od ogólnej blokady dostawcy. W Google Cloud, jeśli dodałeś regułę blokującą cały ruch wychodzący, potrzebujesz reguły zezwalającej na port relaya.
- IPv6: domyślna sieć bridge Dockera działa tylko na IPv4, więc kontenery zwykle łączą się przez IPv4, nawet gdy host ma IPv6. MTA w sieci hosta może jednak preferować rekordy AAAA — wtedy adres IPv6 potrzebuje własnego PTR i tych samych testów.
- DNS w kontenerach: gdy kontener nie rozwiązuje nazwy przekaźnika, błąd wygląda jak awaria sieci. Sprawdź to przez
docker compose exec app getent hosts email-smtp.eu-west-1.amazonaws.com.
Wysyłka z NetSendo przy zablokowanym porcie 25
NetSendo wysyła kampanie przez skrzynki dodane w panelu, a skrzynka SMTP (host, port, użytkownik, hasło, szyfrowanie) podłączona do przekaźnika takiego jak Amazon SES czy Mailgun działa na porcie 587, 465 albo porcie zastępczym — zablokowany port 25 jej nie dotyczy. Zmienne opisuje dokumentacja konfiguracji; NetSendo nie narzuca własnych limitów wysyłki, więc o wolumenie decyduje przekaźnik.
Opcjonalny NetSendo MTA (NMI, kontener Haraka uruchamiany przez docker compose --profile nmi up -d, funkcja planu GOLD) działa inaczej: doręcza pocztę prosto do serwerów odbiorców, więc potrzebuje wychodzącego portu 25 i rekordu PTR dla każdego adresu IP, z którego wysyła. Gdy port jest zablokowany, MTA przyjmuje pocztę, ale nie może jej doręczyć, a docker logs netsendo-mta pokazuje przekroczenia czasu połączenia. Od wersji 2.9.0 ekran Ustawienia → Mail Infrastructure → Configure Providers opisuje zasady portu 25 u każdego dostawcy adresów IP, a zmienna NMI_HELO_HOST ustawia nazwę HELO, która powinna zgadzać się z rekordem PTR.
📌 Najważniejsze
- Przekroczony czas przy
nc -vz host 25to port filtrowany; powitanie220— otwarty. - Używaj przekaźnika na 587/465 (2525/2587 na DigitalOcean), chyba że świadomie prowadzisz własny MTA.
- Prośba o odblokowanie wymaga gotowego DNS i uczciwych liczb; zgoda nigdy nie jest pewna.
- Otwarty port to dopiero początek: o skrzynce odbiorczej decydują PTR, SPF, DKIM, DMARC i rozgrzewanie.
🎯 Rady eksperta
Uruchom najtańszą instancję w docelowym regionie i zrób testy nc oraz openssl, zanim cokolwiek przeniesiesz.
Maile transakcyjne wysyłaj przez przekaźnik, nawet jeśli newslettery idą przez własny MTA — problem z reputacją jednej drogi nie zatrzyma wtedy resetów hasła.
Przy pierwszych wysyłkach włącz logowanie debug SMTP. Dokładny kod odpowiedzi powie Ci, czy to blokada sieci, błąd logowania czy filtr reputacji.
Nowy firewall, nowy adres IP albo przeprowadzka do innego regionu mogą przywrócić blokadę, którą już raz zdjęto.
Najczęściej zadawane pytania
Jak sprawdzić, czy port 25 jest zablokowany na VPS?
Uruchom na serwerze nc -vz -w 5 gmail-smtp-in.l.google.com 25. Powitanie 220 albo komunikat 'succeeded' oznacza otwarty port; przekroczony czas oznacza, że port 25 filtruje dostawca albo firewall.
Dlaczego dostawcy chmury blokują port 25?
Port 25 służy do doręczania poczty między serwerami, a przejęte lub nadużywane serwery w chmurze są częstym źródłem spamu. Domyślna blokada chroni zakresy IP dostawcy przed czarnymi listami.
Czy zamiast portu 25 mogę użyć portu 587?
Tak, jeśli wysyłasz przez przekaźnik lub usługę pocztową przyjmującą uwierzytelnioną wysyłkę na 587. Port 587 nie zastąpi 25 przy doręczaniu prosto do serwerów MX odbiorców, które nasłuchują tylko na 25.
Czy DigitalOcean odblokowuje port 25?
Dokumentacja DigitalOcean podaje, że porty 25, 465 i 587 są domyślnie zablokowane na wszystkich Dropletach, i nie opisuje odblokowania; zaleca zewnętrzną usługę pocztową. Typowym obejściem są przekaźniki przyjmujące porty 2525 lub 2587.
Czy otwarty port 25 wystarczy do niezawodnej wysyłki?
Nie. Serwery odbiorców sprawdzają też zgodny rekord PTR, SPF, DKIM, DMARC i historię wysyłki z danego IP. Nowy adres w chmurze wymaga stopniowego rozgrzewania, zanim większe wolumeny trafią do skrzynek.
Źródła
- DigitalOcean: Why is SMTP blocked?
- Hetzner Cloud: Servers FAQ
- AWS re:Post: Remove the restriction on port 25 from EC2 or Lambda
- Google Cloud: VPC firewall rules (blocked traffic on port 25)
- Microsoft Learn: Troubleshoot outbound SMTP connectivity in Azure
- Vultr Docs: Why is SMTP blocked?
- Amazon SES: Connecting to an SMTP endpoint
- Mailgun: Send via SMTP
Wysyłaj z własnego serwera, przez wybrany przez siebie przekaźnik
NetSendo działa na Twoim serwerze w Dockerze i wysyła przez przekaźniki SMTP, Gmail API, SendGrid albo własny MTA, bez własnych limitów wysyłki.




