Задача: пересобрать Unbound с поддержкой модуля cachedb, установить Redis и подключить его к Unbound в качестве внешнего персистентного кэша.
Стандартный пакет Unbound в Ubuntu 22.04 собран без модуля cachedb. Чтобы подключить Redis, необходимо собрать Unbound из исходников с флагами --enable-cachedb --with-libhiredis.
Схема работы после подключения:
Клиент → Unbound (in-memory кэш) → Redis (внешний кэш) → авторитетный сервер
При поступлении запроса Unbound сначала проверяет собственный in-memory кэш. Если записи нет — обращается к Redis. Если нет и в Redis — уходит за ответом к авторитетному серверу, после чего сохраняет результат в оба кэша.
В отличие от in-memory кэша, Redis хранит данные на диске (dump.rdb) — записи переживают перезапуск Unbound.
sudo apt update
sudo apt install redis-server
Проверяем, что Redis запущен:
sudo systemctl status redis-server
sudo apt install build-essential pkg-config libssl-dev libevent-dev libhiredis-dev libexpat1-dev libsystemd-dev
Эта куча зависимостей нам понадобится для сборки Unbound, который поддерживает Redis.
Скачиваем актуальные исходники с официального сайта
Актуальную версию можно узнать на странице загрузки nlnetlabs.nl/projects/unbound/download
VERSION=1.24.2
wget https://nlnetlabs.nl/downloads/unbound/unbound-${VERSION}.tar.gz
tar -xzf unbound-${VERSION}.tar.gz
cd unbound-${VERSION}
Конфигурируем с поддержкой cachedb и Redis:
./configure \
--prefix=/usr \
--enable-cachedb \
--enable-systemd \
--with-libhiredis \
--with-libevent \
--with-ssl \
--sysconfdir=/etc \
--localstatedir=/var \
--with-pidfile=/run/unbound.pid \
--with-rootkey-file=/var/lib/unbound/root.key
Собираем и устанавливаем
make
sudo make install
Проверяем, что модуль появился:
unbound -V
В строке Linked modules теперь должен быть cachedb:
Linked modules: dns64 cachedb respip validator iterator
sudo nano /etc/unbound/unbound.conf
Изменяем порядок модулей и добавляем секцию cachedb::
server:
chroot: ""
module-config: "validator cachedb iterator"
remote-control:
control-enable: yes
cachedb:
backend: "redis"
redis-server-host: 127.0.0.1
redis-server-port: 6379
redis-expire-records: no
chroot: ""— явно отключает chroot-изоляцию. Без этой строки Unbound ищет все файлы конфигурации (в том числеroot.key) внутри chroot-директории, скомпилированной в бинарник по умолчанию. Это приводит к ошибкеdoes not exist in chrootdirпри проверке конфига. Явное указание пустого значения гарантирует корректную работу независимо от того, с каким дефолтом собран бинарник.
remote-control: control-enable: yes— разрешает управление Unbound черезunbound-control. При сборке из исходников эта секция по умолчанию отсутствует в конфиге, из-за чегоunbound-controlзавершается ошибкойConnection refused. Без этого флага командыflush,dump_cacheиflush_zoneработать не будут.
module-config:cachedbдолжен стоять междуvalidatorиiterator. Порядок модулей имеет значение.
Проверяем синтаксис и перезапускаем:
sudo unbound-checkconf
sudo systemctl restart unbound
Делаем запрос через Unbound:
dig @127.0.0.1 yandex.ru A
Проверяем, что ключи появились в Redis:
redis-cli keys "*"
Если список не пустой — Unbound успешно пишет в Redis.