DNS сервер · 14 min read · Sep 08, 2025
Как настроить локальный DNS-резолвер с помощью Unbound на Ubuntu 22.04

Unbound — это бесплатное и открытое программное обеспечение DNS-сервера, которое можно использовать для проверки, рекурсивных и кэшированных DNS-резолверов. Это функционально насыщенный DNS-сервер, который поддерживает DNS-over-TLS (DoT), DNS-over-HTTPS (DoH), минимизацию имени запроса, агрессивное использование кэша, проверенного DNSSEC, и поддержку зон авторитетов. Unbound сосредоточен на конфиденциальности и безопасности DNS, но без ущерба для скорости и производительности.
Unbound в основном разрабатывается NLnet Labs и распространяется под лицензией BSD, и он поддерживает современные функции на открытых стандартах DNS-сервера. Unbound был тщательно проверен, и его можно запускать на Linux, BSD и macOS. Unbound доступен для большинства из этих ОС и может быть установлен через менеджер пакетов системы.
В этом руководстве вы установите Unbound на сервер Ubuntu 22.04 и настроите его как локальный DNS-сервер с включенными некоторыми функциями, такими как DNSSEC, кэш DNS, локальные доменные имена и поддомены, а также DNS-over-TLS (DoT). Вы также настроите ведение журнала Unbound через Rsyslog и logrotate и настроите клиентскую машину Ubuntu для проверки вашей установки Unbound.
Предварительные требования
Чтобы завершить это руководство, у вас должны быть следующие требования:
- Сервер Ubuntu 22.04 - В этом примере используется сервер Ubuntu с именем хоста ‘unbound-server‘ и IP-адресом ‘192.168.5.100‘.
- Непользователь с правами администратора sudo/root.
Вот и все. Теперь вы готовы продолжить установку Unbound.
Установка DNS-сервера Unbound
По умолчанию репозиторий Ubuntu предоставляет пакет Unbound, который вы можете легко установить через APT. Прежде чем начать установку Unbound, выполните следующую команду apt для обновления и обновления индекса пакетов Ubuntu.
sudo apt updateТеперь проверьте детали пакета unbound с помощью следующей команды.
sudo apt info unboundНа момент написания этой статьи стандартный репозиторий Ubuntu предоставляет Unbound 1.13.

Далее установите Unbound, используя следующую команду apt. Когда будет предложено, введите y для подтверждения и нажмите ENTER для продолжения.
sudo apt install unboundВывод:

После установки Unbound выполните следующую команду systemctl, чтобы проверить службу Unbound.
sudo systemctl is-enabled unbound
sudo systemctl status unboundВывод ‘enabled‘ подтверждает, что Unbound включен и будет запускаться автоматически при запуске системы. А вывод ‘active (running)‘ подтверждает, что Unbound работает.

