¿Puerto 25 bloqueado en tu VPS? Cómo enviar correo igualmente

Si tu VPS no envía correos, lo más probable es que el proveedor de nube haya bloqueado el puerto 25 de salida, y en la mayoría de proveedores el bloqueo sigue ahí hasta que pides que lo quiten, o no se puede quitar nunca. La solución que funciona casi en todas partes es dejar de entregar el correo directamente desde el servidor y pasárselo a un relay SMTP autenticado en el puerto 587, 465 o 2525. El puerto 25 solo te hace falta si ejecutas tu propio MTA que entrega directamente a los servidores de correo de los destinatarios.
nc -vz -w 5 gmail-smtp-in.l.google.com 25: si se agota el tiempo, el puerto 25 de salida está filtrado. DigitalOcean bloquea 25, 465 y 587 en todos los Droplets; Hetzner Cloud bloquea 25 y 465, pero deja abierto el 587; AWS, Google Cloud, Azure (fuera de los contratos enterprise) y Vultr bloquean el 25 por defecto. Envía a través de un relay como Amazon SES o Mailgun en el 587 (o en 2525/2587 si el 587 también está cerrado), o solicita el desbloqueo si de verdad necesitas entrega directa. Un puerto abierto no basta para llegar a la bandeja de entrada: también necesitas PTR, SPF, DKIM, DMARC y una IP calentada.¿Cómo compruebo si el puerto 25 está bloqueado en mi VPS?
Abre desde el servidor una conexión TCP a un servidor de correo real (MX) en el puerto 25: un saludo 220 significa que el puerto está abierto; un tiempo de espera agotado significa que el proveedor o tu propio firewall descartan el tráfico. Haz la misma prueba contra tu relay en el 587 y el 465 para saber qué camino tienes disponible antes de cambiar la configuración.
Paso 1: busca un servidor MX para la prueba
# registros MX de un gran proveedor de correo
dig +short MX gmail.com
# 5 gmail-smtp-in.l.google.com.
# 10 alt1.gmail-smtp-in.l.google.com.
# ...
Paso 2: prueba el puerto 25 de salida
# netcat: -v detallado, -z solo conectar, -w 5 rendirse a los 5 segundos
nc -vz -w 5 gmail-smtp-in.l.google.com 25
# sin netcat: leer el saludo SMTP con /dev/tcp de bash
timeout 10 bash -c 'exec 3<>/dev/tcp/gmail-smtp-in.l.google.com/25 && head -1 <&3' || echo "port 25 is blocked"
Así se interpreta el resultado:
| Lo que ves | Qué significa | Siguiente paso |
|---|---|---|
220 mx.google.com ESMTP … | El puerto 25 está abierto de extremo a extremo | La entrega directa es posible; revisa PTR y reputación |
Se queda colgado y luego timed out | Los paquetes se descartan en silencio, lo típico de un bloqueo del proveedor | Revisa la política del proveedor más abajo y tus reglas de salida |
Connection refused | Algo rechaza activamente la conexión (a menudo una regla de firewall local o un proxy) | Revisa ufw/nftables y cualquier proxy de salida |
Name or service not known | Problema de DNS, no de puerto | Arregla primero el resolver |
Paso 3: prueba tu relay en los puertos de envío
Los puertos de envío (submission) usan TLS, así que pruébalos con openssl s_client. El 587 empieza en texto plano y pasa a cifrado con STARTTLS; el 465 va cifrado desde el primer byte.
# 587 con STARTTLS (Amazon SES, endpoint eu-west-1 como ejemplo)
openssl s_client -starttls smtp -connect email-smtp.eu-west-1.amazonaws.com:587 -crlf -quiet
# verás la cadena de certificados y líneas "250 ..."; escribe QUIT para salir
# 465 con TLS implícito
openssl s_client -connect email-smtp.eu-west-1.amazonaws.com:465 -crlf -quiet
# puertos alternativos cuando 587 y 465 también están bloqueados (p. ej. DigitalOcean)
nc -vz -w 5 email-smtp.eu-west-1.amazonaws.com 2587
nc -vz -w 5 smtp.mailgun.org 2525
💡 Consejo: Repite cada prueba dos veces, connc -4y connc -6. Algunos proveedores filtran IPv4 e IPv6 de forma distinta, y tu MTA puede intentar primero un registro AAAA.
¿Qué proveedores de nube bloquean el puerto 25?
La mayoría de las grandes nubes bloquean por defecto el puerto 25 de salida en servidores nuevos, y se diferencian sobre todo en si el bloqueo se puede levantar. DigitalOcean es el más estricto porque también bloquea el 465 y el 587; Hetzner Cloud y Vultr revisan las solicitudes caso por caso; AWS tiene un formulario; Google Cloud levanta el bloqueo por proyecto cuando lo considera de bajo riesgo.
| Proveedor | Salida por el 25 por defecto | 465 / 587 | ¿Se puede desbloquear? |
|---|---|---|---|
| DigitalOcean Droplets | ✗ Bloqueado | ✗ Ambos bloqueados, también a través de Reserved IP | La documentación no describe ningún desbloqueo y recomienda un servicio de correo externo (DigitalOcean) |
| Hetzner Cloud | ✗ Bloqueado | 465 bloqueado, ✓ 587 abierto | ~ Tras un mes y la primera factura pagada, con una solicitud de límites en Hetzner Console, caso por caso (Hetzner) |
| AWS EC2 y Lambda | ✗ Bloqueado salvo que la cuenta esté en la lista de permitidas | ✓ Abiertos | ~ Formulario, una solicitud por región (AWS) |
| Google Cloud Compute Engine | ✗ Bloqueado hacia IP externas | ✓ Excluidos del bloqueo | ~ Se levanta automáticamente cuando Google considera el proyecto de bajo riesgo; un banner en la página VPC networks muestra el estado (Google Cloud) |
| Azure (máquinas virtuales) | ✓ Abierto con Enterprise Agreement y MCA-E; ✗ bloqueado en el resto de tipos de suscripción | ✓ El 587 hacia relays autenticados no está restringido | Enterprise Dev/Test: exención por autoservicio en Diagnose and Solve; el resto: usa un relay (Microsoft) |
| Vultr | ✗ Bloqueado en instancias nuevas | ✓ Abiertos | ~ Ticket de soporte con el caso de uso, SPF/DKIM/límites de envío y volumen; sin garantía (Vultr) |
Datos a noviembre de 2026, comprobados en la documentación de cada proveedor el 12 de noviembre de 2026. Las políticas cambian: haz la prueba de la sección anterior antes de fiarte de esta tabla.
Proveedores más pequeños, como Arsys, IONOS o Hostinger, tienen sus propias reglas. Si la entrega directa es imprescindible para ti, pregunta antes de contratar y haz la prueba con nc el primer día.
Puerto 25, 587, 465 o 2525: ¿para qué sirve cada uno?
El puerto 25 sirve para la entrega entre servidores: tu MTA se conecta al MX del destinatario y le pasa el mensaje sin iniciar sesión. Los puertos 587 y 465 sirven para el envío (submission): una aplicación o un cliente de correo inicia sesión en su proveedor, que después entrega por el puerto 25 desde sus IP con reputación. El 2525 (y el 2587/2465 de Amazon) es una alternativa no oficial que ofrecen los relays para redes que bloquean los puertos estándar.
El envío (submission) es la entrega autenticada de tu aplicación a un servicio de correo (587/465). El relay es ese servicio reenviando el correo en tu nombre. La entrega es el último salto SMTP hacia el MX del destinatario por el puerto 25. Si el puerto 25 está bloqueado, te quedas con el envío y externalizas la entrega.
| Puerto | Uso | Cifrado | Autenticación |
|---|---|---|---|
| 25 | Entrega MTA → MX (los relays también lo aceptan) | STARTTLS opcional | Ninguna frente a un MX |
| 587 | Envío al proveedor | STARTTLS | Obligatoria |
| 465 | Envío con TLS implícito | TLS desde el primer byte | Obligatoria |
| 2525 / 2587 / 2465 | Puertos alternativos de algunos relays | STARTTLS (2525, 2587) o TLS (2465) | Obligatoria |
Amazon SES acepta STARTTLS en 25, 587 y 2587 y TLS Wrapper en 465 y 2465 (documentación de AWS SES); Mailgun acepta 25, 465, 587 y 2525 (documentación de Mailgun). Por eso un Droplet que no llega al 587 normalmente sí llega a un relay por el 2525 o el 2587.
¿Qué opciones tengo si el puerto 25 está bloqueado?
Tienes tres opciones realistas: enviar a través de un servicio de correo en un puerto de envío, pedir al proveedor que levante el bloqueo o llevar la entrega directa a otro servidor que la permita. Para una aplicación que envía newsletters, correos transaccionales o notificaciones, el relay es la respuesta correcta en la mayoría de los casos.
Opción 1: relay a través de un ESP en el 587, 465 o 2525
Crea credenciales SMTP en un relay (Amazon SES, Mailgun, SendGrid, Postmark, SMTP2GO o similar), verifica allí tu dominio y configura tu aplicación con el host del relay. Una configuración mínima de Postfix que reenvía todo a Amazon SES es así:
# /etc/postfix/main.cf (líneas relevantes)
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
# después
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl reload postfix
En DigitalOcean cambia :587 por :2587 para SES o usa smtp.mailgun.org:2525, porque el Droplet no llega al 587. Tienes la guía completa de SES, con la salida del sandbox y los registros DNS, en nuestra guía de configuración de Amazon SES SMTP.
✅ Ventajas
- Funciona con todos los proveedores de la tabla, normalmente en minutos
- Las IP del relay ya tienen historial de envío
- Rebotes, quejas y listas de supresión las gestiona el servicio
❌ A tener en cuenta
- Coste por mensaje y cuotas propias del relay
- Otra empresa trata las direcciones de tus destinatarios: debe figurar en tu registro de actividades de tratamiento (RGPD) y necesitas un contrato de encargo
- Las IP compartidas arrastran la reputación de otros remitentes
Opción 2: solicitar el desbloqueo
Elígela cuando ejecutas tu propio MTA a propósito, por ejemplo para enviar desde IP dedicadas. En la siguiente sección tienes qué escribir. Cuenta con una revisión manual, requisitos de antigüedad de la cuenta y una posible negativa.
Opción 3: entregar desde otro servidor
Deja la aplicación donde está y lleva solo el MTA a un proveedor o servidor dedicado que permita el puerto 25; luego envíale el correo por el 587 a través de la red. Asumes todo lo que normalmente hace un relay: PTR, calentamiento de IP, vigilancia de listas negras y gestión de rebotes.
¿Cómo pido al proveedor que desbloquee el puerto 25?
Escribe una solicitud breve y concreta que demuestre que envías correo deseado, que tienes la autenticación configurada y que puedes frenar los abusos. Los proveedores revisan estas solicitudes a mano y rechazan las vagas, así que prepara antes el DNS: un registro A para el nombre de host de envío y, donde puedas configurarlo, un registro PTR que apunte de vuelta a ese nombre.
- Prepara el DNS
Crea
mail.example.com→ IP del servidor, configura el DNS inverso comomail.example.comen el panel del proveedor (AWS: en la Elastic IP; el formulario tiene un campo rDNS opcional) y publica SPF, DKIM y DMARC para el dominio remitente. - Revisa los requisitos formales
Hetzner Cloud pide una cuenta de más de un mes con la primera factura pagada; AWS, una solicitud por región; Vultr pregunta por SPF/DKIM, límites de envío y volumen.
- Envía la solicitud
Por el formulario o el sistema de tickets del proveedor, no en un foro.
- Vuelve a probar
Algunos proveedores necesitan un reinicio o parar y arrancar la máquina para aplicar la nueva política (Azure lo indica expresamente para las suscripciones exentas).
Una solicitud que responde a las preguntas habituales (la mayoría de proveedores la tramita en inglés):
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.
Usa tus cifras reales. Una solicitud vaga es fácil de rechazar, y el proveedor puede volver a bloquear el puerto si después llegan quejas.
¿Por qué no basta con tener el puerto 25 abierto?
Porque el servidor receptor evalúa la IP, no solo la conexión: sin un registro PTR coherente, un dominio autenticado y un historial de envío, una IP de nube recién estrenada acaba rechazada o en spam. Gmail, Yahoo y Microsoft exigen autenticación a los remitentes masivos, y un DNS inverso coherente en ambos sentidos forma parte de ese cuadro.
PTR (DNS inverso)
dig +short -x 203.0.113.10 # debería devolver mail.example.com.
dig +short A mail.example.com # debería devolver 203.0.113.10
# el nombre HELO/EHLO de tu MTA debería ser ese mismo nombre de host
Un nombre PTR genérico asignado por el proveedor, o no tener PTR, es un motivo frecuente de rechazo. Si ves el error de Gmail 550-5.7.26 u otros errores de autenticación parecidos, sigue nuestra guía sobre el error 550-5.7.26 de Gmail.
Reputación de IP y calentamiento
Una IP nueva no tiene historial, y los rangos de nube suelen mirarse con desconfianza. Empieza con volúmenes diarios bajos hacia tus destinatarios más activos y súbelos poco a poco durante semanas, vigilando rebotes y quejas. El plan de calentamiento y los requisitos de Gmail, Yahoo y Outlook, comparados, están en la guía de entregabilidad para remitentes autoalojados (en inglés).
Carga operativa
La entrega directa también implica gestionar tú mismo los aplazamientos (4xx), los reintentos, los bucles de retroalimentación (feedback loops) y la vigilancia de listas negras. Si eso es más trabajo que el motivo por el que querías el puerto 25, usa un relay.
Docker, firewall e IPv6: la prueba funciona en el host, pero el correo no sale
Que la prueba funcione en el host no demuestra que un contenedor llegue al mismo puerto, ni al revés. Los contenedores de una red bridge de Docker salen del host mediante NAT por la cadena FORWARD, mientras que los procesos del host usan OUTPUT, así que las reglas de salida pueden aplicarse a unos y no a otros.
- Prueba desde el contenedor que realmente envía. Muchas imágenes de aplicación tienen PHP o Python, pero no
nc; esto funciona en cualquier contenedor con 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 con
default deny outgoingbloquea el host, y las reglas que añades conufw allow out 587/tcpse aplican al tráfico del host. El tráfico de salida de los contenedores pasa por las cadenas propias de Docker; si quieres restringirlo, hazlo enDOCKER-USER. - Los firewalls de la nube (security groups, Hetzner Firewalls, reglas de salida de la VPC) se suman al bloqueo general del proveedor. En Google Cloud, por ejemplo, necesitas una regla que permita el puerto del relay si añadiste una regla que deniega toda la salida.
- IPv6: la red bridge por defecto de Docker solo usa IPv4, así que los contenedores suelen conectarse por IPv4 aunque el host tenga IPv6. En cambio, un MTA en la red del host puede preferir los registros AAAA; entonces la dirección IPv6 necesita su propio PTR y las mismas pruebas.
- DNS en los contenedores: si el contenedor no resuelve el nombre del relay, el error parece un fallo de red. Compruébalo con
docker compose exec app getent hosts email-smtp.eu-west-1.amazonaws.com.
Enviar desde NetSendo con el puerto 25 bloqueado
NetSendo envía las campañas a través de los buzones que añades en el panel, y un buzón SMTP (host, puerto, usuario, contraseña, cifrado) conectado a un relay como Amazon SES o Mailgun funciona en el 587, el 465 o un puerto alternativo, así que el bloqueo del puerto 25 no le afecta. Las variables se describen en la referencia de configuración; NetSendo no fija límites de envío propios, así que el volumen lo marca el relay.
El MTA opcional de NetSendo (NMI, un contenedor Haraka que se inicia con docker compose --profile nmi up -d, función del plan GOLD) es distinto: entrega directamente a los servidores de los destinatarios, por lo que necesita el puerto 25 de salida y un registro PTR para cada IP de envío. Si el puerto está bloqueado, el MTA acepta el correo pero no puede entregarlo, y docker logs netsendo-mta muestra tiempos de espera agotados en las conexiones. Desde la versión 2.9.0, Settings → Mail Infrastructure → Configure Providers explica la política del puerto 25 de cada proveedor de IP, y NMI_HELO_HOST define el nombre HELO, que debería coincidir con el registro PTR.
📌 Lo esencial
- Un tiempo agotado con
nc -vz host 25indica un puerto filtrado; un saludo220, un puerto abierto. - Usa un relay en el 587/465 (2525/2587 en DigitalOcean), salvo que ejecutes tu propio MTA a propósito.
- Las solicitudes de desbloqueo necesitan el DNS listo y cifras honestas; la aprobación nunca está garantizada.
- Un puerto abierto es solo el principio: PTR, SPF, DKIM, DMARC y el calentamiento deciden la bandeja de entrada.
🎯 Consejos de experto
Levanta la instancia más barata en la región de destino y haz las pruebas con nc y openssl antes de mover nada.
Envía el correo transaccional por un relay aunque las newsletters salgan por tu propio MTA: un problema de reputación en una vía no detendrá los restablecimientos de contraseña.
Activa el registro de depuración SMTP en los primeros envíos. El código de respuesta exacto te dice si es un bloqueo de red, un error de autenticación o un filtro de reputación.
Un firewall nuevo, una IP nueva o un cambio de región pueden traer de vuelta un bloqueo que ya habías conseguido levantar.
Preguntas frecuentes
¿Cómo sé si el puerto 25 está bloqueado en mi VPS?
Ejecuta en el servidor nc -vz -w 5 gmail-smtp-in.l.google.com 25. Un saludo 220 o 'succeeded' significa que el puerto está abierto; un tiempo agotado significa que el proveedor o un firewall filtran el puerto 25 de salida.
¿Por qué los proveedores de nube bloquean el puerto 25?
El puerto 25 se usa para la entrega de correo entre servidores, y los servidores en la nube comprometidos o mal usados son una fuente habitual de spam. El bloqueo por defecto protege los rangos de IP del proveedor frente a las listas negras.
¿Puedo usar el puerto 587 en lugar del 25?
Sí, si envías a través de un relay o servicio de correo que acepte envío autenticado en el 587. El 587 no sustituye al 25 para entregar directamente a los servidores MX de los destinatarios, que solo escuchan en el 25.
¿DigitalOcean desbloquea el puerto 25?
La documentación de DigitalOcean indica que los puertos 25, 465 y 587 están bloqueados por defecto en todos los Droplets y no describe ningún desbloqueo; recomienda un servicio de correo externo. Los relays que aceptan el 2525 o el 2587 son la solución habitual.
¿Basta con el puerto 25 abierto para enviar correo de forma fiable?
No. Los servidores receptores también comprueban un registro PTR coherente, SPF, DKIM, DMARC y el historial de envío de la IP. Una IP de nube nueva necesita un calentamiento gradual antes de que volúmenes mayores lleguen a la bandeja de entrada.
Fuentes
- 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
Envía desde tu propio servidor, con el relay que elijas
NetSendo se ejecuta en tu servidor con Docker y envía a través de relays SMTP, la API de Gmail, SendGrid o su propio MTA, sin límites de envío propios.




