Completely fix EDNS0
This commit is contained in:
parent
ec2e732ad3
commit
acdab89120
3
TODO
3
TODO
|
@ -1,14 +1,13 @@
|
||||||
Todo:
|
Todo:
|
||||||
* DNSSEC validation
|
* DNSSEC validation
|
||||||
* NSEC(3) secure denial of existence
|
* NSEC(3) secure denial of existence
|
||||||
* Unknown RRs
|
|
||||||
* fix os.Erros usage, add DNSSEC related errors
|
* fix os.Erros usage, add DNSSEC related errors
|
||||||
* AXFR/IXFR support
|
* AXFR/IXFR support
|
||||||
* IDN?
|
* IDN?
|
||||||
|
* Unknown RRs?
|
||||||
* query-time, server in string ouput of dns.Msg
|
* query-time, server in string ouput of dns.Msg
|
||||||
|
|
||||||
Issues:
|
Issues:
|
||||||
* completely fix EDNS
|
|
||||||
* shortened ipv6 addresses are not parsed correctly
|
* shortened ipv6 addresses are not parsed correctly
|
||||||
* quoted quotes in txt records
|
* quoted quotes in txt records
|
||||||
* Convience functions?
|
* Convience functions?
|
||||||
|
|
|
@ -15,12 +15,13 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var dnssec *bool = flag.Bool("dnssec", false, "Set the DO (DNSSEC OK) bit and set the bufsize to 4096")
|
var dnssec *bool = flag.Bool("dnssec", false, "Set the DO (DNSSEC OK) bit and set the bufsize to 4096")
|
||||||
|
var port *string = flag.String("port", "53", "Set the query port")
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintf(os.Stderr, "Usage: %s [@server] [qtype] [qclass] [name ...]\n", os.Args[0])
|
fmt.Fprintf(os.Stderr, "Usage: %s [@server] [qtype] [qclass] [name ...]\n", os.Args[0])
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
nameserver := "127.0.0.1" // Default nameserver
|
nameserver := "@127.0.0.1" // Default nameserver
|
||||||
qtype := uint16(dns.TypeA) // Default qtype
|
qtype := uint16(dns.TypeA) // Default qtype
|
||||||
qclass := uint16(dns.ClassINET) // Default qclass
|
qclass := uint16(dns.ClassINET) // Default qclass
|
||||||
var qname []string
|
var qname []string
|
||||||
|
@ -53,12 +54,14 @@ FLAGS:
|
||||||
}
|
}
|
||||||
r := new(resolver.Resolver)
|
r := new(resolver.Resolver)
|
||||||
r.Timeout = 2
|
r.Timeout = 2
|
||||||
|
r.Port = *port
|
||||||
r.Attempts = 1
|
r.Attempts = 1
|
||||||
|
|
||||||
qr := resolver.NewQuerier(r)
|
qr := resolver.NewQuerier(r)
|
||||||
// @server may be a name, resolv that
|
// @server may be a name, resolv that
|
||||||
var err os.Error
|
var err os.Error
|
||||||
_, addr, err := net.LookupHost(string([]byte(nameserver)[1:])) //chop off @
|
nameserver = string([]byte(nameserver)[1:]) // chop off @
|
||||||
|
_, addr, err := net.LookupHost(nameserver)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
r.Servers = addr
|
r.Servers = addr
|
||||||
} else {
|
} else {
|
||||||
|
|
1
dns.go
1
dns.go
|
@ -8,6 +8,7 @@
|
||||||
// * 1982 - Serial Arithmetic
|
// * 1982 - Serial Arithmetic
|
||||||
// * 1034/1035
|
// * 1034/1035
|
||||||
// * 2671 - EDNS
|
// * 2671 - EDNS
|
||||||
|
// * 3225 - DO bit (DNSSEC OK)
|
||||||
// * 4033/4034/4035 - DNSSEC + validation functions
|
// * 4033/4034/4035 - DNSSEC + validation functions
|
||||||
// * 5011 - NSID
|
// * 5011 - NSID
|
||||||
// * IP6 support
|
// * IP6 support
|
||||||
|
|
34
edns.go
34
edns.go
|
@ -6,10 +6,10 @@ import (
|
||||||
|
|
||||||
// EDNS0 Options and Do bit
|
// EDNS0 Options and Do bit
|
||||||
const (
|
const (
|
||||||
OptionCodeLLQ = 1 // Not used
|
OptionCodeLLQ = 1 // Not used
|
||||||
OptionCodeUL = 2 // Not used
|
OptionCodeUL = 2 // Not used
|
||||||
OptionCodeNSID = 3 // NSID, RFC5001
|
OptionCodeNSID = 3 // NSID, RFC5001
|
||||||
_DO = 1 << 7 // dnssec ok
|
_DO = 1 << 7 // dnssec ok
|
||||||
)
|
)
|
||||||
|
|
||||||
// An ENDS0 option rdata element.
|
// An ENDS0 option rdata element.
|
||||||
|
@ -70,19 +70,29 @@ func (rr *RR_OPT) UDPSize(size uint16, set bool) uint16 {
|
||||||
return rr.Hdr.Class
|
return rr.Hdr.Class
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* from RFC 3225
|
||||||
|
+0 (MSB) +1 (LSB)
|
||||||
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||||
|
0: | EXTENDED-RCODE | VERSION |
|
||||||
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||||
|
2: |DO| Z |
|
||||||
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||||
|
*/
|
||||||
|
|
||||||
// Set/Get the DoBit
|
// Set/Get the DoBit
|
||||||
func (rr *RR_OPT) DoBit(do, set bool) bool {
|
func (rr *RR_OPT) DoBit(do, set bool) bool {
|
||||||
// rr.TTL last 2 bytes, left most bit
|
|
||||||
// See line 239 in msg.go for TTL encoding
|
|
||||||
if set {
|
if set {
|
||||||
leftbyte := byte(rr.Hdr.Ttl >> 24)
|
b1 := byte(rr.Hdr.Ttl >> 24)
|
||||||
leftbyte = leftbyte | _DO
|
b2 := byte(rr.Hdr.Ttl >> 16)
|
||||||
rr.Hdr.Ttl = uint32(leftbyte << 24)
|
b3 := byte(rr.Hdr.Ttl >> 8)
|
||||||
|
b4 := byte(rr.Hdr.Ttl)
|
||||||
|
b3 |= _DO // Set it
|
||||||
|
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
// jaja?? TODO(MG)
|
b3 := byte(rr.Hdr.Ttl >> 8)
|
||||||
leftbyte := byte(rr.Hdr.Ttl >> 24)
|
return b3&_DO == _DO
|
||||||
return leftbyte&_DO == 1
|
|
||||||
}
|
}
|
||||||
return true // dead code, bug in Go
|
return true // dead code, bug in Go
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue