Come superare le restrizioni CNAME del dominio principale?


117

Ospitiamo molte applicazioni web per i nostri clienti. Come è ovvio, desiderano utilizzare i propri domini per fare riferimento a quelle applicazioni, di solito lo desiderano qualsiasi utente che digiti http://www.customer1.exampleo http://customer1.exampleacceda alla propria applicazione web.

La situazione che stiamo affrontando è che dobbiamo avere la flessibilità per modificare gli indirizzi IP nel prossimo futuro. E non vogliamo fare affidamento sul fatto che il cliente esegua la modifica del record A sui propri domini. Quindi abbiamo pensato che l'uso dei CNAMErecord funzionerà, ma come abbiamo scoperto i CNAMErecord non funzioneranno per il dominio principale.

Fondamentalmente:

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

Vogliamo essere in grado di modificare l'indirizzo IP customer1.mycompanydomain.exampleo il Arecord ei nostri clienti seguiranno questo record su cui abbiamo il controllo.

nel nostro DNS apparirà come:

customer1.mycompanydomain.example IN A 192.0.2.1

Qualche idea?


Non capisco perché "customer1.com IN CNAME customer1.mycompanydomain.com" non è valido. Credo che dovrebbe funzionare. Potresti spiegare dov'era il problema con quella soluzione?
sleske

3
Sì, leggi la seguente domanda e risposta. Non è valido secondo il DNS RFC. stackoverflow.com/questions/655235/…
Geo

2
Non capisco il titolo della domanda. Dov'è coinvolta la "radice" (.)?
bortzmeyer

2
significa la radice di una zona, non "la radice"
Alnitak

2
Bene, allora non è il solito vocabolario DNS. Non è "apice" la parola corretta? O "di primo livello" per i programmatori Lisp? :-)
bortzmeyer

Risposte:


63

Il motivo per cui questa domanda si pone ancora spesso è perché, come hai detto, da qualche parte qualcuno ritenuto importante ha scritto che la RFC afferma che i nomi di dominio senza sottodominio davanti a loro non sono validi. Se leggi attentamente l'RFC, tuttavia, scoprirai che non è esattamente quello che dice. Infatti, RFC 1912 afferma:

Non esagerare con i CNAME. Usali per rinominare gli host, ma pianifica di sbarazzartene (e informa i tuoi utenti).

Alcuni host DNS forniscono un modo per ottenere funzionalità simili a CNAME all'apice della zona (il livello di dominio principale, per il nome di dominio semplice) utilizzando un tipo di record personalizzato. Tali record includono, ad esempio:

  • ALIAS presso DNSimple
  • ANAME presso DNS Made Easy
  • ANAME presso easyDNS
  • CNAME presso CloudFlare

Per ogni provider, la configurazione è simile: punta la voce ALIAS o ANAME per il tuo dominio apex su example.domain.com, proprio come faresti con un record CNAME. A seconda del provider DNS, un valore vuoto o @ Name identifica l'apice della zona.

ALIAS o ANAME o @ example.domain.com.

Se il tuo provider DNS non supporta questo tipo di record e non sei in grado di passare a uno che lo fa, dovrai utilizzare il reindirizzamento del sottodominio, che non è così difficile, a seconda del protocollo o del software del server che deve farlo .

Non sono assolutamente d'accordo con l'affermazione secondo cui è fatto solo da "amministratori dilettanti" o idee simili. È un semplice "Cosa devono fare il nome e il suo servizio?" trattare e quindi adattare la configurazione DNS per soddisfare tali desideri; Se i tuoi servizi principali sono web ed e-mail, non vedo alcun motivo VALIDO per cui abbandonare definitivamente i CNAME sarebbe problematico. Dopo tutto, chi preferirebbe @ sottodominio.dominio.org a @ dominio.org? Chi ha bisogno di "www" se hai già impostato il protocollo stesso? Non è logico presumere che l'uso di un nome dominio root non sia valido.


1
Questa particolare risposta mi è stata molto utile poiché volevo puntare un dominio di livello principale a un CDN. La maggior parte dei CDN sono necessariamente un FQDN, poiché potrebbe risolversi in IP diversi in luoghi o orari diversi. Uso DNS Made Easy e sono stato in grado di utilizzare il tipo di record ANAME.
Rubix

