Skip to content

sagi/node-dns-over-tls

Repository files navigation

dns-over-tls

dns-over-tls is a Node.js DNS-over-TLS API. Here's a blog post that explains how it works.

CircleCI Coverage Status MIT License version

Installation

$ npm install dns-over-tls

API

We import as follows:

const dnstls = require('dns-over-tls')

All API usages return a Promise that resolves to a DNS response object.

dnstls.query(name)

(async () => {
  const dnsResponse  = await dnstls.query('sagi.io')
})()

Sends a DNS-over-TLS request of domain name 'sagi.io' to Cloudflare's dns-over-tls server (host is '1.1.1.1' and servername is 'cloudflare-dns.com').

dnstls.query(host, servername, name)

(async () => {
  const dnsResponse  = await dnstls.query('9.9.9.9', 'dns.quad9.net', 'sagi.io')
})()

Sends a DNS-over-TLS request of domain name 'sagi.io' to host '9.9.9.9' with servername 'dns.quad9.net'.

dnstls.query({ host, servername, name, klass = 'IN', type = 'A', port = 853 })

Allows for more advanced DNS queries.

(async () => {
  const options = {
    name: 'authors.bind',
    host: '145.100.185.15',
    servername: 'dnsovertls.sinodun.com',
    klass: 'CH',
    type: 'TXT'
  };

  const dnsResponse = await dnstls.query(options)
})

Sends a DNS-over-TLS request of domain name 'authors.bind' to host '145.100.185.15' with servername 'dnsovertls.sinodun.com', class 'CH' and type 'TXT'.

Example

Say we'd like to get the NS records of domain sagi.io:

  const options = {
    name: 'sagi.io',
    host: '1.1.1.1',
    servername: 'cloudflare-dns.com',
    type: 'NS',
  };
  const dnsResponse = await dnstls.query(options);
  console.log(JSON.stringify(dnsResponse, null, 2));

Code from example.

Output:

{
  "id": 46597,
  "type": "response",
  "flags": 384,
  "flag_qr": true,
  "opcode": "QUERY",
  "flag_aa": false,
  "flag_tc": false,
  "flag_rd": true,
  "flag_ra": true,
  "flag_z": false,
  "flag_ad": false,
  "flag_cd": false,
  "rcode": "NOERROR",
  "questions": [
    {
      "name": "sagi.io",
      "type": "NS",
      "class": "IN"
    }
  ],
  "answers": [
    {
      "name": "sagi.io",
      "type": "NS",
      "ttl": 10703,
      "class": "IN",
      "flush": false,
      "data": "cass.ns.cloudflare.com"
    },
    {
      "name": "sagi.io",
      "type": "NS",
      "ttl": 10703,
      "class": "IN",
      "flush": false,
      "data": "dave.ns.cloudflare.com"
    }
  ],
  "authorities": [],
  "additionals": []
}

License

MIT