Настройка Unbound как локального DNS-сервера
Стандартная конфигурация Unbound находится в ‘/etc/unbound/unbound.conf’. На этом этапе вы измените основной конфигурационный файл Unbound ‘/etc/unbound/unbound.conf’ с помощью вашего предпочтительного редактора.
Теперь вы узнаете о базовой конфигурации DNS-сервера Unbound, включении кэша DNS, настройке локальных доменных имен и поддоменов, настройке Unbound как DNS-резолвера с включенным DoT (DNS-over-TLS).
Базовая конфигурация
Откройте стандартный конфигурационный файл Unbound ‘/etc/unbound/unbound.conf’ с помощью вашего предпочтительного редактора. В этом примере используется nano для редактирования конфигурационного файла ‘/etc/unbound/unbound.conf’.
sudo nano /etc/unbound/unbound.confДобавьте следующие строки в файл. Раздел ‘server‘ позволяет вам настроить основные конфигурации Unbound. В этом примере вы будете запускать Unbound на локальном IP-адресе ‘192.168.5.100‘ с портом по умолчанию 53. Также вы настроите ведение журнала сообщений Syslog и отключите IPv6. Наконец, вы настроите Unbound для рекурсивного запроса любого имени хоста от корневых DNS-серверов через файл ‘root-hints‘.
#Добавление поддержки DNS-Over-TLS
server:
use-syslog: yes
username: "unbound"
directory: "/etc/unbound"
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
do-ip6: no
interface: 192.168.5.100
port: 53
prefetch: yes
root-hints: /usr/share/dns/root.hints
harden-dnssec-stripped: yesПодробные параметры:
- use-syslog: включить ведение журнала сообщений Syslog.
- username: запускать от имени пользователя unbound, который является пользователем по умолчанию.
- directory: рабочий каталог по умолчанию для Unbound — это каталог ‘/etc/unbound’.
- tls-cert-bundle: сертификаты, используемые для аутентификации соединений, установленных вверх по потоку. В дистрибутиве на основе Debian файл сертификата находится по адресу ‘/etc/ssl/certs/ca-certificates.crt’.
- do-ip6: используйте ‘yes‘, чтобы запустить Unbound с IPv6, или установите ‘no‘, чтобы отключить IPv6.
- interface: сетевой интерфейс или IP-адрес, на котором будет работать unbound. Вы можете использовать IP-адрес или имя интерфейса, например, ‘eth0‘. Также вы можете запустить на определенном порту, добавив формат, например, ‘IP-ADDRESS@PORT‘.
- port: укажите порт, на котором будет работать Unbound, и этот порт будет обрабатывать соединения клиентов. Порт DNS по умолчанию — 53.
- prefetch: установите на ‘yes‘, чтобы включить предварительное извлечение почти истекших записей кэша сообщений.
- root-hints: файл, содержащий детали корневого DNS-сервера. Файл ‘/usr/share/dns/root.hints’ предоставляется пакетом ‘dns-root-data‘. Также вы можете загрузить файл root-hints отсюда ‘https://www.internic.net/domain/named.cache’.
- harden-dnssec-stripped: установите на ‘yes‘, чтобы усилить защиту от получения данных, лишенных dnssec.
Включение кэша DNS
Далее добавьте следующие строки, чтобы включить запрос кэша DNS в вашей установке Unbound.
cache-max-ttl: 14400
cache-min-ttl: 11000Подробные параметры:
- cache-max-ttl: TTL или время жизни для RRSets и сообщений в кэше DNS. Формат — в секундах.
- cache-min-ttl: минимальное время жизни для кэша. По умолчанию 0, но вы можете изменить это на ваше усмотрение, например, на ‘11000‘ секунд. Не устанавливайте это значение более чем на 1 час, иначе вы столкнетесь с проблемами из-за устаревших данных.
Конфиденциальность и безопасность Unbound
Теперь вы можете добавить следующие строки, чтобы настроить базовую конфиденциальность и безопасность для Unbound.
aggressive-nsec: yes
hide-identity: yes
hide-version: yes
use-caps-for-id: yesПодробные параметры:
- aggressive-nsec: установите на ‘yes‘, чтобы включить агрессивный NSEC, чтобы использовать цепочку DNSSEC NSEC для синтеза NXDOMAIN и других отказов. Ознакомьтесь с веб-страницей IETF о ‘NSEC’ https://www.ietf.org/archive/id/draft-ietf-dnsop-nsec-ttl-00.html.
- hide-identity: установите на yes, чтобы отключить ответы от запросов bind о id.server или hostname.bind.
- hide-version: установите на yes, чтобы отключить запросы version.server и version.bind.
- use-caps-for-id: установите на yes, чтобы включить использование ‘0x100-encoded‘ в запросе для предотвращения попыток подделки.
Определение частной сети и списков управления доступом (ACL)
Далее вам нужно определить частный адрес вашей сети и ACL (списки управления доступом). Обязательно измените локальную подсеть в приведенных ниже строках в соответствии с вашей текущей сетевой средой.
private-address: 192.168.0.0/16
private-address: 192.168.5.0/24
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
#контроль, какие клиенты могут делать (рекурсивные) запросы
access-control: 127.0.0.1/32 allow_snoop
access-control: ::1 allow_snoop
access-control: 127.0.0.0/8 allow
access-control: 192.168.5.0/24 allowПодробные параметры:
- private-address: определите частные подсети вашей сети в вашей инфраструктуре. Только ‘private-domain‘ и ‘local-data’ имена могут иметь эти частные адреса.
- access-control: определите контроль доступа, в котором клиенты могут делать (рекурсивные) запросы к серверу Unbound. Параметр ‘allow‘ позволит рекурсивные запросы, в то время как ‘allow_snoop‘ позволит как рекурсивные, так и нерекурсивные.
Настройка локального домена
После настройки частного адреса и списков управления доступом вы определите локальную зону вашего доменного имени. Это очень полезно, особенно если у вас есть несколько самоуправляемых приложений в вашей локальной сети. Вы можете легко определить свое доменное имя или поддомены и указать конкретный целевой IP-адрес.
В этом примере будет создана зона для домена ‘home.lan‘ с типом ‘static‘, затем вы создадите несколько поддоменов через параметр ‘local-data‘. Каждый поддомен будет указывать на конкретный IP-адрес, а также вы создадите записи PTR через параметр ‘local-data-ptr‘.
# локальная зона
local-zone: "home.lan." static
local-data: "firewall.home.lan. IN A 10.0.0.1"
local-data: "vault.home.lan. IN A 10.0.0.2"
local-data: "media.home.lan. IN A 10.0.0.3"
local-data: "docs.home.lan. IN A 10.0.0.4"
local-data: "wiki.home.lan. IN A 10.0.0.5"
local-data-ptr: "10.0.0.1 firewall.home.lan"
local-data-ptr: "10.0.0.2 vault.home.lan"
local-data-ptr: "10.0.0.3 media.home.lan"
local-data-ptr: "10.0.0.4 docs.home.lan"
local-data-ptr: "10.0.0.5 wiki.home.lan"Подробные параметры:
- local-zone: определите локальный домен здесь.
- local-data: определите A-запись для поддоменов и какой локальный IP-адрес будет разрешен.
- local-data-ptr: определите запись ptr для ваших поддоменов.
Настройка производительности Unbound и оптимизация
Добавьте следующие строки, чтобы получить больше производительности. Вы можете настроить приведенные ниже параметры в соответствии с вашей текущей средой.
num-threads: 4
msg-cache-slabs: 8
rrset-cache-slabs: 8
infra-cache-slabs: 8
key-cache-slabs: 8
rrset-cache-size: 256m
msg-cache-size: 128m
so-rcvbuf: 8mПодробные параметры:
- num-threads: количество потоков, которые будут созданы. Значение должно соответствовать ядрам процессора сервера.
- msg-cache-slabs: количество слоев, которые будут использоваться для кэша сообщений. Установите на 8, чтобы оптимизировать Unbound для использования большего объема памяти для кэширования.
- rrset-cache-slabs: количество слоев, которые будут использоваться для кэша RRset. Установите на 8, чтобы оптимизировать Unbound для использования большего объема памяти для кэша RRSet.
- infra-cache-slabs: количество слоев, которые будут использоваться для кэша инфраструктуры. Установите на 8, чтобы оптимизировать Unbound для использования большего объема памяти для кэша инфраструктуры.
- key-cache-slabs: количество слоев, которые будут использоваться для кэша ключей. Установите на 8, чтобы оптимизировать Unbound для использования большего объема памяти для кэша ключей.
- rrset-cache-size: укажите объем памяти для кэша RRSet. В этом примере используется 256 МБ, в то время как по умолчанию — только 4 МБ.
- msg-cache-size: укажите объем памяти для кэша сообщений. В этом примере используется 128 МБ, в то время как по умолчанию — только 4 МБ.
- so-rcvbuf: настройте размер буфера для порта DNS 53/udp на 8 МБ. В системе Ubuntu вам также необходимо установить более высокое значение для параметра ядра ‘net.core.rmem_max‘.
Настройка Unbound как DNS-резолвера с DNS-over-TLS (DoT)
Наконец, добавьте новый раздел ‘forward-zone’, чтобы настроить Unbound как DNS-резолвер для ваших локальных сетей. В этом примере используются DNS-серверы Quad9 с включенным DoT (DNS-over-TLS).
forward-zone:
name: "."
forward-ssl-upstream: yes
## Также добавьте IBM IPv6 Quad9 через TLS
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 149.112.112.112@853#dns.quad9.netПодробные параметры:
- forward-zone: определите зону пересылки для Unbound.
- name: установите на “.”, чтобы пересылать все DNS-запросы.
- forward-addr: используйте конкретный пересылающий сервер для пересылки всех DNS-запросов. В этом примере используется Quad9 DNS с включенным DNS-over-TLS (DoT).
Сохраните и выйдите из файла ‘/etc/unbound/unbound.conf’ после завершения. С измененным конфигурационным файлом Unbound вы можете теперь перезапустить службу Unbound и применить изменения.
Выполните следующую команду, чтобы проверить и подтвердить конфигурацию Unbound. Если все прошло успешно, вы должны получить вывод, такой как ‘unbound-checkconf: no errors in /etc/unbound/unbound.conf’.
sudo unbound-checkconfДалее выполните следующую команду, чтобы увеличить значение по умолчанию ‘net.core.rmem_max’ вашей системы через файл ‘/etc/sysctl.conf’. Затем примените изменения через команду ‘sysctl‘.
echo "net.core.rmem_max= 8388608" >> /etc/sysctl.conf
sudo sysctl -pПосле этого выполните следующую команду systemctl, чтобы перезапустить службу Unbound и применить изменения.
sudo systemctl restart unboundТаким образом, служба Unbound должна работать с новой конфигурацией на IP-адресе 192.168.5.100 на порту 53.

