ddig 0.4.2 → 0.5.0
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 +17 -5
- data/exe/ddig +1 -0
- data/lib/ddig/cli.rb +34 -12
- data/lib/ddig/ddr/designated_resolver.rb +15 -2
- data/lib/ddig/ddr/verify_cert.rb +2 -0
- data/lib/ddig/ddr.rb +2 -0
- data/lib/ddig/nameserver.rb +2 -0
- data/lib/ddig/resolver/dns_message.rb +2 -0
- data/lib/ddig/resolver/dns_resource_https.rb +41 -0
- data/lib/ddig/resolver/do53.rb +28 -1
- data/lib/ddig/resolver/doh_h1.rb +27 -2
- data/lib/ddig/resolver/dot.rb +26 -1
- data/lib/ddig/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 436345c126c2da37eec4a4b3e53ffa6fb951b8f843194b20f4c58d2fdded7932
|
|
4
|
+
data.tar.gz: '092f974b175b6086e4affec4b2df6a59231abcac1e7c78ea2c6a0894fa291d1d'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e68d13faf8b03d62f4da5b6995e8dff1ae21205569af2dfb8c3a4553f7c699ed3b6dd188c412d80785be57c5f75ffc7f0f1aba319492d464a52cdfcfa3f85570
|
|
7
|
+
data.tar.gz: 2e00a96f37828eabbd75ba22e18ab6f15b3ef0023d03b52b363fadc48922a96e3d16495bb059d8945b96e550756fa54b0a0ee7c5c49281a125720e39d0d400ef
|
data/README.md
CHANGED
|
@@ -34,9 +34,9 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
|
34
34
|
ddig = Ddig.lookup('dns.google', nameservers: ['8.8.8.8', '2001:4860:4860::8888'])
|
|
35
35
|
|
|
36
36
|
ddig[:do53][:ipv4]
|
|
37
|
-
=> #<Ddig::Resolver::Do53:0x00000001207aaeb0 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=:ipv4, @nameservers=["8.8.8.8"]>
|
|
37
|
+
=> #<Ddig::Resolver::Do53:0x00000001207aaeb0 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=:ipv4, @nameservers=["8.8.8.8"]>
|
|
38
38
|
ddig[:do53][:ipv6]
|
|
39
|
-
=> #<Ddig::Resolver::Do53:0x000000012073d2c0 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=:ipv4, @nameservers=["2001:4860:4860::8888"]>
|
|
39
|
+
=> #<Ddig::Resolver::Do53:0x000000012073d2c0 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=:ipv4, @nameservers=["2001:4860:4860::8888"]>
|
|
40
40
|
|
|
41
41
|
ddig[:ddr]
|
|
42
42
|
=> [#<Ddig::Ddr::DesignatedResolver:0x0000000120735480
|
|
@@ -90,7 +90,7 @@ ddig[:ddr]
|
|
|
90
90
|
- Do53
|
|
91
91
|
```ruby
|
|
92
92
|
do53 = Ddig::Resolver::Do53.new(hostname: 'dns.google', nameservers: '8.8.8.8').lookup
|
|
93
|
-
=> #<Ddig::Resolver::Do53:0x0000000121717b78 @a=["8.8.8.8", "8.8.4.4"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=nil, @nameserver=#<Ddig::Nameserver:0x00000001211fb108 @nameservers="8.8.8.8", @servers=["8.8.8.8"]>, @nameservers=["8.8.8.8"]>
|
|
93
|
+
=> #<Ddig::Resolver::Do53:0x0000000121717b78 @a=["8.8.8.8", "8.8.4.4"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=nil, @nameserver=#<Ddig::Nameserver:0x00000001211fb108 @nameservers="8.8.8.8", @servers=["8.8.8.8"]>, @nameservers=["8.8.8.8"]>
|
|
94
94
|
|
|
95
95
|
do53.a
|
|
96
96
|
=> ["8.8.4.4", "8.8.8.8"]
|
|
@@ -101,7 +101,7 @@ do53.aaaa
|
|
|
101
101
|
- DoT
|
|
102
102
|
```ruby
|
|
103
103
|
dot = Ddig::Resolver::Dot.new(hostname: 'dns.google', server: '8.8.8.8').lookup
|
|
104
|
-
=> #<Ddig::Resolver::Dot:0x000000012145da90 @a=["8.8.8.8", "8.8.4.4"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @open_timeout=3, @port=853, @server="8.8.8.8", @server_name=nil>
|
|
104
|
+
=> #<Ddig::Resolver::Dot:0x000000012145da90 @a=["8.8.8.8", "8.8.4.4"], @a_response_time=108, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=122, @hostname="dns.google", @open_timeout=3, @port=853, @server="8.8.8.8", @server_name=nil>
|
|
105
105
|
|
|
106
106
|
dot.a
|
|
107
107
|
=> ["8.8.4.4", "8.8.8.8"]
|
|
@@ -112,7 +112,7 @@ dot.aaaa
|
|
|
112
112
|
- DoH (HTTP/1.1)
|
|
113
113
|
```ruby
|
|
114
114
|
doh = Ddig::Resolver::DohH1.new(hostname: 'dns.google', server: 'dns.google', dohpath: '/dns-query{?dns}').lookup
|
|
115
|
-
=> #<Ddig::Resolver::DohH1:0x00000001023ed020 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8888", "2001:4860:4860::8844"], @address=nil, @dohpath="/dns-query{?dns}", @hostname="dns.google", @open_timeout=10, @port=443, @server="dns.google">
|
|
115
|
+
=> #<Ddig::Resolver::DohH1:0x00000001023ed020 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=62, @aaaa=["2001:4860:4860::8888", "2001:4860:4860::8844"], @aaaa_response_time=77, @address=nil, @dohpath="/dns-query{?dns}", @hostname="dns.google", @open_timeout=10, @port=443, @server="dns.google">
|
|
116
116
|
|
|
117
117
|
doh.a
|
|
118
118
|
=> ["8.8.4.4", "8.8.8.8"]
|
|
@@ -151,6 +151,8 @@ dns.google A 8.8.8.8
|
|
|
151
151
|
dns.google AAAA 2001:4860:4860::8844
|
|
152
152
|
dns.google AAAA 2001:4860:4860::8888
|
|
153
153
|
|
|
154
|
+
# Query time (A): 15 msec
|
|
155
|
+
# Query time (AAAA): 15 msec
|
|
154
156
|
# SERVER: 8.8.8.8
|
|
155
157
|
|
|
156
158
|
# DDR
|
|
@@ -160,6 +162,8 @@ dns.google A 8.8.8.8
|
|
|
160
162
|
dns.google AAAA 2001:4860:4860::8844
|
|
161
163
|
dns.google AAAA 2001:4860:4860::8888
|
|
162
164
|
|
|
165
|
+
# Query time (A): 114 msec
|
|
166
|
+
# Query time (AAAA): 187 msec
|
|
163
167
|
# SERVER(Address): 8.8.4.4
|
|
164
168
|
# PORT: 853
|
|
165
169
|
|
|
@@ -174,6 +178,8 @@ dns.google A 8.8.4.4
|
|
|
174
178
|
dns.google AAAA 2001:4860:4860::8844
|
|
175
179
|
dns.google AAAA 2001:4860:4860::8888
|
|
176
180
|
|
|
181
|
+
# Query time (A): 89 msec
|
|
182
|
+
# Query time (AAAA): 105 msec
|
|
177
183
|
# SERVER(Hostname): 2001:4860:4860::8888
|
|
178
184
|
# SERVER(Path): /dns-query{?dns}
|
|
179
185
|
# PORT: 443
|
|
@@ -188,6 +194,8 @@ dns.google A 8.8.4.4
|
|
|
188
194
|
dns.google AAAA 2001:4860:4860::8844
|
|
189
195
|
dns.google AAAA 2001:4860:4860::8888
|
|
190
196
|
|
|
197
|
+
# Query time (A): 20 msec
|
|
198
|
+
# Query time (AAAA): 16 msec
|
|
191
199
|
# SERVER: 8.8.8.8
|
|
192
200
|
```
|
|
193
201
|
|
|
@@ -199,6 +207,8 @@ dns.google A 8.8.4.4
|
|
|
199
207
|
dns.google AAAA 2001:4860:4860::8888
|
|
200
208
|
dns.google AAAA 2001:4860:4860::8844
|
|
201
209
|
|
|
210
|
+
# Query time (A): 90 msec
|
|
211
|
+
# Query time (AAAA): 167 msec
|
|
202
212
|
# SERVER(Address): 8.8.8.8
|
|
203
213
|
# PORT: 853
|
|
204
214
|
```
|
|
@@ -211,6 +221,8 @@ dns.google A 8.8.4.4
|
|
|
211
221
|
dns.google AAAA 2001:4860:4860::8888
|
|
212
222
|
dns.google AAAA 2001:4860:4860::8844
|
|
213
223
|
|
|
224
|
+
# Query time (A): 69 msec
|
|
225
|
+
# Query time (AAAA): 70 msec
|
|
214
226
|
# SERVER(Hostname): dns.google
|
|
215
227
|
# SERVER(Path): /dns-query{?dns}
|
|
216
228
|
# PORT: 443
|
data/exe/ddig
CHANGED
data/lib/ddig/cli.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "optparse"
|
|
2
4
|
|
|
3
5
|
require "ddig"
|
|
@@ -27,7 +29,7 @@ module Ddig
|
|
|
27
29
|
opts.on("--udp", "use resolve type of udp(do53)") { |v| @options[:dns_type] = 'do53' }
|
|
28
30
|
opts.on("--dot", "use resolve type of dot") { |v| @options[:dns_type] = 'dot' }
|
|
29
31
|
opts.on("--doh-h1", "use resolve type of doh (http/1.1)") { |v| @options[:dns_type] = 'doh_h1' }
|
|
30
|
-
opts.on("--doh-path=doh-path", "doh service path") { |v| @options[:doh_path] = v }
|
|
32
|
+
opts.on("--doh-path=doh-path", "doh service path (default: /dns-query{?dns})") { |v| @options[:doh_path] = v }
|
|
31
33
|
opts.on("--ddr", "discover designated resolvers via ddr (discovery of designated resolvers)") { |v| @options[:ddr] = v }
|
|
32
34
|
opts.on("-4", "--ipv4", "use IPv4 query transport only") { |v| @options[:ipv4] = v }
|
|
33
35
|
opts.on("-6", "--ipv6", "use IPv6 query transport only") { |v| @options[:ipv6] = v }
|
|
@@ -56,6 +58,15 @@ module Ddig
|
|
|
56
58
|
return false
|
|
57
59
|
end
|
|
58
60
|
|
|
61
|
+
if @options[:nameserver].nil?
|
|
62
|
+
if @options[:dns_type] == "dot" || @options[:dns_type] == "doh_h1"
|
|
63
|
+
puts "Error: nameserver is required with dns_type: #{@options[:dns_type]}"
|
|
64
|
+
puts
|
|
65
|
+
|
|
66
|
+
return false
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
59
70
|
return true
|
|
60
71
|
end
|
|
61
72
|
|
|
@@ -116,36 +127,47 @@ module Ddig
|
|
|
116
127
|
ip = Ddig::Ip.new(use_ipv4: @use_ipv4, use_ipv6: @use_ipv6)
|
|
117
128
|
do53 = Ddig::Resolver::Do53.new(hostname: @hostname, nameservers: @options[:nameserver], ip: ip.ip_type).lookup
|
|
118
129
|
|
|
119
|
-
if
|
|
120
|
-
puts
|
|
121
|
-
|
|
130
|
+
if @options[:format] == 'json'
|
|
131
|
+
puts do53.to_json
|
|
132
|
+
else
|
|
133
|
+
do53.to_cli
|
|
122
134
|
end
|
|
123
|
-
|
|
124
|
-
do53.to_cli
|
|
125
135
|
end
|
|
126
136
|
|
|
127
137
|
def resolve_dot
|
|
128
138
|
dot = Ddig::Resolver::Dot.new(hostname: @hostname, server: @options[:nameserver], port: @options[:port]).lookup
|
|
129
139
|
|
|
130
|
-
|
|
140
|
+
if @options[:format] == 'json'
|
|
141
|
+
puts dot.to_json
|
|
142
|
+
else
|
|
143
|
+
dot.to_cli
|
|
144
|
+
end
|
|
131
145
|
end
|
|
132
146
|
|
|
133
147
|
def resolve_doh_h1
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
148
|
+
# set default doh_path
|
|
149
|
+
if @options[:doh_path].nil?
|
|
150
|
+
@options[:doh_path] = '/dns-query{?dns}'
|
|
137
151
|
end
|
|
138
152
|
|
|
139
153
|
doh = Ddig::Resolver::DohH1.new(hostname: @hostname, server: @options[:nameserver], dohpath: @options[:doh_path], port: @options[:port]).lookup
|
|
140
154
|
|
|
141
|
-
|
|
155
|
+
if @options[:format] == 'json'
|
|
156
|
+
puts dot.to_json
|
|
157
|
+
else
|
|
158
|
+
doh.to_cli
|
|
159
|
+
end
|
|
142
160
|
end
|
|
143
161
|
|
|
144
162
|
def resolve_ddr
|
|
145
163
|
ip = Ddig::Ip.new(use_ipv4: @use_ipv4, use_ipv6: @use_ipv6)
|
|
146
164
|
ddr = Ddig::Ddr.new(nameservers: @options[:nameserver], ip: ip.ip_type)
|
|
147
165
|
|
|
148
|
-
|
|
166
|
+
if @options[:format] == 'json'
|
|
167
|
+
puts ddr.to_json
|
|
168
|
+
else
|
|
169
|
+
ddr.to_cli
|
|
170
|
+
end
|
|
149
171
|
end
|
|
150
172
|
end
|
|
151
173
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'json'
|
|
2
4
|
|
|
3
5
|
module Ddig
|
|
@@ -8,6 +10,13 @@ module Ddig
|
|
|
8
10
|
attr_reader :hostname, :a, :aaaa, :resolver, :errors
|
|
9
11
|
|
|
10
12
|
PROTOCOLS = ['http/1.1', 'h2', 'h3', 'dot', 'doq']
|
|
13
|
+
# Reserved ALPN
|
|
14
|
+
# https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids
|
|
15
|
+
IGNORE_PROTOCOLS = [
|
|
16
|
+
"\u001A\u001A", "\u002A\u002A", "\u003A\u003A", "\u004A\u004A", "\u005A\u005A",
|
|
17
|
+
"\u006A\u006A", "\u007A\u007A", "\u008A\u008A", "\u009A\u009A", "\u00AA\u00AA",
|
|
18
|
+
"\u00BA\u00BA", "\u00CA\u00CA", "\u00DA\u00DA", "\u00EA\u00EA", "\u00FA\u00FA"
|
|
19
|
+
] # '**', '::', 'JJ', 'ZZ', 'jj', 'zz'
|
|
11
20
|
|
|
12
21
|
def initialize(unencrypted_resolver:, target:, protocol: nil, port: nil, dohpath: nil, address: nil, ip: nil)
|
|
13
22
|
@target = target
|
|
@@ -21,8 +30,12 @@ module Ddig
|
|
|
21
30
|
|
|
22
31
|
# check protocol
|
|
23
32
|
unless PROTOCOLS.include?(@protocol)
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
if IGNORE_PROTOCOLS.include?(@protocol)
|
|
34
|
+
@errors << "Skip the protocol (protocol: #{@protocol}), as it is a reserved value in ALPN."
|
|
35
|
+
else
|
|
36
|
+
@errors << "Not Supportted Protocol (protocol: #{@protocol}). Suported protocol is #{PROTOCOLS.join(' / ')}"
|
|
37
|
+
puts "#{@errors.join('\n')}"
|
|
38
|
+
end
|
|
26
39
|
end
|
|
27
40
|
|
|
28
41
|
if @port.nil?
|
data/lib/ddig/ddr/verify_cert.rb
CHANGED
data/lib/ddig/ddr.rb
CHANGED
data/lib/ddig/nameserver.rb
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'resolv'
|
|
2
|
+
|
|
3
|
+
module Ddig
|
|
4
|
+
module Resolver
|
|
5
|
+
class DnsResourceHttps
|
|
6
|
+
attr_reader :priority, :target, :alpn, :port, :ipv4hint, :ipv6hint
|
|
7
|
+
|
|
8
|
+
def self.build(resources)
|
|
9
|
+
resources
|
|
10
|
+
.select { |resource| resource.is_a?(Resolv::DNS::Resource::IN::HTTPS) }
|
|
11
|
+
.map { |resource| new(resource) }
|
|
12
|
+
.sort_by { |https| https.priority }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def initialize(resource)
|
|
16
|
+
@priority = resource.priority
|
|
17
|
+
@target = resource.target != Resolv::DNS::Name.create(".") ? resource.target.to_s : "."
|
|
18
|
+
|
|
19
|
+
@alpn = resource.params[:alpn]&.protocol_ids
|
|
20
|
+
@port = resource.params[:port]&.port
|
|
21
|
+
@ipv4hint = resource.params[:ipv4hint]&.addresses&.map(&:to_s)
|
|
22
|
+
@ipv6hint = resource.params[:ipv6hint]&.addresses&.map(&:to_s)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def as_json(*)
|
|
26
|
+
{
|
|
27
|
+
priority: @priority,
|
|
28
|
+
target: @target,
|
|
29
|
+
alpn: @alpn,
|
|
30
|
+
port: @port,
|
|
31
|
+
ipv4hint: @ipv4hint,
|
|
32
|
+
ipv6hint: @ipv6hint,
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_json(*args)
|
|
37
|
+
as_json.to_json
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/ddig/resolver/do53.rb
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'resolv'
|
|
2
4
|
require 'json'
|
|
3
5
|
|
|
6
|
+
require_relative 'dns_resource_https'
|
|
7
|
+
|
|
4
8
|
module Ddig
|
|
5
9
|
module Resolver
|
|
6
10
|
# DNS Resolver of UDP/53
|
|
7
11
|
class Do53
|
|
8
12
|
attr_reader :hostname, :nameservers, :ip
|
|
9
|
-
attr_reader :a, :aaaa
|
|
13
|
+
attr_reader :a, :aaaa, :https
|
|
14
|
+
attr_reader :a_response_time, :aaaa_response_time
|
|
10
15
|
|
|
11
16
|
def initialize(hostname:, nameservers: nil, ip: nil)
|
|
12
17
|
@hostname = hostname
|
|
@@ -21,15 +26,24 @@ module Ddig
|
|
|
21
26
|
return nil
|
|
22
27
|
end
|
|
23
28
|
|
|
29
|
+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
24
30
|
@a = Resolv::DNS.open(nameserver: @nameservers) do |dns|
|
|
25
31
|
ress = dns.getresources(@hostname, Resolv::DNS::Resource::IN::A)
|
|
26
32
|
ress.map { |resource| resource.address.to_s }
|
|
27
33
|
end
|
|
34
|
+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
|
|
28
35
|
|
|
36
|
+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
29
37
|
@aaaa = Resolv::DNS.open(nameserver: @nameservers) do |dns|
|
|
30
38
|
ress = dns.getresources(@hostname, Resolv::DNS::Resource::IN::AAAA)
|
|
31
39
|
ress.map { |resource| resource.address.to_s }
|
|
32
40
|
end
|
|
41
|
+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
|
|
42
|
+
|
|
43
|
+
@https = Resolv::DNS.open(nameserver: @nameservers) do |dns|
|
|
44
|
+
ress = dns.getresources(@hostname, Resolv::DNS::Resource::IN::HTTPS)
|
|
45
|
+
DnsResourceHttps.build(ress)
|
|
46
|
+
end
|
|
33
47
|
|
|
34
48
|
self
|
|
35
49
|
end
|
|
@@ -38,9 +52,12 @@ module Ddig
|
|
|
38
52
|
{
|
|
39
53
|
a: @a,
|
|
40
54
|
aaaa: @aaaa,
|
|
55
|
+
https: @https.map { |dns_resource_https| dns_resource_https.as_json },
|
|
41
56
|
hostname: @hostname,
|
|
42
57
|
nameservers: @nameservers,
|
|
43
58
|
ip: @ip,
|
|
59
|
+
a_response_time: @a_response_time,
|
|
60
|
+
aaaa_response_time: @aaaa_response_time,
|
|
44
61
|
}
|
|
45
62
|
end
|
|
46
63
|
|
|
@@ -57,8 +74,18 @@ module Ddig
|
|
|
57
74
|
rr_type = 'AAAA'
|
|
58
75
|
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
|
59
76
|
end
|
|
77
|
+
@https.each do |record|
|
|
78
|
+
rr_type = 'HTTPS'
|
|
79
|
+
puts "#{@hostname}\t#{rr_type}\tpriority: #{record.priority}\ttarget: #{record.target}\talpn: #{record.alpn.join(', ')}"
|
|
80
|
+
end
|
|
60
81
|
|
|
61
82
|
puts
|
|
83
|
+
unless @a_response_time.nil?
|
|
84
|
+
puts "# Query time (A): #{@a_response_time} msec"
|
|
85
|
+
end
|
|
86
|
+
unless @aaaa_response_time.nil?
|
|
87
|
+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
|
|
88
|
+
end
|
|
62
89
|
puts "# SERVER: #{@nameservers.join(', ')}"
|
|
63
90
|
end
|
|
64
91
|
|
data/lib/ddig/resolver/doh_h1.rb
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'net/http'
|
|
2
4
|
require 'resolv'
|
|
3
5
|
require 'base64'
|
|
4
6
|
require 'json'
|
|
5
7
|
|
|
6
8
|
require_relative 'dns_message'
|
|
9
|
+
require_relative 'dns_resource_https'
|
|
7
10
|
|
|
8
11
|
module Ddig
|
|
9
12
|
module Resolver
|
|
10
13
|
# DNS over HTTPS (HTTP/1.1)
|
|
11
14
|
class DohH1
|
|
12
15
|
attr_reader :hostname, :server, :address, :dohpath, :port
|
|
13
|
-
attr_reader :a, :aaaa
|
|
16
|
+
attr_reader :a, :aaaa, :https
|
|
17
|
+
attr_reader :a_response_time, :aaaa_response_time
|
|
14
18
|
|
|
15
|
-
def initialize(hostname:, server:, address: nil, dohpath
|
|
19
|
+
def initialize(hostname:, server:, address: nil, dohpath: '/dns-query{?dns}', port: 443)
|
|
16
20
|
@hostname = hostname
|
|
17
21
|
@server = server
|
|
18
22
|
@address = address
|
|
@@ -27,9 +31,17 @@ module Ddig
|
|
|
27
31
|
return nil
|
|
28
32
|
end
|
|
29
33
|
|
|
34
|
+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
30
35
|
@a = get_resources(@hostname, Resolv::DNS::Resource::IN::A).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::A) }.compact
|
|
36
|
+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
|
|
31
37
|
|
|
38
|
+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
32
39
|
@aaaa = get_resources(@hostname, Resolv::DNS::Resource::IN::AAAA).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::AAAA) }.compact
|
|
40
|
+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
|
|
41
|
+
|
|
42
|
+
@https = DnsResourceHttps.build(
|
|
43
|
+
get_resources(@hostname, Resolv::DNS::Resource::IN::HTTPS)
|
|
44
|
+
)
|
|
33
45
|
|
|
34
46
|
self
|
|
35
47
|
end
|
|
@@ -62,11 +74,14 @@ module Ddig
|
|
|
62
74
|
{
|
|
63
75
|
a: @a,
|
|
64
76
|
aaaa: @aaaa,
|
|
77
|
+
https: @https.map { |dns_resource_https| dns_resource_https.as_json },
|
|
65
78
|
hostname: @hostname,
|
|
66
79
|
server: @server,
|
|
67
80
|
address: @address,
|
|
68
81
|
dohpath: @dohpath,
|
|
69
82
|
port: @port,
|
|
83
|
+
a_response_time: @a_response_time,
|
|
84
|
+
aaaa_response_time: @aaaa_response_time,
|
|
70
85
|
}
|
|
71
86
|
end
|
|
72
87
|
|
|
@@ -83,8 +98,18 @@ module Ddig
|
|
|
83
98
|
rr_type = 'AAAA'
|
|
84
99
|
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
|
85
100
|
end
|
|
101
|
+
@https.each do |record|
|
|
102
|
+
rr_type = 'HTTPS'
|
|
103
|
+
puts "#{@hostname}\t#{rr_type}\tpriority: #{record.priority}\ttarget: #{record.target}\talpn: #{record.alpn.join(', ')}"
|
|
104
|
+
end
|
|
86
105
|
|
|
87
106
|
puts
|
|
107
|
+
unless @a_response_time.nil?
|
|
108
|
+
puts "# Query time (A): #{@a_response_time} msec"
|
|
109
|
+
end
|
|
110
|
+
unless @aaaa_response_time.nil?
|
|
111
|
+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
|
|
112
|
+
end
|
|
88
113
|
puts "# SERVER(Hostname): #{@server}"
|
|
89
114
|
puts "# SERVER(Path): #{@dohpath}"
|
|
90
115
|
puts "# PORT: #{@port}"
|
data/lib/ddig/resolver/dot.rb
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'openssl'
|
|
2
4
|
require 'resolv'
|
|
3
5
|
require 'json'
|
|
4
6
|
|
|
5
7
|
require_relative 'dns_message'
|
|
8
|
+
require_relative 'dns_resource_https'
|
|
6
9
|
|
|
7
10
|
module Ddig
|
|
8
11
|
module Resolver
|
|
9
12
|
# DNS over TLS/TCP
|
|
10
13
|
class Dot
|
|
11
14
|
attr_reader :hostname, :server, :server_name, :port
|
|
12
|
-
attr_reader :a, :aaaa
|
|
15
|
+
attr_reader :a, :aaaa, :https
|
|
16
|
+
attr_reader :a_response_time, :aaaa_response_time
|
|
13
17
|
|
|
14
18
|
def initialize(hostname:, server:, server_name: nil, port: 853)
|
|
15
19
|
@hostname = hostname
|
|
@@ -25,9 +29,17 @@ module Ddig
|
|
|
25
29
|
return nil
|
|
26
30
|
end
|
|
27
31
|
|
|
32
|
+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
28
33
|
@a = get_resources(@hostname, Resolv::DNS::Resource::IN::A).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::A) }.compact
|
|
34
|
+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
|
|
29
35
|
|
|
36
|
+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
30
37
|
@aaaa = get_resources(@hostname, Resolv::DNS::Resource::IN::AAAA).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::AAAA) }.compact
|
|
38
|
+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
|
|
39
|
+
|
|
40
|
+
@https = DnsResourceHttps.build(
|
|
41
|
+
get_resources(@hostname, Resolv::DNS::Resource::IN::HTTPS)
|
|
42
|
+
)
|
|
31
43
|
|
|
32
44
|
self
|
|
33
45
|
end
|
|
@@ -80,10 +92,13 @@ module Ddig
|
|
|
80
92
|
{
|
|
81
93
|
a: @a,
|
|
82
94
|
aaaa: @aaaa,
|
|
95
|
+
https: @https.map { |dns_resource_https| dns_resource_https.as_json },
|
|
83
96
|
hostname: @hostname,
|
|
84
97
|
server: @server,
|
|
85
98
|
server_name: @server_name,
|
|
86
99
|
port: @port,
|
|
100
|
+
a_response_time: @a_response_time,
|
|
101
|
+
aaaa_response_time: @aaaa_response_time,
|
|
87
102
|
}
|
|
88
103
|
end
|
|
89
104
|
|
|
@@ -100,8 +115,18 @@ module Ddig
|
|
|
100
115
|
rr_type = 'AAAA'
|
|
101
116
|
puts "#{@hostname}\t#{rr_type}\t#{address}"
|
|
102
117
|
end
|
|
118
|
+
@https.each do |record|
|
|
119
|
+
rr_type = 'HTTPS'
|
|
120
|
+
puts "#{@hostname}\t#{rr_type}\tpriority: #{record.priority}\ttarget: #{record.target}\talpn: #{record.alpn.join(', ')}"
|
|
121
|
+
end
|
|
103
122
|
|
|
104
123
|
puts
|
|
124
|
+
unless @a_response_time.nil?
|
|
125
|
+
puts "# Query time (A): #{@a_response_time} msec"
|
|
126
|
+
end
|
|
127
|
+
unless @aaaa_response_time.nil?
|
|
128
|
+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
|
|
129
|
+
end
|
|
105
130
|
puts "# SERVER(Address): #{@server}"
|
|
106
131
|
#puts "# SERVER(Hostname): #{@server_name}"
|
|
107
132
|
puts "# PORT: #{@port}"
|
data/lib/ddig/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ddig
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Taketo Takashima
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: resolv
|
|
@@ -58,6 +58,7 @@ files:
|
|
|
58
58
|
- lib/ddig/ip.rb
|
|
59
59
|
- lib/ddig/nameserver.rb
|
|
60
60
|
- lib/ddig/resolver/dns_message.rb
|
|
61
|
+
- lib/ddig/resolver/dns_resource_https.rb
|
|
61
62
|
- lib/ddig/resolver/do53.rb
|
|
62
63
|
- lib/ddig/resolver/doh_h1.rb
|
|
63
64
|
- lib/ddig/resolver/dot.rb
|
|
@@ -70,6 +71,7 @@ metadata:
|
|
|
70
71
|
homepage_uri: https://github.com/taketo1113/ddig
|
|
71
72
|
source_code_uri: https://github.com/taketo1113/ddig
|
|
72
73
|
changelog_uri: https://github.com/taketo1113/ddig/releases
|
|
74
|
+
rubygems_mfa_required: 'true'
|
|
73
75
|
rdoc_options: []
|
|
74
76
|
require_paths:
|
|
75
77
|
- lib
|
|
@@ -84,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
84
86
|
- !ruby/object:Gem::Version
|
|
85
87
|
version: '0'
|
|
86
88
|
requirements: []
|
|
87
|
-
rubygems_version: 3.6.
|
|
89
|
+
rubygems_version: 3.6.9
|
|
88
90
|
specification_version: 4
|
|
89
91
|
summary: DNS lookup utility for Ruby
|
|
90
92
|
test_files: []
|