DNS over TLS, или Как я перестал волноваться и полюбил unbound.

А что такое DNS?

DNS - это распределённый сетевой сервис, позволяющий обращаться к узлам в локальных сетях и в сети "Internet" не по сетевым адресам вида 81.176.66.163 - а используя буквенные имена (например: lib.ru).

DNS - это важная часть Глобальной паутины (WWW) и большинство Интернет-пользователей активно использует DNS, даже не зная об этом. Когда говорят о блокировке сайта - то скорее всего речь идёт о блокировке DNS-записей, связывающих символьное имя сайта с его сетевым адресом.

Что не так с DNS?

С DNS много что не так - но в рамках данной статьи нас будет интересовать только то, что почти все DNS-запросы и ответы на запросы передаются в сети Интернет в незашифрованном виде. Возможно Вы заметили, что в последние годы сетевое сообщество активно продвигает технологии защиты (шифрования) данных. Многие Веб-сайты или стали доступны по https, или полностью отказались от доступа по http и теперь доступны только по https. На фоне этого праздника жизни современная DNS-инфраструктура с передачей запросов и ответов открытым текстом выглядит как бедный родственник. Почему нас это волнует? - Потому, что любые данные, передаваемые по сети в незашифрованном виде, могут быть перехвачены, изучены и подменены. Правда здорово?!

Как сделать DNS безопаснее?

Постановка задачи.

  1. Все DNS запросы, отправляемые с нашего ПК, и все ответы на запросы должны передаваться между ПК и внешними DNS-серверами в зашифрованном виде;
  2. Необходимо свести к минимуму вероятность подмены DNS-серверов, отвечающих на наши запросы;
  3. Вся система должна быть автономной (не привязанной к конкретной офисной или домашней локальной сети).
  4. В качестве платформы используем рабочую станцию (ПК) под управлением Linux Ubuntu 16.04 LTS.

Предлагаемое решение.

К счастью для нас Инженерный совет Интернета (IETF) разработал спецификацию DNS over TLS. Все подробности можно узнать, прочитав пояснительную записку RFC7858.

К несчастью для нас на момент написания этой статьи большинство популярных DNS-серверов не поддерживает TLS-шифрование. Также проблематично найти пользовательское программное обеспечение, способное работать с DNS через TLS. Выходом из сложившейся ситуации является настройка кеширующего DNS-сервера, принимающего запросы на сокете 127.0.0.1:53/UDP и проксирующего эти запросы на внешние серверы, поддерживающие TLS-шифрование (их немного - но они уже есть). Дальше по тексту мы займёмся настройкой локального (работающего на Вашем ПК) DNS прокси-сервера с поддержкой DNS over TLS.

Настройка локального кеширующего DNS-сервера для работы с DNS over TLS.

Всё написанное выше можно было не читать. :)

Устанавливаем на целевой ПК кеширующий DNS-сервер unbound.

sudo apt-get install unbound

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

sudo vim /etc/unbound/unbound.conf.d/dns-over-tls.conf

Содержимое файла /etc/unbound/unbound.conf.d/dns-over-tls.conf:

######Начало файла /etc/unbound/unbound.conf.d/dns-over-tls.conf v0.1 
server:
    access-control: 127.0.0.0/8 allow   #Разрешаем доступ к серверу только с петлевого интерфейса.
    cache-max-ttl: 14400    #Макс. время жизни записей в кеше в секундах.
    cache-min-ttl: 900  #Минимальное время жизни записей в кеше.
    hide-identity: yes  #Сервер приватный и это нам не нужно.
    hide-version: yes   #См. коментарий выше.
    interface: 127.0.0.1    #Сервер слушает только запросы с localhost.
    minimal-responses: yes  #Сокращаем размер ответов на запросы, немного повышаем производительность сервера (не принципиально).
    prefetch: yes       #Автоматическое обновление данных перед тем, как данные устареют (см. cache-max-ttl).
    qname-minimisation: yes #Сообщаем о себе минимум информации вышестоящим серверам (см. forward-addr ниже).
    rrset-roundrobin: yes   #"Прокручиваем" Resource Record Set из ответов, чтобы равномернее распределить запросы.
    ssl-upstream: yes   #ОЧЕНЬ ВАЖНО!!!
    use-caps-for-id: yes    #Дополнительная защита от DNS спуфинга
    verbosity: 1        #verbosity

forward-zone:
    name: "."   #Разрешаем все DNS-запросы

    #Далее следует список серверов, на которые будут пересылаться запросы.
    forward-addr: 145.100.185.15@853  # dnsovertls.sinodun.com US
    forward-addr: 145.100.185.16@853  # dnsovertls1.sinodun.com US
    forward-addr: 184.105.193.78@853  # tls-dns-u.odvr.dns-oarc.net US
    forward-addr: 185.49.141.37@853   # getdnsapi.net US
    forward-addr: 199.58.81.218@853   # dns.cmrg.net US

######Конец файла

Далее следует проверить статус демона unbound

sudo systemctl status unbound

и запустить

sudo systemctl start unbound

или перезапустить его

sudo systemctl restart unbound

Теперь надо убедиться, что unbound готов принимать запросы.

sudo -i
netstat -lp|grep unbound

Всё в порядке, если Вы видите строку:

udp        0      0 localhost:domain        *:*           5635/unbound

Теперь можно в настройках сетевого подключения указать в качестве DNS-сервера адрес 127.0.0.1. Все запросы пойдут через unbound.

Заключение.

Мы настроили локальный кеширующий DNS-сервер, который умеет работать с DNS-запросами и ответами, инкапсулированными в TLS. Предложенная конфигурация подходит для отдельных хостов, не интегрированных в офисную инфраструктуру. Эту конфигурацию есть куда улучшать в плане безопасности. Мы этим займёмся - но позже.