Проверьте список открытых портов на вашей системе с помощью команды ss ниже.
ss -tulpnВы получите вывод, подобный этому - стандартный UDP-порт DNS 53 используется службой Unbound.

Теперь, когда вы завершили конфигурацию Unbound, вы настроите брандмауэр UFW и откроете стандартный порт DNS 53.
Настройка брандмауэра UFW
На Ubuntu стандартным брандмауэром, который установлен, является UFW. Он установлен, но все еще неактивен. На этом этапе вы настроите брандмауэр UFW и откроете UDP-порт для Unbound.
Выполните следующую команду, чтобы открыть службу OpenSSH на UFW с помощью следующей команды. Затем вы можете добавить порт DNS 53/udp в брандмауэр UFW.
sudo ufw allow OpenSSH
sudo ufw allow 53/udpДалее выполните следующую команду, чтобы запустить и включить службу брандмауэра UFW. Когда будет предложено, введите y для подтверждения и нажмите ENTER для продолжения.
sudo ufw enableВывод ‘Брандмауэр активен и включен при запуске системы‘ подтверждает, что брандмауэр UFW работает и включен, что означает, что брандмауэр UFW будет запускаться автоматически при запуске системы.
Вывод:

Теперь выполните следующую команду ufw, чтобы проверить статус брандмауэра UFW. Вы должны получить вывод, что статус UFW ‘активен‘ с включенной службой OpenSSH и портом DNS 53/udp.
sudo ufw statusВывод:

