@ Відповідь Свена, з редагуванням, вже правильна, але просто для прямого формулювання речей.
TL; DR так підкреслення дійсне в CNAME
записі з обох сторін, читайте нижче, чому.
RFC 1034 та інші визначають записи на основі "доменних імен", які є мітками з будь-яким символом, у тому числі _
.
Але деякі записи мають більш жорсткі правила щодо імені власника та / або даних ресурсу (RDATA). Там буде прийнято лише ім'я хоста, і справді зараз правила (вони були розслаблені в минулому, коли ім'я хоста не можна було починати з цифри), що ви можете використовувати будь-яку літеру ASCII (без чутливості до регістру), будь-які цифри ASCII та дефіси , а також деякі додаткові правила позиції: відсутність дефісів на початку чи в кінці та відсутність подвійних дефісів у позиціях 3 та 4 (через "бронювання" для IDN, які мають форму, 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:
"власник: яке доменне ім'я, де знайдено 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
записів, як справжня зона)