SPF, CNAME y los RFC

Hoy me las he visto con un pequeño lío de configuraciones de DNS. Cuándo ocurre esto la solución es recurrir a las fuentes originales y estas son los RFC.

En concreto estos RFC:

El problema es que no se podía configurar un registro SPF en los DNS de un dominio porque ya existía un registro CNAME con el mismo nombre que se quería usar para el SPF.

Por ejemplo, se quería hacer esto:

delante.ejemplo.com. CNAME misvps.aws.com.
delante.ejemplo.com. TXT "v=spf1 ip4:203.0.113.50 -all"

Y aunque sean tipos de registros diferentes CNAME vs TXT, esto no es posible tal como se define en el RFC 1034, sección 3.6.2:

«… If a CNAME RR is present at a node, no other data should be
present; this ensures that the data for a canonical name and its aliases cannot be different.»

Si tienes ya un CNAME con un nombre no puedes tener otro registro (del tipo que sea) con el mismo nombre dentro la misma zona DNS.

Al intentar añadir el SPF de delante.ejemplo.com. IN TXT «v=spf1 ip4:203.0.113.50 -all», la aplicación de gestión de DNS detectaba la existencia previa del CNAME y no dejaba agregar el SPF.

Con esto claro el otro tema era confirmar que obviamente el SPF tiene que usar como nombre el mismo dominio que consta como MAIL FROM en la configuración de envío de correo.

Esto se indica en el RFC 7208, sección 3. SPF Records

«An SPF record is a DNS record that declares which hosts are, and are
not, authorized to use a domain name for the ‘HELO’ and ‘MAIL FROM’ identities.»

Así que si el MAIL FROM es, por ejemplo: contacto@delante.ejemplo.com

El SPF se tiene que llamar ‘delante.ejemplo.com’, no hay otra.

Con el problema identificado y confirmado, hay que buscar una solución, hay varias:

Eliminar el CNAME
Si se puede prescindir del CNAME y usar la IP, lo más rápido es eliminar el registro CNAME y hacer un registro A directo a la IP que necesitamos, quedaría así:

delante.ejemplo.com. A 180.79.79.0
delante.ejemplo.com. TXT "v=spf1 ip4:203.0.113.50 -all"

Usar ALIAS/ANAME
Si los DNS están configurados en Route 53, el servicio de DNS de AWS, se puede usar ALIAS en vez de CNAME, y esto permite usar otros registros con el mismo nombre:

delante.ejemplo.com. ALIAS misvps.aws.com.
delante.ejemplo.com. TXT "v=spf1 ip4:203.0.113.50 -all"

Pero con limitaciones, ya Route 53 solo permite usar ALIAS para llamar a recursos en AWS, si es un recurso externo de AWS no funcionara.

Fuente: https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html#resource-record-sets-choosing-alias-non-alias-comparison

Diferente dominio de MAIL FROM
Si solo se usa el MAIL FROM como remitente y no se quiere recibir correo se puede añadir un subdominio más al MAIL FROM y así el SPF ya será diferente, por ejemplo:

MAIL FROM contacto@mail.delante.ejemplo.com

Y el SPF seria:

mail.delante.ejemplo.com. TXT "v=spf1 ip4:203.0.113.50 -all"

Con esto no haría falta eliminar el CNAME

(*) Nota: Las IPs y dominios usados en este post se usan a modo de ejemplo. Desconozco si existen y a que usos responden.