DNS - это распределённый сетевой сервис, позволяющий обращаться к узлам в локальных сетях и в сети "Internet" не по сетевым адресам вида 81.176.66.163 - а используя буквенные имена (например: lib.ru).
DNS - это важная часть Глобальной паутины (WWW) и большинство Интернет-пользователей активно использует DNS, даже не зная об этом. Когда говорят о блокировке сайта - то скорее всего речь идёт о блокировке DNS-записей, связывающих символьное имя сайта с его сетевым адресом.
С DNS много что не так - но в рамках данной статьи нас будет интересовать только то, что почти все DNS-запросы и ответы на запросы передаются в сети Интернет в незашифрованном виде. Возможно Вы заметили, что в последние годы сетевое сообщество активно продвигает технологии защиты (шифрования) данных. Многие Веб-сайты или стали доступны по https, или полностью отказались от доступа по http и теперь доступны только по https. На фоне этого праздника жизни современная DNS-инфраструктура с передачей запросов и ответов открытым текстом выглядит как бедный родственник. Почему нас это волнует? - Потому, что любые данные, передаваемые по сети в незашифрованном виде, могут быть перехвачены, изучены и подменены. Правда здорово?!
К счастью для нас Инженерный совет Интернета (IETF) разработал спецификацию DNS over TLS. Все подробности можно узнать, прочитав пояснительную записку RFC7858.
К несчастью для нас на момент написания этой статьи большинство популярных DNS-серверов не поддерживает TLS-шифрование. Также проблематично найти пользовательское программное обеспечение, способное работать с DNS через TLS. Выходом из сложившейся ситуации является настройка кеширующего DNS-сервера, принимающего запросы на сокете 127.0.0.1:53/UDP и проксирующего эти запросы на внешние серверы, поддерживающие 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. Предложенная конфигурация подходит для отдельных хостов, не интегрированных в офисную инфраструктуру. Эту конфигурацию есть куда улучшать в плане безопасности. Мы этим займёмся - но позже.