@ Ответ Свена, с правкой, уже правильный, но только для того, чтобы прямо сформулировать.
TL; DR да подчеркивание действительно в CNAME
записи с обеих сторон, читайте ниже, почему.
RFC 1034 и другие определяют записи на основе «доменных имен», которые представляют собой метки с любым символом, в том числе _
.
Но некоторые записи имеют более строгие правила для имени владельца и / или данных ресурса (RDATA). Там будет принято только имя хоста, и теперь действительно действуют правила (они были смягчены в прошлом, когда имя хоста не могло начинаться с цифры), что вы можете использовать любую букву ASCII (без учета регистра), любые цифры ASCII и дефисы плюс некоторые дополнительные правила позиции: без дефиса в начале или в конце и без двойных дефисов в позициях 3 и 4 (из-за «резервирования» для ИДИ, имеющих форму, xn--
которая допускается только в случае).
Например, имя владельца записи A
или AAAA
- это имя хоста, а не имя домена. Так
test.example.com A 192.0.2.1
действительно, почему все это не так:
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
Это легко проверить с помощью named-checkzone
программы (часть bind
программного обеспечения сервера имен, но она может использоваться и устанавливаться отдельно, а другие серверы имен могут иметь аналогичные инструменты проверки, и в любом случае, вероятно, для этого тоже есть онлайн-интерфейсы), просто поместите записи в файл и запустите это на:
$ 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)
(число перед IN
TTL, это не имеет отношения к нашей проблеме здесь, но необходимо только для проверки синтаксиса записи).
Для других записей все наоборот: для NS
владельца нет никаких ограничений, но есть ограничения для «цели», которой являются данные. Данные могут быть только именем хоста, но не именем домена, потому что вам нужно указать на авторитетные серверы имен, которые являются физическими хостами, которые отвечают на запросы DNS.
Теперь о CNAME
, вот соответствующие цитаты из RFC 1034, в разделе 3.6:
msgstr "владелец: это доменное имя, где находится RR." что означает по умолчанию любое имя, а не просто имя хоста (как источник записи CNAME)
«RDATA: это тип и иногда зависящие от класса данные, которые описывают ресурс:»
"CNAME доменное имя."
Таким образом, как владелец объекта CNAME
(который находится слева от него), так и данные о ресурсах, прикрепленные к нему, его назначение / назначение (что находится справа от него) являются доменными именами, а не только именами хостов. В основном любой персонаж, поэтому включение _
разрешено с обеих сторон.
Опять же, легко проверить с помощью 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.
Никаких ошибок в этом нет CNAME
(другие ошибки ожидаются, так как в моей фальшивой зоне я не ставил ни одной, SOA
или NS
записи, как у настоящей зоны)