Настройка шифрования через DNS Over TLS (DoT) / DNSSec
Этот способ хорош тем, что ничего дополнительно ставить не нужно. Systemd-resolved давно поддерживает DNSSEC, а значит, будет работать и в умеренно старых дистрибутивах на базе systemd. В UDP с поддержкой TLS существует неопределенность, а поэтому для обращения к конечным DNS серверам вместо UDP используется TCP. Схема: клиент обращается по UDP к локальному DNS, а тот делает DNS-запросы с использованием TLS поверх TCP.
Примечание. По задумке автора, команда sudo -e открывает на редактирование заданный файл под правами пользователя. Но во многих дистрибутивах такая команда без специальной настройки работать не будет. Вместо этого, просто надо под рутом отредактировать заданный файл.
Ищем секцию [Resolve] и прописываем настройки:
$ sudo -e /etc/systemd/resolved.conf
...
[Resolve]
...
DNS=1.1.1.1
FallbackDNS=1.0.0.1
DNSSEC=yes
DNSOverTLS=yes
Содержимое всего файла /etc/resolv.conf должно быть таким:
$ sudo -e /etc/resolv.conf
nameserver 127.0.0.53
Перезапускаем сервис для применения настроек:
$ systemctl restart systemd-resolved.service
Проверяем:
$ resolvectl
Global
Protocols: +LLMNR +mDNS +DNSOverTLS DNSSEC=yes/supported
resolv.conf mode: foreign
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1
Fallback DNS Servers: 1.0.0.1
Делаем тестовый запрос:
$ dig example.com
; <<>> DiG 9.18.24 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58280
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 6439 IN A 93.184.216.34
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Mar 03 13:17:55 MSK 2024
;; MSG SIZE rcvd: 56
SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
Данный ответ означает что запросы к DNS осуществляются через защищенное соединение (по каким признакам автор это определил, непонятно).
Примечание. Вместо DNS=1.1.1.1 (Cloudflare) можно указать гугловый DNS 8.8.8.8 и фолбечный 8.8.4.4 к нему.
А как быть тем, кому религиозные убеждения не позволяют использовать systemd? Качаем репозиторий и переходим в каталог:
$ git clone https://github.com/s3rgeym/dot-proxy
$ cd dot-proxy
Редактируем файл .env чтобы сменить DNS. Запускаем DoT-прокси:
docker-compose up -d
Меняем /etc/resolv.conf:
nameserver 127.0.0.52
Проверяем:
$ dig www.linux.org.ru | grep -i server
;; SERVER: 127.0.0.52#53(127.0.0.52) (UDP)
Если не устраивает мое поделие, то можно обратиться к классике типа Unbound. Статья на википедии: https://ru.wikipedia.org/wiki/DNS_поверх_TLS.
Настройка шифрования через DNS Over HTTPS (DoH)
Этот способ использовался ранее, но все еще актуален. Локальный сервер принимает UDP-запросы и пересылает их на серваки Гугла, Клауда, которые поддерживают DNS Over HTTPS: GET и POST запросы с параметром name и JSON-лапшой в виде ответа. См. RFC 8484.
Ставим пакет:
$ yay -S dns-over-https
В качестве nameserver указываем 127.0.0.1:
$ sudo -e /etc/resolv.conf
nameserver 127.0.0.1
Тут можно dns-сервер выбрать:
$ sudo -e /etc/dns-over-https/doh-client.conf
$ sudo systemctl enable --now doh-client.service
Проверяем:
$ dig www.google.com | grep -i server
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
Инструкция с Arch Wiki:
Сама утилита:
Прочее:
Более старое решение:
Вот пример DNS-запроса через HTTPs (чисто в академических целях):
$ curl -s 'https://dns.google/resolve?name=example.com&type=A' | jq
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "example.com.",
"type": 1
}
],
"Answer": [
{
"name": "example.com.",
"type": 1,
"TTL": 371,
"data": "93.184.215.14"
}
]
}