Documentation ¶
Index ¶
- Constants
- Variables
- func AddrFromRR(rr dns.RR) netip.Addr
- func DnsTypeToString(qtype uint16) string
- func MinTTL(msg *dns.Msg) int
- type Cache
- func (cache *Cache) Clean()
- func (cache *Cache) Clear()
- func (cache *Cache) DnsGet(nsaddr netip.Addr, qname string, qtype uint16) (srv netip.Addr, msg *dns.Msg)
- func (cache *Cache) DnsResolve(ctx context.Context, qname string, qtype uint16) (msg *dns.Msg, srv netip.Addr, err error)
- func (cache *Cache) DnsSet(nsaddr netip.Addr, msg *dns.Msg)
- func (cache *Cache) Entries() (n int)
- func (cache *Cache) HitRatio() float64
- type Cacher
- type CachingResolver
- type Recursive
- func (r *Recursive) DnsResolve(ctx context.Context, qname string, qtype uint16) (msg *dns.Msg, srv netip.Addr, err error)
- func (r *Recursive) GetRoots() (root4, root6 []netip.Addr)
- func (std *Recursive) LookupHost(ctx context.Context, host string) (addrs []string, err error)
- func (std *Recursive) LookupIP(ctx context.Context, network, host string) (ips []net.IP, err error)
- func (std *Recursive) LookupIPAddr(ctx context.Context, host string) (addrs []net.IPAddr, err error)
- func (std *Recursive) LookupNS(ctx context.Context, name string) (nslist []*net.NS, err error)
- func (std *Recursive) LookupNetIP(ctx context.Context, network, host string) (addrs []netip.Addr, err error)
- func (r *Recursive) OrderRoots(ctx context.Context)
- func (r *Recursive) ResetCookies()
- func (r *Recursive) ResolveWithOptions(ctx context.Context, cache Cacher, logw io.Writer, qname string, qtype uint16) (*dns.Msg, netip.Addr, error)
- type Resolver
Constants ¶
const DefaultMaxTTL = 3600
const DefaultMinTTL = 10
const MaxQtype = 260
Variables ¶
var ( // ErrMaxDepth is returned when recursive resolving exceeds the allowed limit. ErrMaxDepth = fmt.Errorf("recursion depth exceeded %d", maxDepth) // ErrNoResponse is returned when no authoritative server could be successfully queried. // It is equivalent to SERVFAIL. ErrNoResponse = errors.New("no authoritative response") DefaultCache = NewCache() )
var ErrInvalidCookie = errors.New("invalid cookie")
var Roots4 = []netip.Addr{ netip.AddrFrom4([4]byte([]byte{0xaa, 0xf7, 0xaa, 0x2})), netip.AddrFrom4([4]byte([]byte{0xc0, 0x5, 0x5, 0xf1})), netip.AddrFrom4([4]byte([]byte{0xc0, 0x21, 0x4, 0xc})), netip.AddrFrom4([4]byte([]byte{0xc0, 0x24, 0x94, 0x11})), netip.AddrFrom4([4]byte([]byte{0xc0, 0x3a, 0x80, 0x1e})), netip.AddrFrom4([4]byte([]byte{0xc0, 0x70, 0x24, 0x4})), netip.AddrFrom4([4]byte([]byte{0xc0, 0xcb, 0xe6, 0xa})), netip.AddrFrom4([4]byte([]byte{0xc1, 0x0, 0xe, 0x81})), netip.AddrFrom4([4]byte([]byte{0xc6, 0x29, 0x0, 0x4})), netip.AddrFrom4([4]byte([]byte{0xc6, 0x61, 0xbe, 0x35})), netip.AddrFrom4([4]byte([]byte{0xc7, 0x7, 0x53, 0x2a})), netip.AddrFrom4([4]byte([]byte{0xc7, 0x7, 0x5b, 0xd})), netip.AddrFrom4([4]byte([]byte{0xca, 0xc, 0x1b, 0x21})), }
var Roots6 = []netip.Addr{ netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xd})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x3, 0xc, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x30})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x5, 0x3, 0xba, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x30})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53})), netip.AddrFrom16([16]byte([]byte{0x20, 0x1, 0xd, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35})), netip.AddrFrom16([16]byte([]byte{0x28, 0x1, 0x1, 0xb8, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb})), }
Functions ¶
func DnsTypeToString ¶
Types ¶
type Cache ¶ added in v0.1.2
type Cache struct { MinTTL int // always cache responses for at least this long MaxTTL int // never cache responses for longer than this (excepting successful NS responses) // contains filtered or unexported fields }
func (*Cache) DnsResolve ¶ added in v0.2.0
type Cacher ¶ added in v0.1.4
type Cacher interface { // DnsSet may store a copy of msg with dns.Msg.Zero set to true and return it later with DnsGet. // If nsaddr is invalid, the entry may be returned for any later query matching just the // query name and type (a wildcard entry). DnsSet(nsaddr netip.Addr, msg *dns.Msg) // DnsGet returns the cached dns.Msg for the given qname and qtype that was returned from the // server at nsaddr. If that is not in the cache, a wildcard entry with an invalid address // may be returned if it exists. If no matching responses are available, nil is returned. // // dns.Msg.Zero must be set to true to indicate response is served from cache. DnsGet(nsaddr netip.Addr, qname string, qtype uint16) (netip.Addr, *dns.Msg) }
type CachingResolver ¶ added in v0.2.0
type Recursive ¶ added in v0.1.6
type Recursive struct { proxy.ContextDialer // (read-only) ContextDialer passed to NewWithOptions Cacher // (read-only) Cacher passed to NewWithOptions *net.Resolver // (read-only) net.Resolver using our ContextDialer DefaultLogWriter io.Writer // if not nil, write debug logs here unless overridden // contains filtered or unexported fields }
func New ¶
func New(dialer proxy.ContextDialer) *Recursive
New returns a new Recursive resolver using the given ContextDialer and has DefaultCache as it's cache.
It calls OrderRoots with a five second timeout before returning.
func NewWithOptions ¶
func NewWithOptions(dialer proxy.ContextDialer, cache Cacher, roots4, roots6 []netip.Addr, rateLimiter <-chan struct{}) *Recursive
NewWithOptions returns a new Recursive resolver using the given ContextDialer and using the given Cacher as it's default cache. It does not call OrderRoots.
Passing nil for dialer will use a net.Dialer. Passing nil for cache means it won't use any cache by default. Passing nil for the roots will use the default set of roots. Passing nil for the rateLimiter means no rate limiting
func (*Recursive) DnsResolve ¶ added in v0.2.0
func (r *Recursive) DnsResolve(ctx context.Context, qname string, qtype uint16) (msg *dns.Msg, srv netip.Addr, err error)
Resolve will perform a recursive DNS resolution for the provided name and record type.
func (*Recursive) LookupHost ¶ added in v0.9.0
func (*Recursive) LookupIPAddr ¶ added in v0.9.0
func (*Recursive) LookupNetIP ¶ added in v0.9.0
func (*Recursive) OrderRoots ¶ added in v0.2.0
OrderRoots sorts the root server list by their current latency and removes those that don't respond.
If ctx does not have a deadline, a deadline of five seconds will be used.
func (*Recursive) ResetCookies ¶ added in v0.5.0
func (r *Recursive) ResetCookies()
ResetCookies generates a new DNS client cookie and clears the known DNS server cookies.
func (*Recursive) ResolveWithOptions ¶ added in v0.1.6
func (r *Recursive) ResolveWithOptions(ctx context.Context, cache Cacher, logw io.Writer, qname string, qtype uint16) (*dns.Msg, netip.Addr, error)
ResolveWithOptions will perform a recursive DNS resolution for the provided name and record type, and if logw is non-nil (or DefaultLogWriter is set), write a log of events.