¿Cómo superar las restricciones CNAME del dominio raíz?

117

Estamos alojando muchas aplicaciones web para nuestros clientes. Como es obvio, quieren usar sus propios dominios para referirse a esas aplicaciones, por lo general quieren que cualquier usuario escriba http://www.customer1.exampleo http://customer1.examplevaya a su aplicación web.

La situación a la que nos enfrentamos es que debemos tener la flexibilidad para cambiar las direcciones IP en un futuro próximo. Y no queremos depender de que el cliente haga el cambio de registro A en sus dominios. Así que pensamos que el uso de CNAMEregistros funcionaría, pero como descubrimos, los CNAMEregistros no funcionarán para el dominio raíz.

Básicamente:

customer1.example IN CNAME customer1.mycompanydomain.example //this is invalid as the RFC
www.customer1.example IN CNAME customer1.mycompanydomain.example //this is valid and will work

Queremos poder cambiar la dirección IP de customer1.mycompanydomain.exampleo el Aregistro y nuestros clientes seguirán este registro sobre el que tenemos control.

en nuestro DNS se verá así:

customer1.mycompanydomain.example IN A 192.0.2.1

¿Algunas ideas?

Geo
fuente
No entiendo por qué "customer1.com IN CNAME customer1.mycompanydomain.com" no es válido. Creo que debería funcionar. ¿Podría explicar dónde estaba el problema con esa solución?
sleske
3
Sí, lea la siguiente pregunta y respuesta. No es válido según el RFC de DNS. stackoverflow.com/questions/655235/…
Geo
2
No entiendo el título de la pregunta. ¿Dónde está involucrada la "raíz" (.)?
bortzmeyer
2
se refiere a la raíz de una zona, no a "la raíz"
Alnitak
2
Bueno, entonces no es un vocabulario DNS habitual. ¿No es "ápice" la palabra adecuada? ¿O de "nivel superior" para los programadores Lisp? :-)
bortzmeyer

Respuestas:

63

La razón por la que esta pregunta todavía surge a menudo es porque, como mencionaste, en algún lugar de alguna manera alguien que se presume importante escribió que la RFC establece que los nombres de dominio sin subdominio frente a ellos no son válidos. Sin embargo, si lee el RFC con atención, encontrará que esto no es exactamente lo que dice. De hecho, RFC 1912 establece:

No se exceda con los CNAME. Úselos cuando cambie el nombre de los hosts, pero planee deshacerse de ellos (e informe a sus usuarios).

Algunos hosts DNS proporcionan una forma de obtener una funcionalidad similar a CNAME en el vértice de la zona (el nivel de dominio raíz, para el nombre de dominio simple) utilizando un tipo de registro personalizado. Dichos registros incluyen, por ejemplo:

  • ALIAS en DNSimple
  • ANAME en DNS hecho fácil
  • ANAME en easyDNS
  • CNAME en CloudFlare

Para cada proveedor, la configuración es similar: apunte la entrada ALIAS o ANAME para su dominio apex a example.domain.com, tal como lo haría con un registro CNAME. Según el proveedor de DNS, un valor vacío o @ Name identifica el vértice de la zona.

ALIAS o ANAME o @ example.domain.com.

Si su proveedor de DNS no admite un tipo de registro de este tipo y no puede cambiar a uno que sí lo haga, deberá utilizar la redirección de subdominios, que no es tan difícil, según el protocolo o el software del servidor que necesite hacerlo. .

Estoy totalmente en desacuerdo con la afirmación de que solo lo hacen "administradores aficionados" o ideas similares. Es un simple "¿Qué deben hacer el nombre y su servicio?" tratar, y luego adaptar su configuración de DNS para satisfacer esos deseos; Si sus principales servicios son la web y el correo electrónico, no veo ninguna razón VÁLIDA por la que eliminar los CNAME definitivamente sería problemático. Después de todo, ¿quién preferiría @ subdomain.domain.org sobre @ domain.org? ¿Quién necesita "www" si ya está configurado con el protocolo en sí? Es ilógico asumir que el uso de un nombre de dominio raíz no sería válido.

Maullando a la luna
fuente
1
Esta respuesta en particular fue muy útil para mí, ya que quería apuntar un dominio de nivel raíz a una CDN. La mayoría de las CDN son por necesidad un FQDN, ya que podría resolverse en diferentes IP en diferentes ubicaciones o momentos. Utilizo DNS Made Easy y pude usar el tipo de registro ANAME.
Rubix
3
No podría estar mas de acuerdo. Querer alojar un sitio desde el nombre de dominio "desnudo" es algo común y lógico. Utiliza menos caracteres, se ve mejor, etc. El propio identificador de protocolo de la URL (www) es una parte vestigial de la URL, si es que era necesario en primer lugar (no lo era).
Ed Bishop
3
Los ANAME son agradables, o puede simplemente 301 todos los que no sean www a www. a través del servicio de redirección 301 gratuito 198.251.86.133
Jacob Evans
51

