Skip to content

Commit

Permalink
[dns] Allow to specify query Class
Browse files Browse the repository at this point in the history
Signed-off-by: Baptiste Courtois <[email protected]>
  • Loading branch information
Annih committed Jun 8, 2020
1 parent 261b0eb commit 6b88618
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 4 deletions.
1 change: 1 addition & 0 deletions CONFIGURATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ tls_config:
query_name: <string>

[ query_type: <string> | default = "ANY" ]
[ query_class: <string> | default = "IN" ]

# List of valid response codes.
valid_rcodes:
Expand Down
1 change: 1 addition & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ type DNSProbe struct {
IPProtocolFallback bool `yaml:"ip_protocol_fallback,omitempty"`
SourceIPAddress string `yaml:"source_ip_address,omitempty"`
TransportProtocol string `yaml:"transport_protocol,omitempty"`
QueryClass string `yaml:"query_class,omitempty"` // Defaults to IN.
QueryName string `yaml:"query_name,omitempty"`
QueryType string `yaml:"query_type,omitempty"` // Defaults to ANY.
ValidRcodes []string `yaml:"valid_rcodes,omitempty"` // Defaults to NOERROR.
Expand Down
17 changes: 15 additions & 2 deletions prober/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,16 @@ func ProbeDNS(ctx context.Context, target string, module config.Module, registry
registry.MustRegister(probeDNSAuthorityRRSGauge)
registry.MustRegister(probeDNSAdditionalRRSGauge)

qc := uint16(dns.ClassINET)
if module.DNS.QueryClass != "" {
var ok bool
qc, ok = dns.StringToClass[module.DNS.QueryClass]
if !ok {
level.Error(logger).Log("msg", "Invalid query class", "Class seen", module.DNS.QueryClass, "Existing classes", dns.ClassToString)
return false
}
}

qt := dns.TypeANY
if module.DNS.QueryType != "" {
var ok bool
Expand Down Expand Up @@ -200,9 +210,12 @@ func ProbeDNS(ctx context.Context, target string, module config.Module, registry
}

msg := new(dns.Msg)
msg.SetQuestion(dns.Fqdn(module.DNS.QueryName), qt)
msg.Id = dns.Id()
msg.RecursionDesired = true
msg.Question = make([]dns.Question, 1)
msg.Question[0] = dns.Question{dns.Fqdn(module.DNS.QueryName), qt, qc}

level.Info(logger).Log("msg", "Making DNS query", "target", target, "dial_protocol", dialProtocol, "query", module.DNS.QueryName, "type", qt)
level.Info(logger).Log("msg", "Making DNS query", "target", target, "dial_protocol", dialProtocol, "query", module.DNS.QueryName, "type", qt, "class", qc)
timeoutDeadline, _ := ctx.Deadline()
client.Timeout = time.Until(timeoutDeadline)
response, _, err := client.Exchange(msg, target)
Expand Down
23 changes: 21 additions & 2 deletions prober/dns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,12 @@ func authoritativeDNSHandler(w dns.ResponseWriter, r *dns.Msg) {
panic(err)
}
m.Answer = append(m.Answer, a)

} else if r.Question[0].Qclass == dns.ClassCHAOS && r.Question[0].Qtype == dns.TypeTXT {
txt, err := dns.NewRR("example.com. 3600 CH TXT \"goCHAOS\"")
if err != nil {
panic(err)
}
m.Answer = append(m.Answer, txt)
} else {
a, err := dns.NewRR("example.com. 3600 IN A 127.0.0.1")
if err != nil {
Expand Down Expand Up @@ -243,7 +248,21 @@ func TestAuthoritativeDNSResponse(t *testing.T) {
QueryName: "example.com",
QueryType: "SOA",
}, true,
}, {
},
{
config.DNSProbe{
IPProtocol: "ip4",
IPProtocolFallback: true,
QueryClass: "CH",
QueryName: "example.com",
QueryType: "TXT",
ValidateAnswer: config.DNSRRValidator{
FailIfMatchesRegexp: []string{".*IN.*"},
FailIfNotMatchesRegexp: []string{".*CH.*"},
},
}, true,
},
{
config.DNSProbe{
IPProtocol: "ip4",
IPProtocolFallback: true,
Expand Down

0 comments on commit 6b88618

Please sign in to comment.