added
This commit is contained in:
parent
7d73d6e9e1
commit
1b96a4413a
|
@ -3,6 +3,6 @@
|
|||
# license that can be found in the LICENSE file.
|
||||
include $(GOROOT)/src/Make.inc
|
||||
TARG=q
|
||||
GOFILES=q.go
|
||||
GOFILES=q.go fp.go
|
||||
DEPS=../../
|
||||
include $(GOROOT)/src/Make.cmd
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
// Package main provides ...
|
||||
package main
|
||||
|
||||
import (
|
||||
"dns"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// fingerPrint creates a (short) string representation of a dns message.
|
||||
// If a bit is set we uppercase the name 'AD' otherwise it's lowercase 'ad'.
|
||||
func msgToFingerPrint(m *dns.Msg) string {
|
||||
if m == nil {
|
||||
return "<nil>"
|
||||
}
|
||||
h := m.MsgHdr
|
||||
|
||||
// Use the same order as in Perl's fpdns.
|
||||
// But use more flags.
|
||||
s := dns.Opcode_str[h.Opcode]
|
||||
s += "," + dns.Rcode_str[h.Rcode]
|
||||
s += valueOf(h.Response, ",qr")
|
||||
s += valueOf(h.Authoritative, ",aa")
|
||||
s += valueOf(h.Truncated, ",tc")
|
||||
s += valueOf(h.RecursionDesired, ",rd")
|
||||
s += valueOf(h.AuthenticatedData, ",ad")
|
||||
s += valueOf(h.CheckingDisabled, ",ad")
|
||||
s += valueOf(h.Zero, ",z")
|
||||
|
||||
s += "," + strconv.Itoa(len(m.Question))
|
||||
s += "," + strconv.Itoa(len(m.Answer))
|
||||
s += "," + strconv.Itoa(len(m.Ns))
|
||||
s += "," + strconv.Itoa(len(m.Extra))
|
||||
|
||||
// EDNS0
|
||||
// V0,DO,4096 (all on)
|
||||
// v0,do,0 (all off)
|
||||
for _, r := range m.Extra {
|
||||
if r.Header().Rrtype == dns.TypeOPT {
|
||||
// version is always 0 - and I cannot set it anyway
|
||||
s += valueOf(r.(*dns.RR_OPT).Do(), ",do")
|
||||
s += "," + strconv.Itoa(int(r.(*dns.RR_OPT).UDPSize()))
|
||||
return s
|
||||
}
|
||||
}
|
||||
s += ",do,0"
|
||||
return s
|
||||
}
|
||||
|
||||
// Create a dns message from a fingerprint string
|
||||
func fingerPrintToProbe(fp string, q dns.Question) *dns.Msg {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func valueOf(x bool, w string) string {
|
||||
if x {
|
||||
return strings.ToUpper(w)
|
||||
}
|
||||
return strings.ToLower(w)
|
||||
}
|
|
@ -19,15 +19,16 @@ func q(w dns.RequestWriter, m *dns.Msg) {
|
|||
}
|
||||
|
||||
func main() {
|
||||
var dnssec *bool = flag.Bool("dnssec", false, "request DNSSEC records")
|
||||
var query *bool = flag.Bool("question", false, "show question")
|
||||
var short *bool = flag.Bool("short", false, "abbreviate long DNSKEY and RRSIG RRs")
|
||||
var aa *bool = flag.Bool("aa", false, "set AA flag in query")
|
||||
var ad *bool = flag.Bool("ad", false, "set AD flag in query")
|
||||
var cd *bool = flag.Bool("cd", false, "set CD flag in query")
|
||||
var rd *bool = flag.Bool("rd", true, "unset RD flag in query")
|
||||
var tcp *bool = flag.Bool("tcp", false, "TCP mode")
|
||||
var nsid *bool = flag.Bool("nsid", false, "ask for NSID")
|
||||
dnssec := flag.Bool("dnssec", false, "request DNSSEC records")
|
||||
query := flag.Bool("question", false, "show question")
|
||||
short := flag.Bool("short", false, "abbreviate long DNSKEY and RRSIG RRs")
|
||||
aa := flag.Bool("aa", false, "set AA flag in query")
|
||||
ad := flag.Bool("ad", false, "set AD flag in query")
|
||||
cd := flag.Bool("cd", false, "set CD flag in query")
|
||||
rd := flag.Bool("rd", true, "unset RD flag in query")
|
||||
tcp := flag.Bool("tcp", false, "TCP mode")
|
||||
nsid := flag.Bool("nsid", false, "ask for NSID")
|
||||
fp := flag.Bool("fingerprint", false, "enable server detection")
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintf(os.Stderr, "Usage: %s [@server(:port)] [qtype] [qclass] [name ...]\n", os.Args[0])
|
||||
flag.PrintDefaults()
|
||||
|
@ -89,8 +90,8 @@ Flags:
|
|||
if !strings.HasSuffix(nameserver, ":53") {
|
||||
nameserver += ":53"
|
||||
}
|
||||
// ipv6 todo
|
||||
|
||||
// ipv6 todo
|
||||
// We use the async query handling, just to show how
|
||||
// it is to be used.
|
||||
dns.HandleQueryFunc(".", q)
|
||||
|
@ -132,6 +133,9 @@ forever:
|
|||
if *short {
|
||||
r.Reply = shortMsg(r.Reply)
|
||||
}
|
||||
if *fp {
|
||||
fmt.Printf("%s\n", msgToFingerPrint(r.Reply))
|
||||
}
|
||||
fmt.Printf("%v", r.Reply)
|
||||
}
|
||||
i++
|
||||
|
|
Loading…
Reference in New Issue