DOH (DNS over HTTPS) тестируем в консоли через curl и jq

someone

сисадмин сервера 0ed
Команда форума
Администратор
Регистрация
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 .

У каждой части своя небольшая и явная задача:

DNS over HTTPS с curl - проверяем записи A и AAAA.1.jpg

В 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."
}

Важные поля:

DNS over HTTPS с curl - проверяем записи A и AAAA.2.jpg

Для незакэшированного ответа финальный 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.229
104.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:85e5
2606: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 описывает параметры и поля ответа в Для просмотра ссылки Войди или Зарегистрируйся. Для просмотра ссылки Войди или Зарегистрируйся объясняет разницу между JSON-эндпоинтом и эндпоинтом RFC 8484. Подробности фильтров смотрите в Для просмотра ссылки Войди или Зарегистрируйся.

PS: Если вам нужны альтернативные серверы DNS с поддержкой DoH, загляните на
Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
 
Назад
Сверху