3 releases
0.3.3 | Apr 7, 2024 |
---|---|
0.3.2 | Apr 7, 2024 |
0.3.1 | Oct 16, 2023 |
#647 in Network programming
209 downloads per month
30KB
296 lines
dug
Name resolution aggregator
Synopsis
dug HOSTNAME [HOSTNAME [HOSTNAME ...]]
dug --json HOSTNAME [HOSTNAME [HOSTNAME ...]]
Options
Description
dug
is designed to be an exhaustive name lookup tool, looking up the given hostname(s) using any
method available in the tool or on the system.
Some methods/sources used are:
- The local host's configured resolver
- e.g., gethostname(3), gethostbyname(3), getnameinfo(3), etc.
- Major public DNS resolvers:
- Cloudflare
- Quad9
- A simulated nslookup
- Works by parsing
/etc/resolv.conf
(if present) and querying the hosts found. - May be significantly different from OS-based resolution.
- Works by parsing
dug
will also use external utilities such as dig
(from BIND9) or drill
(from
ldns) if found on the $PATH
.
Resolvers are tried concurrently where possible, and results are aggregated in either a pretty-printed ASCII view, or as JSON output suitable for consumption by jq.
Examples
Example: Text
$ dug aws.amazon.com www.kame.net
┌aws.amazon.com─────────────────┬───────────────────────────────────────┐
│ Cloudflare DNS │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ Quad9 DNS │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ Google DNS │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ OS resolution │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ simulated nslookup │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ resolv.conf server[10.7.0.1] │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ resolv.conf server[127.0.0.1] │ Timed out after 7s │
├───────────────────────────────┼───────────────────────────────────────┤
│ A (dig) │ tp.8e49140c2-frontier.amazon.com. │
│ │ dr49lng3n1n2s.cloudfront.net. │
│ │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ AAAA (dig) │ tp.8e49140c2-frontier.amazon.com. │
│ │ dr49lng3n1n2s.cloudfront.net. │
│ │ 2600:9000:24bb:9200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:e200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:b000:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:4600:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:e600:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:5e00:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:be00:1c:a813:8512:c241 │
├───────────────────────────────┼───────────────────────────────────────┤
│ A (drill) │ tp.8e49140c2-frontier.amazon.com. │
│ │ dr49lng3n1n2s.cloudfront.net. │
│ │ 18.155.190.47 │
├───────────────────────────────┼───────────────────────────────────────┤
│ AAAA (drill) │ tp.8e49140c2-frontier.amazon.com. │
│ │ dr49lng3n1n2s.cloudfront.net. │
│ │ 2600:9000:24bb:6800:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:2200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:bc00:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:dc00:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:cc00:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:5200:1c:a813:8512:c241 │
│ │ 2600:9000:24bb:7000:1c:a813:8512:c241 │
└───────────────────────────────┴───────────────────────────────────────┘
┌www.kame.net───────────────────┬────────────────────────────────────┐
│ Google DNS │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ Quad9 DNS │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ Cloudflare DNS │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ OS resolution │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ simulated nslookup │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ resolv.conf server[127.0.0.1] │ Timed out after 7s │
├───────────────────────────────┼────────────────────────────────────┤
│ resolv.conf server[10.7.0.1] │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ A (dig) │ mango.itojun.org. │
│ │ 210.155.141.200 │
├───────────────────────────────┼────────────────────────────────────┤
│ AAAA (dig) │ mango.itojun.org. │
│ │ 2001:2f0:0:8800::1:1 │
│ │ 2001:2f0:0:8800:226:2dff:fe0b:4311 │
├───────────────────────────────┼────────────────────────────────────┤
│ drill │ deadline has elapsed │
└───────────────────────────────┴────────────────────────────────────┘
Example: JSON
$ dug --json aws.amazon.com
[
{
"name": "aws.amazon.com",
"source": "Quad9 DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "Cloudflare DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "Google DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "OS resolution",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "simulated nslookup",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "resolv.conf server[10.7.0.1]",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "resolv.conf server[127.0.0.1]",
"failure": "Timed out after 7s"
},
{
"name": "aws.amazon.com",
"source": "A (dig)",
"records": [
"tp.8e49140c2-frontier.amazon.com.",
"dr49lng3n1n2s.cloudfront.net.",
"18.155.190.47"
]
}
]
Example: use with jq
Collect all unique records returned by all resolvers.
$ dug -j aws.amazon.com | jq -r '[.[].records | select(. != null) .[]] | unique .[]'
13.35.127.119
2600:9000:21c4:3000:1c:a813:8513:e1c1
2600:9000:21c4:6e00:1c:a813:8513:e1c1
2600:9000:21c4:9200:1c:a813:8513:e1c1
2600:9000:21c4:b400:1c:a813:8513:e1c1
2600:9000:21c4:b600:1c:a813:8513:e1c1
2600:9000:21c4:d600:1c:a813:8513:e1c1
2600:9000:21c4:e400:1c:a813:8513:e1c1
2600:9000:21c4:e600:1c:a813:8513:e1c1
dr49lng3n1n2s.cloudfront.net.
tp.8e49140c2-frontier.amazon.com.
This looks busy, but here's the process:
dug
outputs an array of JSON objectsjq
extracts therecords
property of each, which is an array of IPs- strip the
null
values; ie, ignore unsuccessful resolutions - collect all the results into a single array
- strip duplicate values
Dependencies
~18–31MB
~547K SLoC