Unbound — запускаем рекурсивный DNS резолвер

Для чего нужен DNS резолвер думаю знают все, он обеспечивает преобразование запрашиваемого клиентом символьного имени домена в IP-адрес обслуживающего эту доменную зону сервера. Различные DNS-сервера провайдеров как правило являются кеширующим рекурсивным днс-сервером. Где, под кеширующим мы понимаем что сервер какое-то время данные о запрашиваемых сайтах хранит в кеше и возвращает ответы из памяти не обращаясь к корневым серверам. Допустимое время кэширования содержится в поле TTL ресурсной записи. А из понятия рекурсивный следует то что сервер, принявший запрос, опрашивает все узлы в порядке убывания уровня зон (от корневых зон), пока не получит положительный ответ или информацию о том, что запрашиваемый домен не существует. Но давайте оставим теорию и настроим свой рекурсор.

Как обычно все настраиваем из под рута и на 18й убунте, хотя на 20й убунте все должно выглядеть идентично

  1. Обновляем пакеты и устанавливаем unbound и dnstop для мониторинга/проверки запросов
apt update
apt upgrade
apt install -y unbound dnstop whois

2. Отключаем то что нам любезно установил canonical вместе с убунтой

systemctl disable systemd-resolved
systemctl stop systemd-resolved
rm /etc/resolv.conf

3. Для интереса смотрим что нам предлагают в дефолтном конфиге unbaund’a. Там не густо.

root@netops:/home/netops# cat /etc/unbound/unbound.conf | egrep -v "^$|#"
include: "/etc/unbound/unbound.conf.d/*.conf"
root@netops:/home/netops# cat /etc/unbound/unbound.conf.d/qname-minimisation.conf | egrep -v "^$|#"
server:
    qname-minimisation: yes
root@netops:/home/netops# cat /etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf | egrep -v "^$|#"
server:
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

Поэтому удаляем все что там есть

rm -r /etc/unbound/unbound.conf.d
> /etc/unbound/unbound.conf

И формируем конфиг заново, со следующими опциями. Подробное описание параметров можно подсмотреть по ссылке

# Больше информации по ключам конфига здесь:
# https://nlnetlabs.nl/documentation/unbound/unbound.conf
server:
	auto-trust-anchor-file: "/var/lib/unbound/root.key"
	# verbosity level 1 дает оперативную информацию.
	verbosity: 1
	# Время сбора статистики в секундах
	statistics-interval: 60
	# Статистика накапливается от времени старта анбаунда
	statistics-cumulative: yes
	# Расширеная статистика. Выводится через unbaund-control
	extended-statistics: yes
	# Кол-во потоков. Все зависит от кол-ва ядер процессора
	num-threads: 4

	# Включаем оптимизацию быстрого перераспределения ресурсов
	so-reuseport: yes
	# Эта опция включает обновление записей в кэше в фоне.
	prefetch: yes
	# Возвращает просроченную запись с TTL=0, а в фоне пытается получить свежую у
	# авторитетных серверов. Включаем по желанию.
	# serve-expired: yes

	# Указываем на каких адресах сервер слушает клиентов
	# interface: 0.0.0.0
	# interface: ::0
	interface: 10.10.10.2
	# При переключении в yes анбаунд будет слушать запросы на всех IP в системе
	interface-automatic: no
	port: 53
 
	# Интерфейс через который будем обращаться к корневым зонам
    outgoing-interface: 10.10.0.1
	outgoing-range: 1450
	# Кол-во блоков в кеше сообщений. Устанавливаем по кол-ву ЦПУ/потоков
	msg-cache-slabs: 4
	num-queries-per-thread: 2048
	# Размер кеша для DNS записей
	rrset-cache-size: 128m
	# Кол-во блоков для работы с кешем. Устанавливаем по кол-ву ЦПУ/потоков
	rrset-cache-slabs: 4
	# запись с ttl больше 3600 секунд в кеш записываем с ttl равным 3600
	cache-max-ttl: 3600
	# запись с ttl меньше 60 секунд записываем в кэш с ttl равным 60 секунду
	cache-min-ttl: 60
	infra-host-ttl: 120
	# Устанавливаем по кол-ву ЦПУ/потоков
	infra-cache-slabs: 4
	# Кол-во записей в кеше. По дефолту 10к
	infra-cache-numhosts: 120000
	# приводит все ответы сервера (и записи в кэше) к нижнему регистру
	use-caps-for-id: yes
	# включает хождение наружу по протоколам ниже
	do-ip4: yes
	do-ip6: yes
	do-udp: yes
	do-tcp: yes
	do-daemonize: yes

	# Сети из которых разрешен доступ к DNS'y
	access-control: 10.0.0.0/8 allow
	access-control: 172.16.0.0/12 allow
	access-control: 192.168.0.0/16 allow
	logfile: "/var/log/unbound/unbound.log"
	use-syslog: no
	# Скрываем данные о программном обеспечении в ответах на запросы
	hide-identity: yes
	hide-version: yes
	key-cache-size: 50m
	neg-cache-size: 10m
        
	# You can add locally served data with
	#local-zone: "local." static
	#local-data: 'mytext.local TXT "content of text record"'

	# Если нам надо добавить какие-то зоны в ручную - пишите их в отдельный файл
	# Например используется при редиректах заблокированных ресурсов на заглушку
	# ### 	vk.com	
	# #local-zone: "vk.com." redirect
	# #local-data: "vk.com. IN A 10.10.0.1"
	#include: "/etc/unbound/userlist"

python:
        # Script file to load
        # python-script: "/usr/local/etc/unbound/ubmodule-tst.py"

# Remote control config section.
remote-control:
        control-enable: yes
        control-interface: 127.0.0.1
        control-port: 953
        # unbound server key file.
        server-key-file: "/etc/unbound/unbound_server.key"
        # unbound server certificate file.
        server-cert-file: "/etc/unbound/unbound_server.pem"
        # unbound-control key file.
        control-key-file: "/etc/unbound/unbound_control.key"
        # unbound-control certificate file.
        control-cert-file: "/etc/unbound/unbound_control.pem"

# Используем если запросы для определенных сайтов хотим зафорвардить на другой днс
# Forward zones
#	name: "factorio.com"
#        forward-addr: 8.8.8.8

На всякий случай добавляем в автозагрузку, если по какой-то причине убунту это не сделала при установке

systemctl enable unbound
service unbound start
service unbound restart

И проверяем работу

root@netops:/home/netops# unbound-control status
version: 1.6.7
verbosity: 1
threads: 4
modules: 3 [ subnet validator iterator ]
uptime: 87 seconds
options: reuseport control(ssl)
unbound (pid 5304) is running...
root@netops:/home/netops# unbound-control lookup deminov.net
The following name servers are used for lookup of deminov.net.
;rrset 3500 2 0 7 3
deminov.net.	3500	IN	NS	ns2.h106.hvosting.ua.
deminov.net.	3500	IN	NS	ns1.h106.hvosting.ua.
;rrset 260 1 0 8 0
ns1.h106.hvosting.ua.	260	IN	A	91.200.40.106
;rrset 260 1 0 8 0
ns2.h106.hvosting.ua.	260	IN	A	91.225.139.106
Delegation with 2 names, of which 2 can be examined to query further addresses.
It provides 2 IP addresses.
91.225.139.106  	not in infra cache.
91.200.40.106   	rto 228 msec, ttl 20, ping 0 var 57 rtt 228, tA 0, tAAAA 0, tother 0, EDNS 0 probed.

Все. DNS работает. Дополнительно советую посмотреть запись на хабре