Настройка журнала Unbound через Rsyslog и Logrotate
После настройки брандмауэра UFW вы теперь настроите файл журнала для Unbound через rsyslog и logrotate. Служба rsyslog создаст конкретный файл журнала для Unbound, а logrotate будет вращать файл журнала Unbound через определенное время.
Выполните следующую команду, чтобы добавить новую конфигурацию Rsyslog ‘/etc/rsyslog.d/unbound.conf’ для службы Unbound. С этим журналы Unbound будут храниться в ‘/var/log/unbound.log‘.
cat <Далее выполните следующую команду, чтобы добавить конфигурацию logrotate ‘/etc/logrotate.d/unbound‘ для службы Unbound. Это создаст вращение журнала для файла журнала Unbound ‘/var/log/unbound.log‘ на ежедневной основе.
cat <
Теперь выполните следующую команду systemctl, чтобы перезапустить службы Rsyslog и Logrotate. Это применит изменения, которые вы внесли в обе службы.
sudo systemctl restart rsyslog logrotateНаконец, вы можете проверить файл журнала, перезапустив службу Unbound с помощью следующей команды.
Таким образом, сообщения, сгенерированные службой Unbound в процессе перезапуска, будут сохранены в файле журнала ‘/var/log/unbound.log‘. Выполните команду cat, чтобы показать содержимое файла журнала ‘/var/log/unbound.log‘.
sudo systemctl restart unbound
cat /var/log/unbound.logВывод:

