MyTetra Share
Делитесь знаниями!
Как настроить шифрацию DNS-запросов в Linux через DoT или через DoH
Время создания: 04.06.2024 17:57
Автор: Сергей rtxtxtrx
Текстовые метки: linux, шифрация, шифрование, DNS, запрос, over, TLS, DoT, DNSSec, DoH, HTTPS
Раздел: Компьютер - Linux - Сеть в Linux
Запись: xintrea/mytetra_syncro/master/base/1717513041cqzse7lvcq/text.html на raw.github.com

Настройка шифрования через 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"

}

]

}



Так же в этом разделе:
 
MyTetra Share v.0.64
Яндекс индекс цитирования