La risposta di @ Sven, con la modifica, è già giusta, ma solo per esprimere le cose direttamente.
TL; DR Sì il carattere di sottolineatura è valido in un CNAME
record su entrambi i lati, leggi sotto per il perché.
RFC 1034 e altri definiscono i record in base a "nomi di dominio" che sono etichette con qualsiasi carattere, incluso _
.
Ma alcuni record hanno regole più rigide per il nome del proprietario e / o i dati delle risorse (RDATA). Verrà accettato solo un nome host e in effetti le regole sono ora (in passato erano rilassate in cui un nome host non poteva iniziare con una cifra) che è possibile utilizzare qualsiasi lettera ASCII (nessuna distinzione tra maiuscole e minuscole), qualsiasi cifra ASCII e i trattini , oltre ad alcune regole di posizione extra: nessun trattino all'inizio o alla fine e nessun trattino doppio nelle posizioni 3 e 4 (a causa della "prenotazione" per gli IDN che sono nel modulo xn--
che è solo il caso consentito).
Ad esempio, il nome del proprietario di A
o AAAA
record è un nome host, non un nome di dominio. Quindi
test.example.com A 192.0.2.1
è valido perché tutti questi non lo sono:
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
È facile testare le cose con il named-checkzone
programma (parte del bind
software nameserver ma può essere usato e installato separatamente e altri nameserver possono avere strumenti di controllo simili e probabilmente ci sono anche interfacce online per quello), basta mettere i record in un file ed eseguire su:
$ cat z1.txt
test.example.com. 1 IN A 192.0.2.1
_test.example.com. 1 IN A 192.0.2.1
-test.example.com. 1 IN A 192.0.2.1
test-.example.com. 1 IN A 192.0.2.1
$ /usr/local/sbin/named-checkzone example.com z1.txt
z1.txt:2: _test.example.com: bad owner name (check-names)
z1.txt:3: -test.example.com: bad owner name (check-names)
z1.txt:4: test-.example.com: bad owner name (check-names)
(il numero prima di IN
è il TTL, questo non è correlato al nostro problema qui, ma era necessario solo per passare la convalida della sintassi di un record).
Per altri record, è il contrario: perché NS
non ci sono restrizioni sul proprietario, ma restrizioni sulla "destinazione" che sono i dati. I dati possono essere solo un nome host, non un nome di dominio, poiché è necessario puntare a server dei nomi autorevoli che sono host fisici che rispondono alle query DNS.
Ora a proposito CNAME
, ecco le citazioni rilevanti da RFC 1034, nella sezione 3.6:
"proprietario: qual è il nome di dominio in cui si trova la RR." il che significa per impostazione predefinita qualsiasi nome, non solo un nome host (come fonte del record CNAME)
"RDATA: che è il tipo e talvolta i dati dipendenti dalla classe che descrivono la risorsa:"
"CNAME un nome di dominio."
Quindi sia il proprietario di un CNAME
(ciò che è alla sua sinistra), sia i dati delle risorse ad esso collegati, la sua destinazione / destinazione (ciò che è alla sua destra) sono nomi di dominio e non solo nomi di host. Praticamente qualsiasi personaggio, incluso l'inclusione _
è consentito su entrambi i lati.
Ancora una volta, facile da testare con named-checkzone
:
$ cat z2.txt
_foo 1 CNAME _bar
$ /usr/local/sbin/named-checkzone example.com z2.txt
zone example.com/IN: has 0 SOA records
zone example.com/IN: has no NS records
zone example.com/IN: not loaded due to errors.
Nessun errore di sorta CNAME
(gli altri errori sono previsti poiché nella mia zona falsa non ho inserito alcuno SOA
o i NS
record come una zona vera avrebbero)