HTTPS üzerinden DNS için JSON API (DoH)

Önceden web tabanlı uygulamalar, tarayıcı uzantılarının DANE ve DNS-SD hizmet keşfi gibi gelişmiş DNS özelliklerini kullanması ve hatta MX kayıtları gibi IP adresleri dışında her şeyi çözümlemesi gerektiriyordu. SSHFP kayıtları gibi DNSSEC'ye bağlı özellikleri kullanmak için bu tür uzantıların DNSSEC'yi kendilerinin doğrulaması gerekir. Tarayıcı veya işletim sistemi bunu doğrulamayabilir.

Google Açık DNS, 2016'dan beri DoH için DNSSEC doğrulamasına sahip, tarayıcı veya işletim sistemi yapılandırması ya da uzantısı gerektirmeyen, web dostu bir API sunar. Basit GET sorgu parametreleri ve JSON yanıtları, istemcilerin yaygın web API'lerini kullanarak sonuçları ayrıştırmasına olanak tanır ve alan adları için işaretçi sıkıştırma gibi karmaşık DNS mesaj biçimi ayrıntılarından kaçınmanızı sağlar.

HTTP üstbilgileri, yönlendirme işleme, gizlilikle ilgili en iyi uygulamalar ve HTTP durum kodları gibi genel DoH hakkında bilgi edinmek için genel DoH belgeleri sayfasına bakın.

Güvenli Aktarımlar sayfasında DoH için curl komut satırı örneğinin yanı sıra TLS desteği ve DNS kesme gibi DoH ve TLS (DoT) üzerinden DNS'de yaygın olan bilgiler bulunur.

JSON API Spesifikasyonu

Tüm API çağrıları HTTP GET istekleridir. Yinelenen parametreler olması durumunda yalnızca ilk değer kullanılır.

Desteklenen parametreler

ad

string, gerekli

Zorunlu tek parametre. RFC 4343 ters eğik çizgi çıkışları kabul edilir.

  • Uzunluk (ters eğik çizgi çıkışları değiştirildikten sonra) 1 ile 253 arasında olmalıdır (varsa isteğe bağlı son nokta göz ardı edilir).
  • Tüm etiketler (noktalar arasındaki adın bölümleri) 1 ila 63 bayt uzunluğunda olmalıdır.
  • .example.com, example..com veya boş dize gibi geçersiz adlar 400 Hatalı İstek alır.
  • ASCII olmayan karakterler punycoded olmalıdır (ελ değil xn--qxam).
tür

dize, varsayılan: 1

RR türü, [1, 65535] içinde bir sayı veya standart dize (büyük/küçük harfe duyarlı değil, A veya aaaa gibi) olarak temsil edilebilir. "ANY" sorguları için 255 kullanabilirsiniz ancak bunun hem A hem de AAAA veya MX kayıtlarına yönelik sorgu göndermenin yerini almadığını unutmayın. Yetkili alan adı sunucularının bu tür sorgular için tüm kayıtları döndürmesi gerekmez. Bazıları yanıt vermezken bazıları (cloudflare.com gibi) yalnızca HINFO döndürür.

cd

boole, varsayılan: false

CD (Devre Dışı İşaretleniyor) işareti. DNSSEC doğrulamasını devre dışı bırakmak için cd=1 veya cd=true kullanın. DNSSEC doğrulamasını etkinleştirmek için cd=0 veya cd=false parametresini kullanın ya da cd parametresi kullanmayın.

adt

dize, varsayılan: boş

İstenen içerik türü seçeneği. Yanıt HTTP gövdesinde JSON metni yerine ikili DNS mesajı almak için ct=application/dns-message politikasını kullanın. JSON metnini açıkça istemek için ct=application/x-javascript kullanın. Diğer içerik türü değerleri yoksayılır ve varsayılan JSON içeriği döndürülür.

do

boole, varsayılan: false

DO (DNSSEC OK) işareti. DNSSEC kayıtlarını (RRSIG, NSEC, NSEC3) eklemek için do=1 veya do=true kullanın; DNSSEC kayıtlarını atlamak için do=0 veya do=false parametresini kullanın ya da do parametresi kullanmayın.

Diğer uygulamalar her zaman bunları içerebileceği için uygulamalar JSON yanıtlarındaki DNSSEC kayıtlarını her zaman işlemeli (ve gerekirse yoksaymalıdır). Ayrıca, JSON yanıtları için varsayılan davranışı ileride değiştirebiliriz. (İkili DNS mesajı yanıtları her zaman DO işaretinin değerine uyar.)

edns_client_subnet

dize, varsayılan: boş

