Задача: организовать сбор данных зоны iana.org, закэшировать ответы в Unbound и Redis, и на основе кэша создать локальное описание зоны.
Чтобы собрать данные зоны через резолвер, нужно временно отключить local-zone — иначе Unbound будет отвечать из локальной базы и не пойдёт к авторитетным серверам. После сбора данных и их кэширования восстанавливаем local-zone с реальными значениями.
Открываем конфиг и комментируем local-zone и все local-data:
sudo nano /etc/unbound/unbound.conf
# local-zone: "iana.org." static
# local-data: "iana.org. 3600 IN A 1.2.3.4"
Применяем:
sudo unbound-control reload
Запрашиваем все основные типы через наш резолвер. Unbound резолвит их у авторитетных серверов и кэширует — в памяти и в Redis:
dig @127.0.0.1 iana.org A
dig @127.0.0.1 iana.org AAAA
dig @127.0.0.1 iana.org MX
dig @127.0.0.1 iana.org NS
dig @127.0.0.1 iana.org TXT
dig @127.0.0.1 iana.org SOA
Смотрим, что Unbound сохранил в кэше:
sudo unbound-control dump_cache | grep -A 20 "iana.org"
Проверяем, что данные попали в Redis. Ключи хранятся во внутреннем бинарном формате Unbound — имя домена в них не читается, поэтому ищем по количеству ключей:
redis-cli dbsize
Unbound поддерживает директиву include: — можно вынести локальную зону в отдельный файл. Скрипт берёт данные из кэша (dump_cache) и сразу создаёт готовый файл конфигурации:
ZONE="iana.org"
CONF="/etc/unbound/local-zone-iana.conf"
{
echo "server:"
echo " local-zone: \"${ZONE}.\" static"
sudo unbound-control dump_cache \
| grep "^${ZONE}\." \
| grep -vE "\s(DNSKEY|RRSIG|NSEC3?|DS)\s" \
| awk 'NF>=5 {gsub(/"/, "\\\""); print " local-data: \"" $0 "\""}'
} | sudo tee "$CONF"
Файл создан. Смотрим что получилось:
cat /etc/unbound/local-zone-iana.conf
TTL в
dump_cache— остаточный (убывает с момента кэширования). Это нормально: вlocal-zoneTTL фиксируется на то значение, которое указано вlocal-data.
Добавляем include: в основной конфиг (один раз). Убираем старые local-zone и local-data если были:
sudo nano /etc/unbound/unbound.conf
include: "/etc/unbound/local-zone-iana.conf"
Проверяем и перезагружаем:
sudo unbound-checkconf
sudo unbound-control reload