Настройка DNS-резолвера на клиенте
Что касается клиентской стороны, вам нужно настроить DNS-резолвер и использовать Unbound в качестве стандартного резолвера на клиентской системе. Для дистрибутивов Ubuntu вы можете использовать NetworkManager, службу systemd-resolved или настроить статический файл для ‘/etc/resolv.conf‘.
На этом этапе вы узнаете, как настроить DNS-резолвер на Ubuntu Desktop и Ubuntu Server.
Для Ubuntu Desktop
Служба NetworkManager обрабатывает стандартную сеть для версии Ubuntu Desktop. Поэтому вы можете легко настроить DNS-резолвер через NetworkManager, что можно сделать через командную строку, графический интерфейс или редактируя конфигурационный файл для каждого сетевого интерфейса.
Чтобы настроить DNS-резолвер через командную строку, вы можете использовать nmcli. Выполните следующую команду, чтобы настроить DNS-резолвер для конкретного сетевого интерфейса. Вы можете заменить имя интерфейса eth0.
sudo nmcli connection modify eth0 ipv4.dns "192.168.5.100"Каждый интерфейс, управляемый NetworkManager, имеет конкретный конфигурационный файл, который хранится в каталоге ‘/etc/NetworkManager/system-connections’ с форматом ‘.nmconnection’.
Вы можете изменить конфигурацию интерфейса с помощью вашего предпочтительного текстового редактора и добавить следующие строки в раздел ‘[ipv4]‘.
[ipv4]
dns=192.168.5.100
ignore-auto-dns=true
never-default=trueЕсли вы предпочитаете использовать графическое приложение, откройте приложение NetworkManager на вашем компьютере и отредактируйте имя интерфейса, который вы хотите изменить. Нажмите на вкладку ‘IPv4 Settings’ и введите ваш локальный DNS-сервер. Затем нажмите Сохранить, чтобы подтвердить.

Для обычного сервера Ubuntu
Для обычных серверов Ubuntu сеть обрабатывается netplan с бэкенд-сервисом systemd-networkd. А для конфигурации DNS-резолвера используется systemd-networkd, который использует systemd-resolved. Поэтому, чтобы настроить DNS-резолвер на обычном сервере Ubuntu, вы можете сделать это через службу systemd-resolved.
Откройте конфигурационный файл systemd-resolved с помощью вашего предпочтительного редактора. В этом примере используется редактор nano.
sudo nano /etc/systemd/resolved.confВ разделе ‘[Resolve]‘ раскомментируйте параметр ‘DNS‘ и введите IP-адрес вашего локального DNS-сервера.
[Resolve]
DNS=192.168.5.100Сохраните и выйдите из файла после завершения.
Теперь выполните следующую команду, чтобы перезапустить службу systemd-resolved и применить изменения. Затем вы можете проверить статус DNS-резолвера с помощью команды resolvectl, как показано ниже.
sudo systemctl restart systemd-resolved
sudo resolvectl statusЕсли все прошло успешно, вы должны увидеть вывод, подобный этому - стандартный DNS-резолвер изменен на IP-адрес локального DNS-сервера Unbound 192.168.5.100.