3
Non potrei essere più d'accordo. Voler ospitare un sito dal nome di dominio "nudo" è una cosa comune e logica da fare. Usa meno caratteri, ha un aspetto migliore, ecc. L'identificatore di protocollo dell'URL (www) è una parte vestigiale dell'URL se era addirittura necessario in primo luogo (non lo era).
Ed Bishop

3
Gli ANAME sono carini, oppure puoi solo 301 tutti i non www a www. tramite il servizio di reindirizzamento 301 gratuito 198.251.86.133
Jacob Evans,

51

CNAME'ing un record di root non è tecnicamente contro RFC, ma ha dei limiti, il che significa che è una pratica che non è raccomandata.

Normalmente il tuo record di root avrà più voci. Diciamo 3 per i tuoi server dei nomi e poi uno per un indirizzo IP.

Per RFC:

Se un CNAME RR è presente in un nodo, non dovrebbero essere presenti altri dati;

E secondo il documento IETF "Errori operativi e di configurazione DNS comuni":

Questo è spesso tentato da amministratori inesperti come un modo ovvio per consentire al tuo nome di dominio di essere anche un host. Tuttavia, i server DNS come BIND vedranno il CNAME e si rifiuteranno di aggiungere altre risorse per quel nome. Poiché nessun altro record può coesistere con un CNAME, le voci NS vengono ignorate. Pertanto anche tutti gli host nel dominio podunk.xx vengono ignorati!

Riferimenti:


17
Ma PERCHÉ nessun altro record può coesistere con un CNAME. È solo una limitazione aggiunta dall'autore dell'RFC o c'è una ragione tecnica? Se non ci sono ragioni tecniche, si potrebbe facilmente trovare un'estensione RFC.
Sven

Quindi, se funziona per me (usa CNAME per il record di root, altri sottodomini per quel dominio funzionano ancora), significa che sono solo fortunato e l'implementazione DNS del mio provider non ignora quei record aggiuntivi, anche se potrebbe? E significa anche che non devo temere alcun problema sul lato client, a patto che il server DNS lo gestisca in questo modo?
didi_X8

Questo è un tentativo di rispondere a un'altra domanda, "perché i CNAME non sono consentiti all'apice", mentre la vera domanda è "come superare questa limitazione". -1.
rustyx


CNAME'ing a root record non è tecnicamente contro RFC , sarà necessario spiegare come non è contro RFC1034 sezione 3.6.2: Se un CNAME RR è presente in un nodo, non dovrebbero essere presenti altri dati; ciò garantisce che i dati per un nome canonico e i suoi alias non possano essere diversi. . Ovviamente la "radice" (cioè l'apice proprio in questo contesto) ha già NSe SOAregistra e quindi non può avere CNAMErecord.
Patrick Mevzek

4

Non so come se la passano liscia o quali effetti collaterali negativi possano essere, ma sto usando Hover.com per ospitare alcuni dei miei domini e recentemente ho impostato l'apice del mio dominio come CNAME lì. Il loro strumento di modifica DNS non si è lamentato affatto e il mio dominio si risolve felicemente tramite il CNAME assegnato.

