ddig 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +57 -0
- data/lib/ddig/cli.rb +49 -40
- data/lib/ddig/ddr/designated_resolver.rb +44 -3
- data/lib/ddig/ddr.rb +9 -0
- data/lib/ddig/resolver/do53.rb +14 -0
- data/lib/ddig/resolver/doh_h1.rb +16 -0
- data/lib/ddig/resolver/dot.rb +16 -0
- data/lib/ddig/version.rb +1 -1
- data/lib/ddig.rb +3 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a776d193cef1eb47509ef1979fe17267088c418c89320e1f6db61da04e8d5f4c
|
4
|
+
data.tar.gz: 463dc9f0efa82b6b1bde2e7641fe2fe866b470faae033fbadd8eadca72479a81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 175b5193ff75e92e5a5d3a07f9589918a6a943dae64b6002b5ead5f3af205cbbd6d49512d5607c86ed55e5afcbca4d40ee89de5a2095161c1eb3ebe67415c1d8
|
7
|
+
data.tar.gz: c633c6733c13cc5363e176bb3d7bb9dac66e14b0fea6072729d6d1692e2517a7d4d1ac68b818b342c4ff24d33958753e701e8916fdd48d00ec169492b16778fc
|
data/README.md
CHANGED
@@ -130,6 +130,7 @@ Usage: ddig [options] hostname
|
|
130
130
|
--dot use resolve type of dot
|
131
131
|
--doh-h1 use resolve type of doh (http/1.1)
|
132
132
|
--doh-path=doh-path doh service path
|
133
|
+
--ddr discover designated resolvers via ddr (discovery of designated resolvers)
|
133
134
|
-4, --ipv4 use IPv4 query transport only
|
134
135
|
-6, --ipv6 use IPv6 query transport only
|
135
136
|
-@ipaddress|doh-hostname, nameserver
|
@@ -142,6 +143,43 @@ Usage: ddig [options] hostname
|
|
142
143
|
--version show version.
|
143
144
|
```
|
144
145
|
|
146
|
+
```sh
|
147
|
+
$ ddig --nameserver 8.8.8.8 dns.google
|
148
|
+
# Do53 (IPv4)
|
149
|
+
dns.google A 8.8.4.4
|
150
|
+
dns.google A 8.8.8.8
|
151
|
+
dns.google AAAA 2001:4860:4860::8844
|
152
|
+
dns.google AAAA 2001:4860:4860::8888
|
153
|
+
|
154
|
+
# SERVER: 8.8.8.8
|
155
|
+
|
156
|
+
# DDR
|
157
|
+
## DDR (#0) - dot: dns.google:853 (8.8.4.4), unencrypted_resolver: 8.8.8.8, verify cert: true
|
158
|
+
dns.google A 8.8.4.4
|
159
|
+
dns.google A 8.8.8.8
|
160
|
+
dns.google AAAA 2001:4860:4860::8844
|
161
|
+
dns.google AAAA 2001:4860:4860::8888
|
162
|
+
|
163
|
+
# SERVER(Address): 8.8.4.4
|
164
|
+
# PORT: 853
|
165
|
+
|
166
|
+
...
|
167
|
+
|
168
|
+
# SERVER(Address): 2001:4860:4860::8888
|
169
|
+
# PORT: 853
|
170
|
+
|
171
|
+
## DDR (#6) - h2: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
172
|
+
dns.google A 8.8.8.8
|
173
|
+
dns.google A 8.8.4.4
|
174
|
+
dns.google AAAA 2001:4860:4860::8844
|
175
|
+
dns.google AAAA 2001:4860:4860::8888
|
176
|
+
|
177
|
+
# SERVER(Hostname): 2001:4860:4860::8888
|
178
|
+
# SERVER(Path): /dns-query{?dns}
|
179
|
+
# PORT: 443
|
180
|
+
...
|
181
|
+
```
|
182
|
+
|
145
183
|
- UDP(Do53)
|
146
184
|
```sh
|
147
185
|
$ ddig --udp --nameserver 8.8.8.8 dns.google
|
@@ -178,6 +216,25 @@ dns.google AAAA 2001:4860:4860::8844
|
|
178
216
|
# PORT: 443
|
179
217
|
```
|
180
218
|
|
219
|
+
- DDR (Discovery of Designated Resolvers)
|
220
|
+
```sh
|
221
|
+
$ ddig --ddr --nameserver 8.8.8.8
|
222
|
+
dot: dns.google:853 (8.8.8.8), unencrypted_resolver: 8.8.8.8, verify cert: true
|
223
|
+
dot: dns.google:853 (8.8.4.4), unencrypted_resolver: 8.8.8.8, verify cert: true
|
224
|
+
dot: dns.google:853 (2001:4860:4860::8844), unencrypted_resolver: 8.8.8.8, verify cert: true
|
225
|
+
dot: dns.google:853 (2001:4860:4860::8888), unencrypted_resolver: 8.8.8.8, verify cert: true
|
226
|
+
h2: dns.google:443 (8.8.8.8), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
227
|
+
h2: dns.google:443 (8.8.4.4), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
228
|
+
h2: dns.google:443 (2001:4860:4860::8844), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
229
|
+
h2: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
230
|
+
h3: dns.google:443 (8.8.4.4), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
231
|
+
h3: dns.google:443 (8.8.8.8), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
232
|
+
h3: dns.google:443 (2001:4860:4860::8888), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
233
|
+
h3: dns.google:443 (2001:4860:4860::8844), path: /dns-query{?dns}, unencrypted_resolver: 8.8.8.8, verify cert: true
|
234
|
+
|
235
|
+
# SERVER: 8.8.8.8
|
236
|
+
```
|
237
|
+
|
181
238
|
## Development
|
182
239
|
|
183
240
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/ddig/cli.rb
CHANGED
@@ -13,7 +13,7 @@ module Ddig
|
|
13
13
|
|
14
14
|
parse_options
|
15
15
|
|
16
|
-
|
16
|
+
unless valid_options?
|
17
17
|
puts @option_parser
|
18
18
|
exit
|
19
19
|
end
|
@@ -23,11 +23,12 @@ module Ddig
|
|
23
23
|
@option_parser = OptionParser.new do |opts|
|
24
24
|
opts.banner = "Usage: ddig [options] hostname"
|
25
25
|
|
26
|
-
opts.on("-d", "--dns-type={all|do53|dot}", "resolve type (default: all)") { |v| @options[:dns_type] = v }
|
26
|
+
opts.on("-d", "--dns-type={all|do53|dot|doh_h1}", "resolve type (default: all)") { |v| @options[:dns_type] = v }
|
27
27
|
opts.on("--udp", "use resolve type of udp(do53)") { |v| @options[:dns_type] = 'do53' }
|
28
28
|
opts.on("--dot", "use resolve type of dot") { |v| @options[:dns_type] = 'dot' }
|
29
29
|
opts.on("--doh-h1", "use resolve type of doh (http/1.1)") { |v| @options[:dns_type] = 'doh_h1' }
|
30
30
|
opts.on("--doh-path=doh-path", "doh service path") { |v| @options[:doh_path] = v }
|
31
|
+
opts.on("--ddr", "discover designated resolvers via ddr (discovery of designated resolvers)") { |v| @options[:ddr] = v }
|
31
32
|
opts.on("-4", "--ipv4", "use IPv4 query transport only") { |v| @options[:ipv4] = v }
|
32
33
|
opts.on("-6", "--ipv6", "use IPv6 query transport only") { |v| @options[:ipv6] = v }
|
33
34
|
opts.on("-@", "--nameserver=ipaddress|doh-hostname", "nameserver") { |v| @options[:nameserver] = v }
|
@@ -46,12 +47,29 @@ module Ddig
|
|
46
47
|
@hostname = @args[0]
|
47
48
|
end
|
48
49
|
|
50
|
+
def valid_options?
|
51
|
+
if @hostname.nil?
|
52
|
+
if @options[:ddr]
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
|
59
|
+
return true
|
60
|
+
end
|
61
|
+
|
49
62
|
def exec
|
50
63
|
if @options[:ipv4] || @options[:ipv6]
|
51
64
|
@use_ipv4 = @options[:ipv4] || false
|
52
65
|
@use_ipv6 = @options[:ipv6] || false
|
53
66
|
end
|
54
67
|
|
68
|
+
if @options[:ddr]
|
69
|
+
resolve_ddr
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
|
55
73
|
case @options[:dns_type]
|
56
74
|
when "all"
|
57
75
|
resolve_all
|
@@ -69,9 +87,27 @@ module Ddig
|
|
69
87
|
|
70
88
|
if @options[:format] == 'json'
|
71
89
|
# TODO: to_json
|
72
|
-
puts @ddig
|
73
90
|
else
|
74
|
-
|
91
|
+
unless @ddig[:do53][:ipv4].nil?
|
92
|
+
puts "# Do53 (IPv4)"
|
93
|
+
@ddig[:do53][:ipv4].to_cli
|
94
|
+
puts
|
95
|
+
end
|
96
|
+
|
97
|
+
unless @ddig[:do53][:ipv6].nil?
|
98
|
+
puts "# Do53 (IPv6)"
|
99
|
+
@ddig[:do53][:ipv6].to_cli
|
100
|
+
puts
|
101
|
+
end
|
102
|
+
|
103
|
+
unless @ddig[:ddr].nil?
|
104
|
+
puts "# DDR"
|
105
|
+
@ddig[:ddr].each_with_index do |designated_resolver, index|
|
106
|
+
puts "## DDR (##{index}) - #{designated_resolver.to_s}"
|
107
|
+
designated_resolver.to_cli
|
108
|
+
puts
|
109
|
+
end
|
110
|
+
end
|
75
111
|
end
|
76
112
|
end
|
77
113
|
|
@@ -84,35 +120,13 @@ module Ddig
|
|
84
120
|
exit
|
85
121
|
end
|
86
122
|
|
87
|
-
do53.
|
88
|
-
rr_type = 'A'
|
89
|
-
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
90
|
-
end
|
91
|
-
do53.aaaa.each do |address|
|
92
|
-
rr_type = 'AAAA'
|
93
|
-
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
94
|
-
end
|
95
|
-
|
96
|
-
puts
|
97
|
-
puts "# SERVER: #{do53.nameservers.join(', ')}"
|
123
|
+
do53.to_cli
|
98
124
|
end
|
99
125
|
|
100
126
|
def resolve_dot
|
101
127
|
dot = Ddig::Resolver::Dot.new(hostname: @hostname, server: @options[:nameserver], port: @options[:port]).lookup
|
102
128
|
|
103
|
-
dot.
|
104
|
-
rr_type = 'A'
|
105
|
-
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
106
|
-
end
|
107
|
-
dot.aaaa.each do |address|
|
108
|
-
rr_type = 'AAAA'
|
109
|
-
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
110
|
-
end
|
111
|
-
|
112
|
-
puts
|
113
|
-
puts "# SERVER(Address): #{dot.server}"
|
114
|
-
#puts "# SERVER(Hostname): #{dot.server_name}"
|
115
|
-
puts "# PORT: #{dot.port}"
|
129
|
+
dot.to_cli
|
116
130
|
end
|
117
131
|
|
118
132
|
def resolve_doh_h1
|
@@ -123,19 +137,14 @@ module Ddig
|
|
123
137
|
|
124
138
|
doh = Ddig::Resolver::DohH1.new(hostname: @hostname, server: @options[:nameserver], dohpath: @options[:doh_path], port: @options[:port]).lookup
|
125
139
|
|
126
|
-
doh.
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
133
|
-
end
|
140
|
+
doh.to_cli
|
141
|
+
end
|
142
|
+
|
143
|
+
def resolve_ddr
|
144
|
+
ip = Ddig::Ip.new(use_ipv4: @use_ipv4, use_ipv6: @use_ipv6)
|
145
|
+
ddr = Ddig::Ddr.new(nameservers: @options[:nameserver], ip: ip.ip_type)
|
134
146
|
|
135
|
-
|
136
|
-
puts "# SERVER(Hostname): #{doh.server}"
|
137
|
-
puts "# SERVER(Path): #{doh.dohpath}"
|
138
|
-
puts "# PORT: #{doh.port}"
|
147
|
+
ddr.to_cli
|
139
148
|
end
|
140
149
|
end
|
141
150
|
end
|
@@ -3,6 +3,7 @@ module Ddig
|
|
3
3
|
class DesignatedResolver
|
4
4
|
attr_reader :unencrypted_resolver, :target, :protocol, :port, :dohpath, :address, :ip
|
5
5
|
attr_reader :verify_cert
|
6
|
+
attr_reader :hostname, :a, :aaaa, :resolver, :errors
|
6
7
|
|
7
8
|
PROTOCOLS = ['http/1.1', 'h2', 'h3', 'dot', 'doq']
|
8
9
|
|
@@ -30,13 +31,53 @@ module Ddig
|
|
30
31
|
@verify_cert.verify
|
31
32
|
end
|
32
33
|
|
34
|
+
def lookup(hostname)
|
35
|
+
@hostname = hostname
|
36
|
+
@errors = []
|
37
|
+
|
38
|
+
case @protocol
|
39
|
+
when 'dot'
|
40
|
+
@resolver = Ddig::Resolver::Dot.new(hostname: @hostname, server: @address, server_name: @target, port: @port).lookup
|
41
|
+
|
42
|
+
unless @resolver.nil?
|
43
|
+
@a = @resolver.a
|
44
|
+
@aaaa = @resolver.aaaa
|
45
|
+
|
46
|
+
return self
|
47
|
+
end
|
48
|
+
|
49
|
+
when 'http/1.1', 'h2', 'h3'
|
50
|
+
@resolver = Ddig::Resolver::DohH1.new(hostname: @hostname, server: @address, address: @address, dohpath: @dohpath, port: @port).lookup
|
51
|
+
|
52
|
+
unless @resolver.nil?
|
53
|
+
@a = @resolver.a
|
54
|
+
@aaaa = @resolver.aaaa
|
55
|
+
|
56
|
+
return self
|
57
|
+
end
|
58
|
+
|
59
|
+
when 'doq'
|
60
|
+
@errors << "#{@protocol} is not supportted protocol"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_cli
|
65
|
+
@resolver.to_cli
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
if ['http/1.1', 'h2', 'h3'].include?(@protocol)
|
70
|
+
"#{@protocol}: #{@target}:#{@port} (#{@address}),\tpath: #{@dohpath},\tunencrypted_resolver: #{@unencrypted_resolver}, \tverify cert: #{@verify_cert.verify}"
|
71
|
+
else
|
72
|
+
"#{@protocol}: #{@target}:#{@port} (#{@address}),\tunencrypted_resolver: #{@unencrypted_resolver}, \tverify cert: #{@verify_cert.verify}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
33
76
|
# Set default port by protocol
|
34
77
|
# ref: https://www.rfc-editor.org/rfc/rfc9461.html#section-4.2
|
35
78
|
def set_default_port
|
36
79
|
case @protocol
|
37
|
-
when 'http/1.1'
|
38
|
-
@port = 80
|
39
|
-
when 'h2', 'h3'
|
80
|
+
when 'http/1.1', 'h2', 'h3'
|
40
81
|
@port = 443
|
41
82
|
when 'dot', 'doq'
|
42
83
|
@port = 853
|
data/lib/ddig/ddr.rb
CHANGED
@@ -129,6 +129,15 @@ module Ddig
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
+
def to_cli
|
133
|
+
@designated_resolvers.each do |designated_resolver|
|
134
|
+
puts designated_resolver.to_s
|
135
|
+
end
|
136
|
+
|
137
|
+
puts
|
138
|
+
puts "# SERVER: #{@nameservers.join(', ')}"
|
139
|
+
end
|
140
|
+
|
132
141
|
def set_nameservers
|
133
142
|
@nameservers = @nameserver.servers
|
134
143
|
|
data/lib/ddig/resolver/do53.rb
CHANGED
@@ -33,6 +33,20 @@ module Ddig
|
|
33
33
|
self
|
34
34
|
end
|
35
35
|
|
36
|
+
def to_cli
|
37
|
+
@a.each do |address|
|
38
|
+
rr_type = 'A'
|
39
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
40
|
+
end
|
41
|
+
@aaaa.each do |address|
|
42
|
+
rr_type = 'AAAA'
|
43
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
44
|
+
end
|
45
|
+
|
46
|
+
puts
|
47
|
+
puts "# SERVER: #{@nameservers.join(', ')}"
|
48
|
+
end
|
49
|
+
|
36
50
|
def set_nameservers
|
37
51
|
@nameservers = @nameserver.servers
|
38
52
|
|
data/lib/ddig/resolver/doh_h1.rb
CHANGED
@@ -56,6 +56,22 @@ module Ddig
|
|
56
56
|
return []
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
def to_cli
|
61
|
+
@a.each do |address|
|
62
|
+
rr_type = 'A'
|
63
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
64
|
+
end
|
65
|
+
@aaaa.each do |address|
|
66
|
+
rr_type = 'AAAA'
|
67
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
68
|
+
end
|
69
|
+
|
70
|
+
puts
|
71
|
+
puts "# SERVER(Hostname): #{@server}"
|
72
|
+
puts "# SERVER(Path): #{@dohpath}"
|
73
|
+
puts "# PORT: #{@port}"
|
74
|
+
end
|
59
75
|
end
|
60
76
|
end
|
61
77
|
end
|
data/lib/ddig/resolver/dot.rb
CHANGED
@@ -74,6 +74,22 @@ module Ddig
|
|
74
74
|
ssl_socket
|
75
75
|
end
|
76
76
|
end
|
77
|
+
|
78
|
+
def to_cli
|
79
|
+
@a.each do |address|
|
80
|
+
rr_type = 'A'
|
81
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
82
|
+
end
|
83
|
+
@aaaa.each do |address|
|
84
|
+
rr_type = 'AAAA'
|
85
|
+
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
86
|
+
end
|
87
|
+
|
88
|
+
puts
|
89
|
+
puts "# SERVER(Address): #{@server}"
|
90
|
+
#puts "# SERVER(Hostname): #{@server_name}"
|
91
|
+
puts "# PORT: #{@port}"
|
92
|
+
end
|
77
93
|
end
|
78
94
|
end
|
79
95
|
end
|
data/lib/ddig/version.rb
CHANGED
data/lib/ddig.rb
CHANGED
@@ -24,6 +24,9 @@ module Ddig
|
|
24
24
|
@do53_ipv6 = Ddig::Resolver::Do53.new(hostname: @hostname, nameservers: @nameserver.servers, ip: :ipv6).lookup unless @ip.ip_type == :ipv4
|
25
25
|
|
26
26
|
@ddr = Ddig::Ddr.new(nameservers: @nameservers, ip: @ip.ip_type)
|
27
|
+
@ddr.designated_resolvers.each do |designated_resolver|
|
28
|
+
designated_resolver.lookup(@hostname)
|
29
|
+
end
|
27
30
|
|
28
31
|
{
|
29
32
|
do53: {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taketo Takashima
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resolv
|
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: '0'
|
88
88
|
requirements: []
|
89
|
-
rubygems_version: 3.5.
|
89
|
+
rubygems_version: 3.5.9
|
90
90
|
signing_key:
|
91
91
|
specification_version: 4
|
92
92
|
summary: DNS lookup utility for Ruby
|