# Postfix Smart Relay en casos de bloqueo puerto 25 - Configuración Completa

## Escenario

Servidor sin panel de control que necesita enviar correos electrónicos (alertas, notificaciones) pero tiene el puerto 25 bloqueado por el ISP (Hetzner). Solución mediante smart relay a otro servidor Postfix actuando como gateway de salida.

# Configuración Postfix Smart Relay - Puerto 25 Bloqueado

## Escenario

Servidor sin panel de control que necesita enviar correos electrónicos (alertas, notificaciones) pero tiene el puerto 25 bloqueado por el ISP (Hetzner). Solución mediante smart relay a otro servidor Postfix actuando como gateway de salida.

## Arquitectura

```
[Servidor Origen] --puerto 587--> [Smart Relay] --puerto 25--> [Internet]
   (puerto 25 capado)              (múltiples ubicaciones)
```

## Configuración del Servidor Origen (Cliente)

### 1. Instalación básica
```bash
apt-get install postfix mailutils
```

### 2. Configuración main.cf
```bash
# /etc/postfix/main.cf

# ⚠️ CRÍTICO: Verificar sintaxis exacta - errores tipográficos causan bucles
myhostname = alerts.tudominio.com
mydomain = tudominio.com
myorigin = alerts.tudominio.com  # Debe coincidir exactamente con DKIM

# Smart relay
relayhost = [ip-smart-relay]:587

# Configuración local mínima
inet_interfaces = loopback-only
mydestination = localhost, localhost.localdomain
local_recipient_maps = 
local_transport = error:local mail delivery is disabled

# ⚠️ IMPORTANTE: Incluir TODAS las IPs que pueden enviar bounces
mynetworks = 127.0.0.0/8 [::1]/128 [IP-smart-relay]

# TLS para conexión al smart relay
smtp_use_tls = yes
smtp_tls_security_level = encrypt

# ⚠️ NUEVO: Transport maps para evitar bucles de bounces
transport_maps = hash:/etc/postfix/transport
```

### 3. Transport maps (CRÍTICO para evitar bucles)
```bash
# /etc/postfix/transport
# Mantener correos hacia el propio dominio locales para evitar bucles
alerts.tudominio.com    local:

# Compilar
postmap /etc/postfix/transport
```

### 4. Aliases básicos
```bash
# /etc/aliases
root: sysadmin@tudominio.com
postmaster: sysadmin@tudominio.com
# Usuario para descartar bounces automáticos
devnull: /dev/null

# Aplicar cambios
newaliases
postfix reload
```

## Configuración del Smart Relay

### 1. Configuración main.cf del smart relay
```bash
# /etc/postfix/main.cf

# Configuración básica
myhostname = smart-relay.tudominio.com
mydomain = tudominio.com

# ⚠️ CRÍTICO: Permitir relay desde IPs específicas
mynetworks = 127.0.0.0/8 [::1]/128 [IP-cliente-1] [IP-cliente-2]

# Configuración de relay
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

# TLS
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
```

### 2. Puerto alternativo en master.cf
```bash
# /etc/postfix/master.cf

# Puerto estándar
smtp      inet  n       -       y       -       -       smtpd

# Puerto alternativo para clientes con puerto 25 capado
587       inet  n       -       y       -       -       smtpd
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_tls_security_level=encrypt
```

### 3. Gestión de bounces (Prevención de bucles)
```bash
# /etc/aliases en smart relay
devnull: /dev/null
bounces: /dev/null

# Aplicar
newaliases
```

## Configuración DNS y Autenticación

### 1. SPF Record
```dns
; Para el dominio principal
tudominio.com. IN TXT "v=spf1 ip4:ip-smart-relay-1 ip4:ip-smart-relay-2 -all"

; Para subdominios específicos (IMPORTANTE)
alerts.tudominio.com. IN TXT "v=spf1 ip4:ip-smart-relay-1 ip4:ip-smart-relay-2 -all"
```

### 2. DKIM Configuration
```bash
# Instalar herramientas DKIM
apt-get install opendkim opendkim-tools

# Generar claves
opendkim-genkey -t -s mail -d alerts.tudominio.com

# ⚠️ IMPORTANTE: El selector debe coincidir con el dominio usado en myorigin
```

### 3. DMARC Policy
```dns
_dmarc.tudominio.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@tudominio.com"
```

## Resolución de Problemas Críticos

### 1. Bucles de correo ("too many hops")
**Síntoma**: Error 5.4.0 "too many hops"
**Causa**: Correos hacia el propio dominio van al smart relay y vuelven

**Solución**:
```bash
# /etc/postfix/transport en servidor origen
alerts.tudominio.com    local:

# Recompilar
postmap /etc/postfix/transport
systemctl reload postfix
```

### 2. "Relay access denied"
**Síntoma**: 454 4.7.1 Relay access denied
**Causa**: IP del cliente no está en mynetworks del smart relay

**Diagnóstico**:
```bash
# En smart relay, verificar qué IP se conecta
grep "connect from" /var/log/mail.log | grep [IP-problema]

# Verificar configuración actual
postconf mynetworks
```