El uso de CNAME en un registro raíz técnicamente no está en contra de RFC, pero tiene limitaciones, lo que significa que es una práctica que no se recomienda.

Normalmente, su registro raíz tendrá varias entradas. Digamos, 3 para sus servidores de nombres y luego uno para una dirección IP.

Por RFC:

Si un RR CNAME está presente en un nodo, no debe haber otros datos;

Y según el documento IETF 'Errores comunes operativos y de configuración de DNS':

A menudo, los administradores sin experiencia lo intentan como una forma obvia de permitir que su nombre de dominio también sea un host. Sin embargo, los servidores DNS como BIND verán el CNAME y se negarán a agregar otros recursos para ese nombre. Dado que no se permite que otros registros coexistan con un CNAME, las entradas NS se ignoran. Por lo tanto, también se ignoran todos los hosts del dominio podunk.xx.

Referencias:

Jon Swanson
fuente
17
Pero POR QUÉ no se permite que ningún otro registro coexista con un CNAME. ¿Es esto solo una limitación agregada por el autor del RFC o hay una razón técnica para ello? Si no hay una razón técnica para ello, entonces fácilmente se podría crear una extensión RFC.
Sven
Entonces, si funciona para mí (use CNAME para el registro raíz, otros subdominios para ese dominio aún funcionan), eso significa que tengo suerte y la implementación de DNS de mi proveedor no ignora los registros adicionales aunque podría. Y también significa que no necesito temer ningún problema en el lado del cliente, siempre y cuando el servidor DNS lo maneje así.
didi_X8
Este es un intento de responder a otra pregunta, "por qué no se permiten los CNAME en el ápice", mientras que la pregunta real es "cómo superar esta limitación". -1.
rustyx
Para saber por qué, consulte serverfault.com/questions/613829/…
rhand
CNAME'ing un registro raíz técnicamente no es contra RFC. Deberá explicar cómo no es contra RFC1034 sección 3.6.2: Si un CNAME RR está presente en un nodo, no debería haber otros datos; esto asegura que los datos de un nombre canónico y sus alias no puedan ser diferentes. . Por supuesto, la "raíz" (que es el ápice precisamente en este contexto) ya tiene NSy SOAregistros y por lo tanto no puede tener CNAMEregistros.
Patrick Mevzek
4

No sé cómo se están saliendo con la suya, o qué efectos secundarios negativos pueden tener, pero estoy usando Hover.com para alojar algunos de mis dominios, y recientemente configuré el ápice de mi dominio como CNAME allí. Su herramienta de edición de DNS no se quejó en absoluto, y mi dominio se resuelve felizmente a través del CNAME asignado.

Esto es lo que me muestra Dig para este dominio (dominio real ofuscado como midominio.com):

; <<>> DiG 9.8.3-P1 <<>> mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2056
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.com.          IN  A

;; ANSWER SECTION:
mydomain.com.       394 IN  CNAME   myapp.parseapp.com.
myapp.parseapp.com. 300 IN  CNAME   parseapp.com.
parseapp.com.       60  IN  A   54.243.93.102
Mason G. Zhwiti
fuente
La ofuscación, si es realmente necesaria (el DNS es público ...), debería utilizar la guía RFC2606. Y RFC5737 o 3849 para direcciones IP
Patrick Mevzek
3

Mi empresa hace lo mismo con una serie de clientes en los que les alojamos un sitio web, aunque en nuestro caso es xyz.company.com en lugar de www.company.com. Conseguimos que establezcan el registro A en xyz.company.com para apuntar a una dirección IP que les asignamos.

En cuanto a cómo podría hacer frente a un cambio en la dirección IP, no creo que haya una solución perfecta. Algunas ideas son:

  • Utilice un equilibrador de carga NAT o IP y proporcione a sus clientes una dirección IP que le pertenezca. Si la dirección IP del servidor web necesita cambiar, puede realizar una actualización en el NAT o en el balanceador de carga,

  • Ofrezca también un servicio de alojamiento de DNS y haga que sus clientes alojen su dominio con usted para que esté en condiciones de actualizar los registros A,

  • Consiga que sus clientes establezcan su registro A en un servidor web principal y utilicen un redireccionamiento HTTP para las solicitudes web de cada cliente.

sipwiz
fuente
3

Sipwiz tiene razón, la única forma de hacer esto correctamente es el enfoque híbrido HTTP y DNS. Mi registrador es un revendedor de Tucows y ofrecen reenvío de dominio raíz como un servicio de valor agregado gratuito.