Ecco cosa mi mostra Dig per questo dominio (dominio effettivo offuscato come miodominio.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

L'offuscamento, se realmente necessario (il DNS è pubblico ....), dovrebbe utilizzare la guida RFC2606. E RFC5737 o 3849 per gli indirizzi IP
Patrick Mevzek

3

La mia azienda fa la stessa cosa per un certo numero di clienti in cui ospitiamo un sito web per loro, sebbene nel nostro caso sia xyz.company.com anziché www.company.com. Li induciamo a impostare il record A su xyz.company.com in modo che punti a un indirizzo IP che assegniamo loro.

Per quanto riguarda il modo in cui potresti far fronte a un cambiamento nell'indirizzo IP, non credo che ci sia una soluzione perfetta. Alcune idee sono:

  • Utilizza un bilanciatore del carico NAT o IP e dai ai tuoi clienti un indirizzo IP che gli appartiene. Se è necessario modificare l'indirizzo IP del server Web, è possibile eseguire un aggiornamento sul NAT o sul bilanciamento del carico,

  • Offri anche un servizio di hosting DNS e fai in modo che i tuoi clienti ospitino il loro dominio con te in modo da essere in grado di aggiornare i record A,

  • Convinci i tuoi clienti a impostare il loro record A su un server web principale e usa un reindirizzamento HTTP per le richieste web di ogni cliente.


3

Sipwiz è corretto, l'unico modo per farlo correttamente è l'approccio ibrido HTTP e DNS. Il mio registrar è un rivenditore per Tucows e offre l'inoltro del dominio principale come servizio gratuito a valore aggiunto.

Se il tuo dominio è blah.com ti chiederanno dove desideri che venga inoltrato il dominio e tu digiti www.blah.com. Assegnano il record A al loro server Apache e aggiungono automaticamente blah.com come vhost DNS. Il vhost risponde con un errore HTTP 302 reindirizzandolo all'URL corretto. È semplice da programmare / configurare e può essere gestito dalla fascia bassa altrimenti sarebbe hardware scartato.

Eseguire il comando seguente per un esempio: curl -v eclecticengineers.com


3

Devi mettere un punto alla fine del dominio esterno in modo che non pensi che tu intenda cliente1.mycompanydomain.com.localdomain;

Quindi cambia solo:

customer1.com IN CNAME customer1.mycompanydomain.com

Per

customer1.com IN CNAME customer1.mycompanydomain.com.

Per me (BIND 9.8.2), se i record sono per il dominio customer1.com, funziona ... ma viene interpretato come la specifica CNAMe per un sottodominio customer1.com.customer1.com. Se aggiungo un punto al primo elemento, il record verrà interpretato correttamente, ma non funziona più. Non vedo alcuna soluzione qui.
Jussi Hirvi

-2

Vedo che readytocloud.com è ospitato su Apache 2.2.

C'è un modo molto più semplice ed efficiente per reindirizzare il sito non www al sito www in Apache.

Aggiungi le seguenti regole di riscrittura alle configurazioni di Apache (all'interno dell'host virtuale o all'esterno. Non importa):

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

Oppure, le seguenti regole di riscrittura se desideri una mappatura 1-a-1 degli URL dal sito non www al sito www:

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

Nota, il modulo mod_rewrite deve essere caricato affinché funzioni. Fortunatamente readytocloud.com funziona su una scatola CentOS, che per impostazione predefinita carica mod_rewrite.

Abbiamo un server client che esegue Apache 2.2 con poco meno di 3.000 domini e quasi 4.000 reindirizzamenti, tuttavia, il carico sul server si aggira intorno a 0.10 - 0.20.


La domanda riguardava il DNS. Non per il server web Apache.
SamTzu

-7

Grazie sia a sipwiz che a MrEvil. Abbiamo sviluppato uno script PHP che analizzerà l'URL immesso dall'utente e incollerà wwwall'inizio di esso. (ad esempio, se il cliente accede a kiragiannis.com , verrà reindirizzato a www.kiragiannis.com ). Quindi il nostro cliente punta la sua radice (ad esempio customer1.comper Aregistrare dove si trova il nostro web redirector) e poi www CNAMEal Arecord reale gestito da noi.

Di seguito il codice nel caso foste interessati a noi futuri.

<?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}");
?>

10
Questo in realtà non risponde alla domanda che più di 69k persone sono venute in questo thread cercando. La domanda riguarda più il DNS e non ha nulla a che fare con PHP.
Matt Clark

1
La domanda riguardava il DNS. Non sulla codifica PHP.
SamTzu

HTTP_HOST è il nome host, come suggerisce il nome, non un URL. Quindi non ci sarà nessuno http://da rimuovere, né /( $urlPagePathsarà sempre vuoto). Cf httpd.apache.org/docs/2.4/expr.html . A causa del modo in cui il codice cerca di sbarazzarsi del sottodominio, non funzionerà nemmeno per cose come www.example.co.ukdove co.ukdeve essere considerato nel suo insieme. Inoltre non gestisce HTTPS. E infine usare PHP basta fare un reindirizzamento HTTP in cui qualsiasi server web può farlo in configurazione, è troppo complicato. Quindi, in breve, questa non dovrebbe certamente essere la risposta convalidata a questa domanda.
Patrick Mevzek

Se questa regola dovrebbe essere applicata a tutti gli host, dovrebbe essere eseguita come configurazione di apache
Svetoslav Marinov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.