bind: "nsupdate -l" завершился неудачно со статусом "обновление не выполнено: ОТКАЗАНО"
Я только что перешел на bind
9.9.5 Функция динамического DNS с полуавтоматическим управлением записями DNSSEC, весь процесс прошел хорошо, и мои файлы зон были обновлены хорошо, но теперь я не могу обновить или добавить записи через nsupdate
инструмент.
/etc/bind/named.conf.local
:
// 1
view "localhost_view" {
allow-query-on { 127.0.0.1; };
allow-query { localhost_acl; };
match-clients { localhost_acl; };
zone "somehost.tld" {
type master;
file "/etc/bind/db.somehost.tld_10";
};
zone "168.192.in-addr.arpa" {
type master;
notify no;
file "/etc/bind/db.192.168.10";
};
// formerly named.conf.default-zones
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// formerly zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
};
// 2
view "internal_10_view" {
allow-query-on { 192.168.10.1; };
allow-query { internal_10_acl; };
match-clients { internal_10_acl; };
zone "somehost.tld" {
type master;
file "/etc/bind/db.somehost.tld_10";
};
zone "168.192.in-addr.arpa" {
type master;
notify no;
file "/etc/bind/db.192.168.10";
};
// formerly named.conf.default-zones
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// formerly zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
};
// 3
view "internal_150_view" {
allow-query-on { 192.168.150.1; };
allow-query { internal_150_acl; };
match-clients { internal_150_acl; };
zone "somehost.tld" {
type master;
file "/etc/bind/db.somehost.tld_150";
};
zone "168.192.in-addr.arpa" {
type master;
notify no;
file "/etc/bind/db.192.168.150";
};
// formerly named.conf.default-zones
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// formerly zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
};
// 4
view "vpn_view" {
allow-query-on { 192.168.200.1; };
allow-query { vpn_acl; };
match-clients { vpn_acl; };
zone "somehost.tld" {
type master;
file "/etc/bind/db.somehost.tld_vpn";
};
// formerly named.conf.default-zones
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// formerly zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "32.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
};
// 5
view "global_view" {
allow-query-on { 1.2.3.4; };
// match-clients { any; !localhost_acl; !internal_10_acl; !internal_150_acl; !vpn_acl; };
recursion no;
zone "somehost.tld" {
type master;
update-policy local;
auto-dnssec maintain;
file "/etc/bind/db.somehost.tld_global";
key-directory "/etc/bind/keys";
};
zone "26/4.3.2.1.in-addr.arpa" IN {
type master;
file "/etc/bind/db.rev";
};
// formerly named.conf.default-zones
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// formerly zones.rfc1918
zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
zone "32.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
};
списки контроля доступа:
acl localhost_acl {
127.0.0.0/8;
};
acl internal_10_acl {
192.168.10.0/24;
};
acl internal_150_acl {
192.168.150.0/24;
};
acl vpn_acl {
192.168.200.2;
192.168.200.5;
};
Итак update-policy local;
это здесь, /var/run/named/session.key
успешно сгенерирован и пользователь bind
читабельно, но когда я выполняю команду добавления через nsupdate -l
(как корень), я всегда получаю update failed: REFUSED
ошибка (здесь с отладочными сообщениями):
root@somehost:/etc/bind# nsupdate -l -v -D
setup_system()
Creating key...
namefromtext
keycreate
reset_system()
user_interaction()
> ttl 46000
do_next_command()
> zone somehost.tld.
do_next_command()
> update add whatever.somehost.tld. A 1.1.1.1
do_next_command()
evaluate_update()
update_addordelete()
> send
do_next_command()
start_update()
send_update()
Sending update to 127.0.0.1#53
show_message()
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 15363
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;somehost.tld. IN SOA
;; UPDATE SECTION:
whatever.somehost.tld. 46000 IN A 1.1.1.1
;; TSIG PSEUDOSECTION:
local-ddns. 0 ANY TSIG hmac-sha256. 1446539060 300 32 r2lt18dGihGnJepoUjvIKx8l5BPMohNJvsLoO+WQiBE = 15363 NOERROR 0
update_completed()
tsig verification successful
show_message()
Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: REFUSED, id: 15363
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;somehost.tld. IN SOA
;; TSIG PSEUDOSECTION:
local-ddns. 0 ANY TSIG hmac-sha256. 1446539060 300 32 Cnh9Tgg5vhKngPRk2J8n0wiRzdBLlQrp0F0qmfUotN8 = 15363 NOERROR 0
done_update()
reset_system()
user_interaction()
> quit
Это какой-то вопрос разрешения? В чем дело?
2 ответа
Наконец-то разобрался. Спасибо Håkan Lindqvist за вдохновение.
Эти решения, вероятно, относятся к Debian/Ubuntu и не тестировались в других дистрибутивах.
1. ПЕРВОЕ РЕШЕНИЕ
(С помощью update-policy local;
).
Вы можете использовать update-policy local;
директива в /etc/bind/named.conf.local
в каждой декларации зоны вы хотите, которая ограничивает запросы на обновление из Интернета или локальной сети для лучшей безопасности. В этом случае ключ генерируется автоматически и nsupdate
будет использовать его, если запустить с -l
вариант.
Вместо server X.X.X.X
команда должна использовать local X.X.X.X
, Он принимает даже публичный IP в качестве аргумента, если он локальный для системы!
Примечание: ключ не доступен для чтения, поэтому используйте sudo
,
Пример:
me@somehost:~$ sudo nsupdate -l
> local 1.2.3.4
> zone somehost.tld
> update add something.somehost.tld. 86400 A 1.1.1.1
> send
> quit
2. ВТОРОЕ РЕШЕНИЕ
(С помощью ddns-confgen
).
У меня много мнений (localhost_view
, global_view
и т.д.), некоторые из которых имеют общие зоны (somehost.tld
в моем примере). Если я хочу динамически обновить их, я должен использовать server X.X.X.X
команда, когда делать nsupdate
, Следовательно nsupdate
отправит запрос на обновление в соответствующий интерфейс, и соответствующее представление обработает его.
update-policy local;
не подходит в этой конфигурации, потому что это запрещает использование server
командовать в nsupdate
, Поэтому необходимо создать ключ DDNS и указать его во всех объявлениях зон, которые должны динамически обновляться nsupdate
, Во вселенной Debian есть ddns-confgen
Команда, которая значительно упрощает эту задачу:
me@somehost:~$ ddns-confgen
# To activate this key, place the following in named.conf, and
# in a separate keyfile on the system or systems from which nsupdate
# will be run:
key "ddns-key" {
algorithm hmac-sha256;
secret "pXohPnPR7dyri9ADfDLtSz+lHw/QliISyiEe0wg0a14=";
};
# Then, in the "zone" statement for each zone you wish to dynamically
# update, place an "update-policy" statement granting update permission
# to this key. For example, the following statement grants this key
# permission to update any name within the zone:
update-policy {
grant ddns-key zonesub ANY;
};
# After the keyfile has been placed, the following command will
# execute nsupdate using this key:
nsupdate -k <keyfile>
Вывод этой команды довольно информативен. Нужно добавить key...
фрагмент к /etc/bind/named.conf
и отдельный файл с любым именем, и update-policy...
фрагмент в каждый zone
декларация, которой будет управлять nsupdate
,
Правильно использовать nsupdate
инструмент в многопользовательской среде BIND, необходимо явно указать server
директива перед выполнением любой другой команды. Итак, для обновления localhost_view
"s somehost.tld
зона (учитывая key...
фрагмент был сохранен в /etc/bind/ddns-key.key
) команды следующие (обратите внимание на server 127.0.0.1
):
me@somehost:~$ nsupdate -k /etc/bind/ddns-key.key
> server 127.0.0.1
> zone somehost.tld
> update add something.somehost.tld. 86400 A 1.1.1.1
> send
> quit
тогда как манипулировать global_view
"s somehost.tld
По зонам команды по сути одинаковые, но с разными server
, В этом случае необходимо использовать публичный IP (1.2.3.4
в моем примере):
me@somehost:~$ nsupdate -k /etc/bind/ddns-key.key
> server 1.2.3.4
> zone somehost.tld
> update add something.somehost.tld. 86400 A 1.1.1.1
> send
> quit
Следовательно nsupdate
отправляет запрос на соответствующий интерфейс (который может быть, а может и не быть локальным), и работает конкретное представление.
Вы используете nsupdate -l
который отправляет сообщение об обновлении localhost
(подробный вывод подтверждает, что он использовал адрес обратной связи, как и ожидалось, Sending update to 127.0.0.1#53
).
Тем не менее, зона, которую вы пытаетесь обновить, не находится в представлении, что это сообщение об обновлении попадет. Ваш первый просмотр (localhost_view
) имеет match-clients { localhost_acl; };
,
acl localhost_acl {
127.0.0.0/8;
};
Зона, которую вы пытаетесь обновить, находится в представлении global_view
определено позже в вашей конфигурации.
Если вы проверите свои журналы, я думаю, что ошибка регистрируется, и сообщение журнала, скорее всего, будет содержать информацию о том, в какое представление оно попадало (должно быть localhost_view
на основе вашего конфига).
Важно отметить, что представления упорядочены, и первое соответствующее представление получит любое сообщение.
Из раздела о взглядах в руководстве:
Каждый оператор представления определяет представление пространства имен DNS, которое будет видно подмножеству клиентов. Клиент сопоставляет представление, если его исходный IP-адрес совпадает с address_match_list предложения match-clients представления, а его целевой IP-адрес совпадает с address_match_list предложения match-destination представления. Если он не указан, то для совпадающих клиентов и мест назначения совпадений по умолчанию совпадают все адреса. В дополнение к проверке IP-адресов сопоставить клиентов и сопоставить получателей можно также с помощью ключей, которые предоставляют клиенту механизм выбора представления. Представление также может быть указано как match-recursive-only, что означает, что только рекурсивные запросы от соответствующих клиентов будут соответствовать этому представлению. Порядок операторов представления является значительным - клиентский запрос будет разрешен в контексте первого сопоставленного представления.
Как упомянуто в приведенном объяснении, вы можете сопоставить по ключу TSIG вместо IP, если это помогает (путем настройки match-client
).
Стоит отметить, что address_match_list
(тип аргумента для, например, match-client
) принимает как IP-адреса, так и ключи. Также, как и представления, упорядоченные как и первый соответствующий элемент решает результат. Ввод any
сначала делает любые другие элементы в списке бессмысленными.