- Регистрация
- 3 Апр 2006
- Сообщения
- 631
- Реакции
- 1.025
- Автор темы
- Модер.
- #1
Как проверить работу DNS over HTTPS с помощью curl и jq
DNS over HTTPS (DoH) позволяет отправить DNS-запрос как обычный HTTPS-запрос по порту 443. Google Public DNS даёт JSON API, который особенно хорошо работает с curl и jq для диагностики, шелл-скриптов и точечных проверок в CI.
В этой статье используется dns.google/resolve, JSON API Google. Стандартизованный эндпоинт RFC 8484 по адресу dns.google/dns-query вместо этого работает с бинарными DNS-сообщениями.
Однострочник
Эта команда запрашивает A-запись для cloudflare.com:curl -sS -H "Accept: application/dns-json" "https://dns.google/resolve?name=cloudflare.com&type=A" | jq .У каждой части своя небольшая и явная задача:

В Windows PowerShell используйте curl.exe, если curl всё ещё резолвится как алиас PowerShell.
Читаем реальный ответ
На момент написания команда вернула такой ответ для cloudflare.com. DNS-данные - это снимок: кэширование, маршрутизация CDN и изменения конфигурации могут дать другие значения позже или из другого места.
JavaScript:
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "cloudflare.com.",
"type": 1
}
],
"Answer": [
{
"name": "cloudflare.com.",
"type": 1,
"TTL": 300,
"data": "104.16.133.229"
},
{
"name": "cloudflare.com.",
"type": 1,
"TTL": 300,
"data": "104.16.132.229"
}
],
"Comment": "Response from 162.159.0.33."
}
Важные поля:

Для незакэшированного ответа финальный Comment указывает сервер, от которого Google получил ответ. Это не адрес DoH-эндпоинта, к которому обратился curl.
Запрашиваем A, AAAA и другие типы записей
Чтобы запросить IPv6, поменяйте только type:curl -sS -H "Accept: application/dns-json" "https://dns.google/resolve?name=cloudflare.com&type=AAAA" | jq .API поддерживает и другие типы записей:
# Почтовые серверы
curl -sS "https://dns.google/resolve?name=cloudflare.com&type=MX" | jq .# Авторитетные серверы имён
curl -sS "https://dns.google/resolve?name=cloudflare.com&type=NS" | jq .# Текстовые записи, например SPF или записи для верификации
curl -sS "https://dns.google/resolve?name=cloudflare.com&type=TXT" | jq .Запрос ANY - ненадёжная замена отдельным запросам A, AAAA, MX или другим. Многие авторитетные серверы имён намеренно отдают на ANY только ограниченный ответ.
Печатаем только адреса через jq
Полный JSON для скриптов часто слишком многословный. Этот фильтр печатает только IPv4-адреса:curl -sS "https://dns.google/resolve?name=cloudflare.com&type=A" | jq -r '.Answer[]? | select(.type == 1) | .data'Для ответа из примера вывод такой:
104.16.133.229104.16.132.229Чтобы напечатать AAAA-записи, фильтруйте тип записи 28:
curl -sS "https://dns.google/resolve?name=cloudflare.com&type=AAAA" | jq -r '.Answer[]? | select(.type == 28) | .data'Ответа будет такой:
2606:4700::6810:85e52606:4700::6810:84e5Знак вопроса в .Answer[]? важен. Если массива Answer нет после NXDOMAIN или SERVFAIL, фильтр не падает лишь потому, что этого поля нет.
Собираем надёжную проверку для CI
HTTP 200 от DoH значит, что обработка HTTP и обмен с резолвером прошли успешно. В DNS-ответе при этом всё ещё могут быть SERVFAIL, REFUSED или другая ошибка. Проверка на Bash должна проверять оба слоя:
Bash:
response="$(
curl --fail --silent --show-error \
--connect-timeout 3 \
--max-time 10 \
-H "Accept: application/dns-json" \
"https://dns.google/resolve?name=cloudflare.com&type=A"
)"
jq -e '
.Status == 0 and
([.Answer[]? | select(.type == 1)] | length > 0)
' <<<"$response" >/dev/null
curl --fail превращает HTTP-ошибки в неуспешную команду. jq -e возвращает ошибку, если DNS-статус неуспешный или A-записи нет. Поэтому команда подходит для диагностической джобы или точечного smoke-теста.
Для домена за CDN или прокси обычно не зашивайте полученные IP-адреса. Они могут измениться, пока сервис остаётся в порядке. Проверять DNS-статус, тип записи и наличие ответа обычно надёжнее.
Справка
Google описывает параметры и поля ответа в Для просмотра ссылки Войди
PS: Если вам нужны альтернативные серверы DNS с поддержкой DoH, загляните на
Для просмотра ссылки Войди