Тестирование DNS-сервера Unbound
Чтобы убедиться, что Unbound DNS работает как DNS-резолвер, выполните команду dig ниже с клиентской машины Ubuntu. Параметр ‘@192.168.5.100‘ гарантирует, что вы используете сервер DNS Unbound, который работает на IP-адресе ‘192.168.5.100‘.
dig @192.168.5.100При успешном выполнении вы получите ответ от корневого DNS-сервера, подобный приведенному ниже выводу. Также вы заметите флаг ‘ad‘ (authentic data) в заголовке вывода, что означает, что DNSSEC включен.

Далее выполните следующую команду, чтобы убедиться, что клиенты могут получать доступ к доменным именам в интернете.
dig github.com
dig duckduckgo.comПри успешном выполнении вы должны получить вывод с деталями DNS-записи для домена ‘github.com‘ и ‘duckduckgo.com‘. Вы можете увидеть, что DNS-резолвер, который отвечает на запрос, — это ‘127.0.0.53#53’, systemd-resolved, который использует Unbound в качестве стандартного резолвера. Также вы можете увидеть ‘Query time’ для каждого запроса, время запроса к домену ‘github.com‘ составляет ‘1748‘, а к ‘duckduckgo.com‘ — ‘999‘.
Вывод для github.com:

Вывод для duckduckgo.com:

Если вы повторно выполните команду dig выше, время запроса должно сократиться. И это подтверждает, что ваши запросы были закэшированы, и кэш DNS работает.
dig github.com
dig duckduckgo.comДоступ к Github после хранения кэша:

Доступ к duckduckgo после хранения кэша:

Далее проверьте локальный домен или поддомен с помощью команды dig ниже. Если все прошло успешно, каждый поддомен будет указывать на правильный IP-адрес, настроенный в конфигурационном файле Unbound ‘/etc/unbound/unbound.conf‘.
dig firewall.home.lan +short
dig vault.home.lan +short
dig media.home.lan +shortВывод:

Теперь выполните следующую команду dig, чтобы убедиться, что записи PTR указывают на правильное доменное имя.
dig -x 10.0.0.1 +short
dig -x 10.0.0.2 +short
dig -x 10.0.0.3 +shortВывод:

Вы также можете проверить DoT (DNS через TLS) с помощью tcpdump. Установите пакет ‘tcpdump‘ на ваш сервер Unbound.
sudo apt install tcpdumpВведите y, когда будет предложено, и нажмите ENTER для продолжения.

Теперь выполните следующую команду tcpdump, чтобы отслеживать трафик на интерфейсе ‘eth0‘ с портом DoT 853. В этом примере DNS Unbound работает на IP-адресе ‘192.168.5.100‘ с интерфейсом ‘eth0‘.
tcpdump -vv -x -X -s 1500 -i eth0 'port 853'Перейдите на клиентскую машину и выполните следующую команду, чтобы получить доступ к внешним/интернет-доменам с помощью команды dig ниже.
dig google.comВывод:

После этого вернитесь на сервер Unbound, и вы должны получить вывод, аналогичный этому, в выводе tcpdump.

Таким образом, вы теперь установили и настроили локальный DNS-сервер через Unbound на сервере Ubuntu. Также вы настроили DNS-резолвер на рабочих столах и серверах Ubuntu через NetworkManager и systemd-resolved.
Заключение
В этом руководстве вы установили локальный DNS-сервер Unbound на сервере Ubuntu 22.04. Вы включили кэш DNS, DNSSEC (включен по умолчанию), настроили частный адрес и ACL, добавили локальный домен через local-zone, а затем настроили Unbound как DNS-резолвер с DoT (DNS-over-TLS).
Кроме того, вы настроили базовую конфиденциальность и безопасность DNS, оптимизировали Unbound и настроили журналы Unbound через rsyslog и logrotate.
В конце этого руководства вы также узнали, как настроить DNS-резолвер на рабочих столах и серверах Ubuntu через NetworkManager и systemd-resolved. А также узнали о базовом использовании команды dig для проверки DNS-сервера.
Get new posts in your inbox
No spam. Unsubscribe anytime.