При настройке зоны BIND DNS я часто задаюсь вопросом, почему существуют оба @
и *
чтобы указать псевдоним для имени зоны. Есть ли разница между ними?
@
переводится как доменное имя зоны, на которую оно также ссылается. Это использовалось в файле зоны для example.com, затем @
будет равно example.com. С другой стороны *
это подстановочный знак, означающий что угодно.
Вот пример того, как я использую эти два символа в файле зоны:
; SOA Record
EXAMPLE.NET. 3600 IN SOA ns1.example.com. dns.example.net. (
2010031000
28800
7200
604800
86400
)
; A Records
@ 3600 IN A 192.168.1.212
@ 3600 IN A 192.168.1.214
; CNAME Records
www 3600 IN CNAME @
* 3600 IN CNAME @
; NS Records
@ 3600 IN NS ns1.example.com
@ 3600 IN NS ns2.example.com
В этом примере я определяю зону для EXAMPLE.NET, используя DNS-серверы EXAMPLE.COM. У меня есть 2 IP-адреса, которые я назначаю записям A для домена, поэтому EXAMPLE.NET указывает как на 192.168.1.212, так и на 192.168.1.214. Затем я определяю пару записей CNAME, www и волшебный *
которые оба указывают на @
или как это интерпретируется EXAMPLE.NET
. Также есть записи NS, использующие @
символ вместо того, чтобы печатать EXAMPLE.NET
.
Таким образом, вы можете перевести этот файл зоны как:
; SOA Record
EXAMPLE.NET. 3600 IN SOA ns1.example.com. dns.example.net. (
2010031000
28800
7200
604800
86400
)
; A Records
EXAMPLE.NET. 3600 IN A 192.168.1.212
EXAMPLE.NET. 3600 IN A 192.168.1.214
; CNAME Records
www 3600 IN CNAME EXAMPLE.NET.
* 3600 IN CNAME EXAMPLE.NET.
; NS Records
EXAMPLE.NET. 3600 IN NS ns1.example.com
EXAMPLE.NET. 3600 IN NS ns2.example.com
Обе версии идентичны. В @
просто становится EXAMPLE.NET
и *
означает все, что вы могли придумать. Используя *
подстановочный знак, вы можете настроить веб-сервер для домена, а затем настроить несколько виртуальных хостов в этом домене без повторного изменения DNS. host1.example.net, blah.example.net и doiexist.example.net будут указывать на одно и то же местоположение, даже если они не указаны специально в файле зоны из-за *
подстановочный знак.
В дополнение к тому, что сказал Билл Вайс, я хотел бы отметить, что *
означает "все возможные субдомены / метки, кроме уже имеющихся", это означает, что я могу иметь
$ORIGIN EXAMPLE.NET.
a IN A 1.2.3.4
b IN A 4.3.2.1
* IN A 8.8.8.8
и a.EXAMPLE.NET вернет 1.2.3.4 так же, как c.EXAMPLE.NET вернет 8.8.8.8
Также a.a.a.c.EXAMPLE.NET также вернет 8.8.8.8, что делает записи с подстановочными знаками немного беспорядочными. Вы можете потенциально использовать весь кеш рекурсивного сервера имен, перебирая эти имена.
*
не является псевдонимом для имени зоны. Это означает «все поддомены».
Думайте о @ как о макросе, который раскрывается во время синтаксического анализа файлов зоны, а * - это оператор, который «подбирает» (сопоставляет) все, что не соответствует ни одной из обычных записей.
Запись * позволяет настроить DNS для возврата указанных записей для запросов, которые в противном случае получили бы ответ «NXDOMAIN» (несуществующий).
«@» расширяется до текущего $ ORIGIN согласно RFC 1035. Я чаще всего видел это в записи SOA в верхней части файла зоны.
Я никогда не видел, чтобы '*' использовалось ни для чего, кроме как для соответствия чему-либо, ранее не совпавшему в записях RR (также известных как записи с подстановочными знаками).