DNS сървърът Unbound

Unbound е модерен, високопроизводителен DNS resolver, създаден с фокус върху сигурност, скорост и мащабируемост. Той работи като recursive caching DNS сървър, което означава, че приема заявки от клиенти и самостоятелно обхожда DNS йерархията (root → TLD → authoritative), като кешира резултатите за бъдещи заявки.

Unbound не е authoritative DNS сървър – той не хоства зони. Целта му е да осигури бърз и сигурен DNS отговор за клиенти, мрежи и услуги.

Проектът се разработва от NLnet Labs, същата организация зад NSD и съществен участник в DNS стандартизацията.


В какви случаи Unbound е по-подходящ

Unbound е отличен избор когато:

  • имаш нужда от много бърз recursive DNS
  • обслужваш много клиенти (ISP, хотели, кампуси, корпоративни мрежи)
  • искаш минимален latency и максимален cache hit ratio
  • държиш на DNSSEC валидация
  • търсиш прост и предсказуем конфигурационен модел

Типични сценарии:

  • Интернет доставчици (ISP)
  • Border / core DNS за мрежи с хиляди клиенти
  • DNS backend за firewall / router инфраструктура
  • Local resolver за сървъри и контейнери

Защо Unbound, а не BIND

Unbound печели, когато:

  • не ти трябва authoritative DNS
  • искаш максимална скорост
  • целиш стабилност при голям брой заявки
  • не искаш „тежък“ демон

BIND остава добър избор, ако:

  • хостваш зони
  • правиш сложни view-та
  • имаш нужда от dynamic updates

👉 Много големи оператори използват BIND за authoritative (домейн зони) и Unbound за recursion (кешране за клиенти) – най-доброто от двата свята.

На какво се инсталира Unbound

Unbound е наличен за почти всички популярни платформи:

  • Linux (Debian, Ubuntu, CentOS, Alma, Rocky)
  • FreeBSD / OpenBSD
  • macOS
  • Docker / Kubernetes
  • embedded системи и appliances

Инсталацията е лека, без зависимости и работи отлично дори на:

  • 1–2 CPU ядра
  • 512 MB – 1 GB RAM

Какъв мащаб може да обслужва

Unbound е изключително добре оптимизиран и мащабируем:

  • десетки хиляди заявки в секунда на обикновен сървър
  • стотици хиляди QPS при tuning и добър хардуер
  • поддържа:
    • multi-threading
    • aggressive caching
    • prefetch
    • минимален latency

В ISP среда с хиляди клиенти, често 2 Unbound сървъра са напълно достатъчни за redundancy и load.

Инсталация в Ubuntu

Bash
sudo apt install unbound

Конфигурация

sudo vim /etc/unbound/unbound.conf

Bash
# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"

server:
    # --- BASIC SETTINGS ---
    verbosity: 1
    interface: 127.0.0.1
    interface: 87.246.47.81
    interface: ::0
    port: 53
    do-ip4: yes
    do-ip6: yes
    do-udp: yes
    do-tcp: yes
    module-config: "validator iterator"

    # --- PERFORMANCE TUNING (CRITICAL) ---
    # Брой нишки. Нагласи го според броя ядра на CPU-то си!
    # Ако имаш 4 ядра, сложи 4.
    num-threads: 4

    # Настройки за паметта на кеша (Power of 2).
    # Slabs трябва да е близко до num-threads за да няма заключване.
    msg-cache-slabs: 4
    rrset-cache-slabs: 4
    infra-cache-slabs: 4
    key-cache-slabs: 4

    # --- MEMORY (За 8GB RAM) ---
    # Заделяме около ~6 GB само за кеш (Unbound ползва още малко за индекси).
    # rrset трябва да е ~2 пъти по-голям от msg.
    
    msg-cache-size: 2048m   # 2 GB за съобщения
    rrset-cache-size: 4096m # 4 GB за самите записи

    # Увеличаване на буферите на ядрото (за да не се губят UDP пакети при пик)
    so-rcvbuf: 8m
    so-sndbuf: 8m

    # Prefetch - най-важното за скорост!
    # Обновява кеша преди да е изтекъл, ако има чести заявки.
    prefetch: yes
    prefetch-key: yes

    # Обслужване на стари записи за 0.1 сек, ако сървърът е down (служи като failover)
    serve-expired: yes
    serve-expired-ttl: 3600

    # --- NETWORK & PRIVACY ---
    # Скриване на версията и идентичността (security through obscurity)
    hide-identity: yes
    hide-version: yes
   
    # --- ДРУГИ ---
    # Увеличаваме броя на отворените портове към интернет за по-добра рандомизация
    outgoing-range: 8192
    num-queries-per-thread: 4096
 
    # Ограничаване на DNSSEC валидацията
    harden-dnssec-stripped: yes

    # --- ACCESS CONTROL (Твоите мрежи) ---
    access-control: 127.0.0.0/8 allow
    access-control: ::1 allow
    # Твоите IPv6
    access-control: 2001:678:904::/48 allow
    access-control: 2001:470:2066::/48 allow
    # Твоите IPv4
    access-control: 192.168.0.0/16 allow
    access-control: 172.16.0.0/12 allow
    access-control: 10.0.0.0/8 allow
    access-control: 100.64.0.0/10 allow
    access-control: 88.80.132.0/24 allow
    access-control: 88.80.133.0/24 allow
    access-control: 194.79.12.0/24 allow
    access-control: 194.79.13.0/24 allow
    access-control: 195.68.214.88/29 allow
    access-control: 85.118.94.0/23 allow
    access-control: 87.246.47.0/24 allow
    access-control: 87.246.48.0/24 allow
    access-control: 87.246.49.0/24 allow

# --- FORWARDERS ---
# Тук описваме към кого да препращаме, ако нямаме запис в кеша
forward-zone:
    name: "."
    # Cloudflare
    forward-addr: 1.1.1.1
    forward-addr: 1.0.0.1
    # Google
    forward-addr: 8.8.8.8
    forward-addr: 8.8.4.4
    # OpenDNS
    forward-addr: 208.67.222.222
    forward-addr: 2620:119:35::35
    # IPv6 Cloudflare/Google
    forward-addr: 2001:4860:4860::8888
    forward-addr: 2606:4700:4700::1111
Bash
sudo systemctl restart unbound

Оптимизация

Bash
sudo bash -c 'cat > /etc/sysctl.d/99-unbound-optimize.conf <<EOF
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.optmem_max = 65536
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_fastopen = 3
EOF'
Bash
sudo sysctl --system
sudo systemctl restart unbound

Тест на конфигурацията

Bash
sudo journalctl -xeu unbound.service 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.