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.

показать пакет unmbound

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

sudo apt install unbound

Вывод:

установить unbound

После установки Unbound выполните следующую команду systemctl, чтобы проверить службу Unbound.

sudo systemctl is-enabled unbound  
sudo systemctl status unbound

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

проверить 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.

настроить unbound

Проверьте список открытых портов на вашей системе с помощью команды ss ниже.

ss -tulpn

Вы получите вывод, подобный этому - стандартный UDP-порт DNS 53 используется службой Unbound.

проверить порт 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. Вы должны получить вывод, что статус UFW ‘активен‘ с включенной службой OpenSSH и портом DNS 53/udp.

sudo ufw status

Вывод:

проверить ufw

Настройка журнала 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 <

настроить ведение журнала unbound

Теперь выполните следующую команду 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

Вывод:

проверить журнал unbound

Настройка 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-сервер. Затем нажмите Сохранить, чтобы подтвердить.

dns resolver guyide network manager

Для обычного сервера 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 resolver systemd resolved

Тестирование 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 включен.

проверить сервер dns dig

Далее выполните следующую команду, чтобы убедиться, что клиенты могут получать доступ к доменным именам в интернете.

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:

dig github.com

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

dig ducducgo before

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

dig github.com  
dig duckduckgo.com

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

dns cache verify

Доступ к 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

Вывод:

тестовые записи ptr

Вы также можете проверить DoT (DNS через TLS) с помощью tcpdump. Установите пакет ‘tcpdump‘ на ваш сервер Unbound.

sudo apt install tcpdump

Введите y, когда будет предложено, и нажмите ENTER для продолжения.

установить tcpdump

Теперь выполните следующую команду 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

Вывод:

dig google

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

dns зашифрованный с DoT

Таким образом, вы теперь установили и настроили локальный 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-сервера.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.