Si su dominio es blah.com, le preguntarán a dónde desea que se reenvíe el dominio y escriba www.blah.com. Asignan el registro A a su servidor Apache y agregan automáticamente blah.com como un vhost de DNS. El vhost responde con un error HTTP 302 que los redirige a la URL adecuada. Es simple de programar / configurar y puede ser manejado por un hardware de gama baja que, de lo contrario, sería desechado.

Ejecute el siguiente comando para ver un ejemplo: curl -v eclecticengineers.com

MrEvil
fuente
3

Debe poner un punto al final del dominio externo para que no crea que se refiere a cliente1.mycompanydomain.com.localdomain;

Así que solo cambia:

customer1.com IN CNAME customer1.mycompanydomain.com

A

customer1.com IN CNAME customer1.mycompanydomain.com.
Gwerks
fuente
Para mí (BIND 9.8.2), si los registros son para el dominio customer1.com, esto funciona ... pero se interpreta como especificar CNAMe para un subdominio customer1.com.customer1.com. Si agrego un punto al primer elemento, el registro se interpretará correctamente, pero ya no funciona. No veo ninguna solución aquí.
Jussi Hirvi
-2

Veo que readytocloud.com está alojado en Apache 2.2.

Existe una forma mucho más simple y eficiente de redirigir el sitio que no es www al sitio www en Apache.

Agregue las siguientes reglas de reescritura a las configuraciones de Apache (ya sea dentro del host virtual o afuera. No importa):

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]

O las siguientes reglas de reescritura si desea una asignación 1 a 1 de las URL del sitio que no es www al sitio www:

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule (.*) http://www.readytocloud.com$1 [R=301,L]

Tenga en cuenta que es necesario cargar el módulo mod_rewrite para que esto funcione. Afortunadamente, readytocloud.com se ejecuta en una caja CentOS, que de forma predeterminada carga mod_rewrite.

Tenemos un servidor cliente que ejecuta Apache 2.2 con poco menos de 3.000 dominios y casi 4.000 redireccionamientos, sin embargo, la carga en el servidor ronda entre 0,10 y 0,20.

Owen Blacker
fuente
La pregunta era sobre DNS. No se trata del servidor web Apache.
SamTzu
-7

Gracias tanto a sipwiz como a MrEvil. Desarrollamos un script PHP que analizará la URL que ingresa el usuario y la pegará wwwen la parte superior. (por ejemplo, si el cliente ingresa a kiragiannis.com , lo redireccionará a www.kiragiannis.com ). Entonces, nuestro cliente apunta su raíz (por ejemplo, customer1.compara Aregistrar dónde está nuestro redirector web) y luego www CNAMEal Aregistro real administrado por nosotros.

Debajo del código en caso de que esté interesado para nosotros en el futuro.

<?php
$url = strtolower($_SERVER["HTTP_HOST"]);

if(strpos($url, "//") !== false) { // remove http://
  $url = substr($url, strpos($url, "//") + 2);
}

$urlPagePath = "";
if(strpos($url, "/") !== false) { // store post-domain page path to append later
  $urlPagePath = substr($url, strpos($url, "/"));
  $url = substr($url, 0, strpos($url,"/"));
}


$urlLast = substr($url, strrpos($url, "."));
$url = substr($url, 0, strrpos($url, "."));


if(strpos($url, ".") !== false) { // get rid of subdomain(s)
  $url = substr($url, strrpos($url, ".") + 1);
}


$url = "http://www." . $url . $urlLast . $urlPagePath;

header( "Location:{$url}");
?>
Geo
fuente
10
En realidad, esto no responde a la pregunta que más de 69.000 personas han venido buscando a este hilo. La pregunta es más sobre DNS y no tiene nada que ver con PHP.
Matt Clark
1
La pregunta era sobre DNS. No se trata de codificación PHP.
SamTzu
HTTP_HOST es el nombre de host, como su nombre lo indica, no una URL. Por lo tanto, no habrá ninguno http://para eliminar, ni /( $urlPagePathsiempre estará vacío). Cfr . Httpd.apache.org/docs/2.4/expr.html . Debido a la forma en que el código intenta deshacerse del subdominio, tampoco funcionará para cosas como www.example.co.ukdónde co.ukdebe considerarse como un todo. Tampoco maneja HTTPS. Y finalmente usar PHP simplemente hacer una redirección HTTP donde cualquier servidor web puede hacerlo en la configuración, es demasiado complicado. Entonces, en resumen, esta ciertamente no debería ser la respuesta validada para esta pregunta.
Patrick Mevzek
Si esta regla debe aplicarse a todos los hosts, entonces debe hacerse como una configuración de apache
Svetoslav Marinov