**Solución**: Añadir IP faltante a mynetworks

### 3. Alias no funciona
**Síntoma**: Los alias no se aplican correctamente
**Causa común**: Errores tipográficos en myorigin

**Diagnóstico**:
```bash
# Verificar que el alias funciona
postalias -q root /etc/aliases

# ⚠️ VERIFICAR EXACTITUD de myorigin
postconf myorigin

# Común: "alertas" vs "alerts", ".co" vs ".com"
```

### 4. DKIM/DMARC failures
**Síntoma**: Correos marcados como spam
**Causa**: Desalineación entre From domain y SPF/DKIM

**Solución**: Asegurar que myorigin coincide exactamente con dominio DKIM

## Testing y Verificación

### 1. Test de funcionamiento básico
```bash
# Test desde línea de comandos
echo "Test desde $(hostname)" | mail -s "Test Relay" destino@gmail.com

# Verificar logs inmediatamente
tail -f /var/log/mail.log
```

### 2. Test de alias
```bash
# Envío a root debe ir al alias configurado
echo "Test alias" | mail -s "Test root alias" root

# Verificar en logs que va al destino correcto
```

### 3. Verificación DNS
```bash
# SPF
dig TXT alerts.tudominio.com

# DKIM
dig TXT mail._domainkey.alerts.tudominio.com

# DMARC
dig TXT _dmarc.tudominio.com
```

## Errores Comunes y Soluciones

### ❌ Error: myorigin con tipografías

```bash
# MAL
myorigin = alertas.avanzait.co  # ← error tipográfico

# BIEN
myorigin = alerts.avanzait.com
```

### ❌ Error: mynetworks incompleto

```bash
# MAL - falta IP del smart relay
mynetworks = 127.0.0.0/8

# BIEN - incluye smart relay para bounces
mynetworks = 127.0.0.0/8 [IP-smart-relay]
```

### ❌ Error: Sin transport maps
Sin transport maps, los correos al propio dominio crean bucles.

### ✅ Configuración correcta

```bash
# main.cf
transport_maps = hash:/etc/postfix/transport

# /etc/postfix/transport
alerts.tudominio.com    local:
```

## Configuración para Aplicaciones Específicas

### Zabbix

```bash
# Media Type configuración
SMTP server: localhost
Port: 25
Email: root@alerts.tudominio.com
Authentication: None
Security: None
```

### CSF (ConfigServer Firewall) 
Los correos de sistema funcionarán automáticamente una vez configurados los alias correctamente. Eso incluye pruebas de concepto, avisos de CSF, etc.

### Aplicaciones web (PHP/Python)

```php
// PHP
ini_set('SMTP', 'localhost');
ini_set('smtp_port', 25);
```

## Monitoreo y Mantenimiento

### 1. Script de monitoreo de colas

```bash
#!/bin/bash
# /usr/local/bin/check-mail-queue.sh
QUEUE_SIZE=$(mailq | tail -1 | awk '{print $5}' | tr -d ')')
if [ "$QUEUE_SIZE" -gt 50 ]; then
    echo "ALERT: Mail queue size: $QUEUE_SIZE" | \
    mail -s "Mail Queue Alert" admin@tudominio.com
fi
```

### 2. Verificación periódica de configuración

```bash
#!/bin/bash
# Verificar configuraciones críticas
echo "=== Verificación Postfix ==="
echo "myorigin: $(postconf myorigin)"
echo "relayhost: $(postconf relayhost)"
echo "mynetworks: $(postconf mynetworks)"
echo "transport_maps: $(postconf transport_maps)"
```

### 3. Backup de configuración

```bash
# Script de backup
tar -czf /backup/postfix-config-$(date +%Y%m%d).tar.gz \
    /etc/postfix/ \
    /etc/aliases \
    /etc/opendkim/ 2>/dev/null
```

## Lista de Verificación Pre-Producción

- [ ] `myorigin` sin errores tipográficos
- [ ] `mynetworks` incluye todas las IPs necesarias
- [ ] `transport_maps` configurado para evitar bucles
- [ ] Aliases funcionando (`postalias -q root /etc/aliases`)
- [ ] SPF record publicado
- [ ] DKIM keys generados y DNS configurado
- [ ] DMARC policy establecida
- [ ] Test de envío exitoso
- [ ] Logs sin errores de relay
- [ ] Smart relay acepta conexiones del cliente

## Troubleshooting Rápido

### Bucle detectado

1. Verificar `myorigin` (sin typos)
2. Configurar `transport_maps`
3. Verificar `mynetworks` en ambos servidores

### Alias no funciona
1. Verificar `/etc/aliases`
2. Ejecutar `newaliases`
3. Verificar con `postalias -q`

### Relay denied

1. Verificar IP real de conexión en logs
2. Añadir IP a `mynetworks` del smart relay
3. Reload postfix

---

### Aviso Legal
Esta documentación se proporciona "tal como está" sin garantías. Se recomienda realizar pruebas exhaustivas y mantener copias de seguridad.

Para soporte profesional: [Castris Soporte](https://intranet.castris.com/store/soporte-profesional)