edns0-client-subnet seçeneği. Biçim, alt ağ maskesi olan bir IP adresidir. Örnekler: 1.2.3.4/24, 2001:700:300::/48.

Gizlilikle ilgili endişeler nedeniyle DNS-over-HTTPS kullanıyorsanız ve IP adresinizin hiçbir bölümünün, coğrafi konum doğruluğu için yetkili ad sunucularına gönderilmesini istemiyorsanız edns_client_subnet=0.0.0.0/0 kullanın. Google Açık DNS, normalde yaklaşık ağ bilgilerini gönderir (genellikle IPv4 adresinizin son kısmını sıfırlar).

random_padding

dize, yoksayıldı

Bu parametrenin değeri yoksayılır. Örnek: XmkMw~o_mgP2pf.gpw-Oi5dK.

HTTPS GET isteklerinin paket boyutlarını kullanan olası yan kanal gizlilik saldırılarından endişe duyan API istemcileri, istekleri rastgele verilerle doldurarak tüm istekleri tam olarak aynı boyutta yapmak için bunu kullanabilir. URL'nin yanlış yorumlanmasını önlemek için dolgu karakterlerini ayrılmamış URL karakterleriyle sınırlandırın: büyük ve küçük harfler, rakamlar, kısa çizgi, nokta, alt çizgi ve yaklaşık işareti.

JSON'da DNS yanıtı

Başarılı bir yanıt (buraya eklenen yorumlar gerçek yanıtlarda yer almaz):

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "apple.com.",  // FQDN with trailing dot
      "type": 1              // A - Standard DNS RR type
    }
  ],
  "Answer":
  [
    {
      "name": "apple.com.",   // Always matches name in the Question section
      "type": 1,              // A - Standard DNS RR type
      "TTL": 3599,            // Record's time-to-live in seconds
      "data": "17.178.96.59"  // Data for A - IP address as text
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.172.224.47"
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.142.160.59"
    }
  ],
  "edns_client_subnet": "12.34.56.78/0"  // IP address / scope prefix-length
}

"Kapsam önek uzunluğu" ve önbelleğe almayı nasıl etkilediği hakkında ayrıntılı bilgi edinmek için RFC 7871 (EDNS İstemci Alt Ağı) sayfasına bakın.

Teşhis bilgilerini içeren bir hata yanıtı:

{
  "Status": 2,  // SERVFAIL - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "dnssec-failed.org.",  // FQDN with trailing dot
      "type": 1                      // A - Standard DNS RR type
    }
  ],
  "Comment": "DNSSEC validation failure. Please check http://dnsviz.net/d/dnssec-failed.org/dnssec/."
}

Yerleştirilmiş tırnak işaretleri ve ad sunucusu atıflarına sahip SPF ve TXT kayıtları:

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "*.dns-example.info.",  // FQDN with trailing dot
      "type": 99                      // SPF - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "*.dns-example.info.",   // Always matches name in Question
      "type": 99,                      // SPF - Standard DNS RR type
      "TTL": 21599,                    // Record's time-to-live in seconds
      "data": "\"v=spf1 -all\""        // Data for SPF - quoted string
    }
  ],
  "Comment": "Response from 216.239.38.110"
  // Uncached responses are attributed to the authoritative name server
}

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "s1024._domainkey.yahoo.com.", // FQDN with trailing dot
      "type": 16                             // TXT - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "s1024._domainkey.yahoo.com.", // Always matches Question name
      "type": 16,                            // TXT - Standard DNS RR type
      "data": "\"k=rsa;  p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrEee0Ri4Juz+QfiWYui/E9UGSXau/2P8LjnTD8V4Unn+2FAZVGE3kL23bzeoULYv4PeleB3gfm\"\"JiDJOKU3Ns5L4KJAUUHjFwDebt0NP+sBK0VKeTATL2Yr/S3bT/xhy+1xtj4RkdV7fVxTn56Lb4udUnwuxK4V5b5PdOKj/+XcwIDAQAB; n=A 1024 bit key;\""
      // Data for TXT - multiple quoted strings
    }
  ],
}

DNS dizeleri

Tüm TXT kayıtları, RFC 4408 (SPF) veya RFC 4871 (DKIM) gibi daha uzun TXT kaydı biçimlerinin kullanımı dahil olmak üzere tek bir JSON dizesi olarak kodlanır.

EDNS

Genel EDNS uzantı mekanizması desteklenmez. EDNS İstemci Alt Ağı seçeneği (edns-client-subnet), GET isteğindeki bir parametre ve JSON yanıtında üst düzey bir alandır.