Я управляю bind9
(9.9.5) DNS-сервер (на Debian / jessie). Я настроил одну зону для разрешения динамических обновлений и хотел бы добавить TXT
записи для определенных хостов в этой зоне.
Вот пример настройки (named.conf)
zone "example.com" {
type master;
notify yes;
allow-update { key secret-key; };
file "/etc/bind/db.example.com";
};
И сопутствующий файл db.example.com:
$ORIGIN .
$TTL 604800 ; 1 week
example.com IN SOA dns.example.com root.example.com. (
1 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS dns.example.org.
NS dns1.example.org.
NS dns2.example.org.
$ORIGIN example.com.
* MX 10 mail.example.com.
mail A 127.0.0.1
http A 127.0.1.1
Используя мой Секретный ключ, Я могу динамически добавлять новую запись прямо в эту зону (например, создать текст запись для _acme-challenge.example.com
).
Однако я действительно хочу добавить записи поддоменов для хостов в зоне. Например. в зоне example.com
, есть А запись mail.example.com
, и я хотел бы динамически добавить текст запись для _acme-challenge.mail.example.com
.
К сожалению, моему серверу имен это не нравится, и он отказывается работать с
secret-key: обновление зоны 'example.com/IN': обновление не удалось: не авторизовано для зоны обновления (NOTAUTH)
я жестяная банка добавьте эту запись вручную в db-файл, и она отлично работает.
_acme-challenge.mail TXT "secretstring"
Однако я бы хотел автоматизировать это (учитывая, что это часть развертывания сертификатов letsencrypt через DNS-01
задача), поэтому ручная установка записей не вариант.
Есть идеи, что происходит не так и как я могу автоматически обновлять свои TXT-записи?
фактическое обновление реализовано с помощью python-dnspython и выглядит так:
update = dns.update.Update("mail.example.com", ...)
update.add("_acme-challenge", 500, "TXT", token)
response = dns.query.udp(update, name_server_ip)
Оказывается, проблема действительно заключалась в том, как сценарий dnspython запрашивал обновление зоны.
Вместо запроса на добавление записи _acme-challenge.mail
к example.com
зона, вместо этого (и ошибочно) запросит запись _acme-challenge
быть добавленным к mail.example.com
зона.
Поскольку на сервере имен не было mail.example.com.
зона, он откажется обрабатывать запрос.
Решением проблемы было итеративное добавление к родительским зонам до достижения успеха (или достижения TLD):
_acme-challenge
в зону mail.example.com.
_acme-challenge.mail
в зону example.com.
_acme-challenge.mail.example
в зону com.
Я не думаю, что что-то «не так».
Мы написали сценарий, который думает, что наши тысячи доменов редактируют файл DNS вручную, а затем перезапускают службу DNS.