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 // 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) *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.
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.
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, write a log of events.