Настройка файлов зон для tinydns и axfrdns из djbdns
Содержание
- Содержание
- Введение
- Комментарии
- Классификация клиентов
- Настройка записи SOA
- Настройка записей NS
- Настройка записей A
- Настройка записей MX
- Настройка записей PTR
- Настройка записей CNAME
- Настройка записей TXT
- Настройка записей SRV
- Настройка записей NAPTR
- Получение копии зоны с помощью axfr-get
- Дополнительные материалы
Введение
Прежде всего стоит заметить, что в отличие от других DNS-серверов, данных разных зон в tinydns
хранятся в одном файле.
Комментарии
Комментарии можно помещать в строки, начинающиеся с символа #
.
Классификация клиентов
Клиентов, обращающихся с запросами к серверу, можно отнести к какому-либо классу. Для этого нужно создать в файле запись следующего вида:
%lo:ipprefix
Где:
lo
- обозначение класса,ipprefix
- IP-префикс клиентов, соответствующих этому классу.
Например, чтобы отличать локальных клиентов с IP-адресами из сети 192.168.0.0/16 от остальных клиентов, можно добавить в файл две записи:
%in:192.168
%ex
Тогда класс in
будет соответствовать локальным клиентам, а класс ex
будет соответствовать всем остальным, внешним клиентам.
Т.к. каждой записи в базе данных может быть сопоставлен определённый класс, можно создавать записи, которые будут видны только клиентам определённого класса или отдавать клиентам разных классов разные записи. То есть с помощью классов можно реализовывать функционал, подобный представлениями в DNS-сервере BIND.
Настройка записи SOA
Общий вид записи SOA следующий:
Zfqdn:mname:rname:ser:ref:ret:exp:min:ttl:timestamp:lo
Где:
Z
- тип записи SOA,fqdn
- имя доменной зоны,mname
- доменное имя первичного сервера имён,rname
- почтовый ящик администратора доменной зоны, где первая точка соответствует символу@
,ser
- серийный номер доменной зоны,ref
- время обновления в секундах (по умолчанию 16384 секунд или 4 часа 33 минуты 6 секунд),ret
- время повтора в секундах (по умолчанию 2048 секунд или 34 минуты 8 секунд),exp
- время истечения срока действия в секундах (по умолчанию 1048576 секунд или 12 дней 3 часа 16 минут 16 секунд),min
- минимальное время в секундах (по умолчанию 2560 секунд или 42 минуты 40 секунд),ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300, а значение меньше 2 для записей типа NS может привести к проблемам поиска по имени),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Поля ref
, ret
, exp
, min
могут быть не указаны. В таком случае будут использоваться значения по умолчанию.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
При получении копии зоны от другого сервера SOA-запись будет иметь следующий вид:
Zstupin.su:ns1.stupin.su.:vladimir.stupin.su.:2022010601:10800:3600:604800:3600:10800
Можно попытаться сопоставить её с оригинальным определением:
$TTL 3h
stupin.su. IN SOA ns1.stupin.su. vladimir.stupin.su. 2022010601 3h 1h 1w 1h
Стоит заметить, что этот тип записей предназначен только для зон, скопированных с другого сервера имён. Для определения SOA-записей более естественным для tinydns
способом стоит воспользоваться следующим разделом, где описана настройка NS-записей.
Настройка записей NS
Общий вид определения NS-записи вместе с SOA-записью:
.fqdn:ip:x:ttl:timestamp:lo
Определение NS-записи без SOA-записи:
&fqdn:ip:x:ttl:timestamp:lo
Где:
.
- тип записи NS вместе с SOA-записью. Применяется для доменных зон, делегированных серверу,&
- тип записи NS. Применяется для делегирования доменных зон другим серверам,fqdn
- имя доменной зоны,ip
- IP-адрес сервера имён. Если указан, то будет создана A-запись, созданная из этого IP-адреса и имени сервера, указанного в полеx
,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300, а значение меньше 2 для записей типа NS может привести к проблемам поиска по имени),x
- имя сервера имён. Если в имени есть точка, то это полное имя сервера. Если точки нет, то имя сервера имён будет иметь видx
.ns.fqdn
,timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей A
Для настройки A-записи вместе с PTR-записью используется следующий формат:
=fqdn:ip:ttl:timestamp:lo
Для настройки дополнительных A-записи или A-записей без PTR-записи используется следующий формат:
+fqdn:ip:ttl:timestamp:lo
Для временно отключенных записей используется следующий формат:
-fqdn:ip:ttl:timestamp:lo
Где:
=
- тип записи A вместе с PTR-записью,+
- тип записи A,-
- временно отключенная A-запись,fqdn
- доменное имя,ip
- IP-адрес,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей MX
Для настройки MX-записей используется следующий формат:
@fqdn:ip:x:dist:ttl:timestamp:lo
Где:
@
- тип записи MX,fqdn
- доменное имя почтового сервера,ip
- IP-адрес почтового сервера. Если указан, то будет создана A-запись, созданная из этого IP-адреса и имени сервера, указанного в полеx
,x
- имя почтового сервера. Если в имени есть точка, то это полное имя сервера. Если точки нет, то имя сервера имён будет иметь видx
.mx.fqdn
,dist
- дистанция до почтового сервера. Если не указана, то используется значение 0,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей PTR
Формат файла таков, что PTR-записи можно определять вместе с A-записями с префиксом =
. Но при необходимости можно определить PTR-запись отдельно, следующим образом:
^fqdn:ip:ttl:timestamp:lo
Где:
^
- тип записи PTR,fqdn
- доменное имя, на которое будет указывать PTR-запись,ip
- IP-адрес PTR-записи,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей CNAME
Вместо определения CNAME-записей лучше определить дополнительные A-записи с помощью префикса +
. Но если вам всё-таки по каким-то неизвестным причинам понадобится создать CNAME-записи, то определить их можно следующим образом:
Cfqdn:p:ttl:timestamp:lo
Где:
^
- тип записи CNAME,fqdn
- ссылающееся доменное имя,p
- целевое доменное имя,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей TXT
Для добавления записей типа TXT предусмотрен следующий формат:
'fqdn:s:ttl:timestamp:lo
Где:
'
- тип записи TXT,fqdn
- доменное имя,s
- текст, соответствующий доменному имени. В тексте поддерживается возможность указать символ при помощи его восмеричного кода в виде\nnn
, например,\072
для двоеточия,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей SRV
По ссылке djbdns tools by Rob Mayoff можно найти Perl-скрипт для создания SRV-записей в формате djbdns и справку по использованию этого скрипта.
По ссылке 030-srv-records-and-axfrget.patch можно найти патч, добавляющий в djbdns поддержку записей типа SRV.
По ссылке Integrated the SRV+NAPTR ancient patch можно найти патч, добавляющий в djbdns поддержку записей типа SRV и NAPTR. По ссылке Added documentation of the patch можно найти документацию к этому патчу.
Формат SRV-записи, добавляемый патчем:
Sfqdn:ip:x:port:weight:priority:ttl:timestamp
Где:
S
- тип записи SRV,fqdn
- доменное имя сервера,ip
- IP-адрес сервера. Если указан, то будет создана A-запись, созданная из этого IP-адреса и имени сервера, указанного в полеx
,x
- имя сервера. Если в имени есть точка, то это полное имя сервера. Если точки нет, то имя сервера имён будет иметь видx
.srv.fqdn
,ttl
- время жизни записи в секундах (учтите, что некоторые кэширующие серверы воспринимают значение меньше 300 как 300),timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Настройка записей NAPTR
Формат записи, добавляемой патчем:
Nfqdn:order:pref:flags:service:regexp:replacement:ttl:timestamp
Где:
S
- тип записи SRV,fqdn
- доменное имя сервера,order
-pref
-flags
-service
-regexp
-replacement
-timestamp
- отметка времени в формате TAI64,lo
- класс клиента, для которого действительна эта запись.
Если в поле ttl
указан 0, то в поле timestamp
указано время окончания действия записи. Если значение в поле ttl
не нулевое или отсутствует, то в поле timestamp
указано время начала действия записи. Посчитать значение для поля timestamp
можно с помощью следующих команд:
$ echo "obase=16;" `date +%s --date="2023-12-01 00:00:00"` "+ 2^62" | bc
Получение копии зоны с помощью axfr-get
Для получения копии зоны с удалённого DNS-сервера по протоколу AXFR можно воспользоваться командой такого вида:
$ tcpclient -l localhost -RH 192.168.252.1 53 axfr-get stupin.su data1 data1.tmp
Где:
192.168.252.1
- IP-адрес удалённого DNS-сервера,53
- TCP-порт удалённого DNS-сервера,stupin.su
- доменная зона, копию которой нужно получить,data1
- имя файла, в который нужно поместить копию зоны,data1.tmp
- имя временного файла, который будет использоваться в процессе приёма копии зоны до тех пор, пока она не будет принята полность.
В команде также фигурируют неочевидные опции -l localhost -RH
. У меня ушло некоторое время, чтобы понять, почему получение копии не работало. Подключение устанавливалось с большой задержкой, а затем закрывалось по таймауту ожидания данных. Оказалось, что tcpclient
пытается узнать доменные имена участвующих в обмене сторон по их IP-адресам, чтобы присвоить эту информацию переменным окружения TCPLOCALHOST
, TCPREMOTEHOST
и TCPREMOTEINFO
и передать их axfr-get
. Этой информации не было в DNS, кэширующий сервер dnscache
отвечал с большой задержкой и сообщением об ошибке, а tcpclient
пытался повторить запросы. В результате установка связи затягивалась, а удалённый DNS-сервер, так и не дождавшись запроса, просто закрывал подключение.
Дополнительные материалы
- Настройка авторитетного UDP-сервера DNS, который называется
tinydns
, описана в статье Настройка tinydns из djbdns в NetBSD. - Настройка авторитетного TCP-сервера DNS, который называется
axfrdns
, описана в статье Настройка axfrdns из djbdns в NetBSD. - Описание формата журналов tinydns можно найти в статье Rob Mayoff. tinydns Log File Format
- Разнообразные заплатки к пакету dnbdns, используемые в проекте OpenWRT, можно найти в git-репозитории проекта openwrt djbdns patches
- Описание форматов записей и метода расчёта значения поля
timestamp
можно найти в статье TinyDNS Format - Хорошее описание процедуры миграции с одной записи на другую можно найти в статье Cory Wright. djbdns: More Than Just a Mouthful of Consonants