* core: allow all CIDR ranges in zone specifications Allow (e.g.) a v4 reverse on a /17. If a zone is specified in such a way a FilterFunc is set in the config. This filter is checked against incoming queries. For all other queries this adds a 'x != nil' check which will not impact performace too much. Benchmark function is added as well to check for this as wel. Add multiple tests in tests/server_reverse_test.go. Benchmark shows in the non-reverse case this hardly impact the speed: ~~~ classless: pkg: github.com/coredns/coredns/core/dnsserver BenchmarkCoreServeDNS-4 1000000 1431 ns/op 16 B/op 1 allocs/op pkg: github.com/coredns/coredns/core/dnsserver BenchmarkCoreServeDNS-4 1000000 1429 ns/op 16 B/op 1 allocs/op master: pkg: github.com/coredns/coredns/core/dnsserver BenchmarkCoreServeDNS-4 1000000 1412 ns/op 16 B/op 1 allocs/op pkg: github.com/coredns/coredns/core/dnsserver BenchmarkCoreServeDNS-4 1000000 1429 ns/op 16 B/op 1 allocs/op ~~~ * README.md updates
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package dnsserver
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/coredns/coredns/plugin"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
type zoneAddr struct {
|
|
Zone string
|
|
Port string
|
|
Transport string // dns, tls or grpc
|
|
IPNet *net.IPNet // if reverse zone this hold the IPNet
|
|
}
|
|
|
|
// String return the string representation of z.
|
|
func (z zoneAddr) String() string { return z.Transport + "://" + z.Zone + ":" + z.Port }
|
|
|
|
// Transport returns the protocol of the string s
|
|
func Transport(s string) string {
|
|
switch {
|
|
case strings.HasPrefix(s, TransportTLS+"://"):
|
|
return TransportTLS
|
|
case strings.HasPrefix(s, TransportDNS+"://"):
|
|
return TransportDNS
|
|
case strings.HasPrefix(s, TransportGRPC+"://"):
|
|
return TransportGRPC
|
|
}
|
|
return TransportDNS
|
|
}
|
|
|
|
// normalizeZone parses an zone string into a structured format with separate
|
|
// host, and port portions, as well as the original input string.
|
|
func normalizeZone(str string) (zoneAddr, error) {
|
|
var err error
|
|
|
|
// Default to DNS if there isn't a transport protocol prefix.
|
|
trans := TransportDNS
|
|
|
|
switch {
|
|
case strings.HasPrefix(str, TransportTLS+"://"):
|
|
trans = TransportTLS
|
|
str = str[len(TransportTLS+"://"):]
|
|
case strings.HasPrefix(str, TransportDNS+"://"):
|
|
trans = TransportDNS
|
|
str = str[len(TransportDNS+"://"):]
|
|
case strings.HasPrefix(str, TransportGRPC+"://"):
|
|
trans = TransportGRPC
|
|
str = str[len(TransportGRPC+"://"):]
|
|
}
|
|
|
|
host, port, ipnet, err := plugin.SplitHostPort(str)
|
|
if err != nil {
|
|
return zoneAddr{}, err
|
|
}
|
|
|
|
if port == "" {
|
|
if trans == TransportDNS {
|
|
port = Port
|
|
}
|
|
if trans == TransportTLS {
|
|
port = TLSPort
|
|
}
|
|
if trans == TransportGRPC {
|
|
port = GRPCPort
|
|
}
|
|
}
|
|
|
|
return zoneAddr{Zone: dns.Fqdn(host), Port: port, Transport: trans, IPNet: ipnet}, nil
|
|
}
|
|
|
|
// Supported transports.
|
|
const (
|
|
TransportDNS = "dns"
|
|
TransportTLS = "tls"
|
|
TransportGRPC = "grpc"
|
|
)
|