Documentation
¶
Overview ¶
Copyright (c) 2022 RethinkDNS and its authors.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
Index ¶
- Constants
- Variables
- func CanUseProxy(id string) bool
- func Categorize(ts []Transport) (best []Transport, preferred []Transport, recoverables []Transport, ...)
- func ChooseHealthyProxy(who string, ipps []netip.AddrPort, pids []string, px ipn.ProxyProvider) (pid string)
- func ChooseHealthyProxyHostPort(who string, host string, port uint16, pids []string, px ipn.ProxyProvider) (pid string)
- func Csv2Netip(csv string) (ips []netip.Addr)
- func Fastest(a, b Transport) int
- func IsAutoProxy(pid string) bool
- func IsEncrypted(t Transport) bool
- func IsLocalProxy(pid string) bool
- func Netip2Csv(ips []netip.Addr) (csv string)
- func NewDNSGateway(pctx context.Context, fakeaddrs []netip.AddrPort, outer RdnsResolver, ...) (t *dnsgateway)
- func NewResolver(pctx context.Context, fakeaddrs string, dtr x.DNSTransport, l x.DNSListener, ...) *resolver
- func NewXdomains(tid, uid string, pri []string, ttl time.Time) *xdomains
- func NewXips(tid, uid string, pri, sec []netip.Addr, ttl time.Time) *xips
- func PrefixFor(id string) string
- func RegisterAddrs(id, hostname string, ipps []string) (ok bool)
- func Req(t Transport, network string, q *dns.Msg, smm *x.DNSSummary) (*dns.Msg, error)
- func Status2Str(status int) string
- type Cacher
- type DNS64
- type Gateway
- type MDNSTransport
- type NAT64
- type NatPt
- type QueryError
- func NewBadQueryError(err error) *QueryError
- func NewBadResponseQueryError(err error) *QueryError
- func NewClientQueryError(err error) *QueryError
- func NewEndQueryError() *QueryError
- func NewInternalQueryError(err error) *QueryError
- func NewNoResponseQueryError(err error) *QueryError
- func NewPausedQueryError() *QueryError
- func NewSendFailedQueryError(err error) *QueryError
- func NewTransportQueryError(err error) *QueryError
- func WillErr(t Transport) *QueryError
- type RDNS
- type RdnsResolver
- type Resolver
- type ResolverSelf
- type Transport
- type TransportMult
- type TransportMultInternal
- type TransportMultProviderInternal
- type TransportProviderInternal
Constants ¶
const ( Start = x.Start Complete = x.Complete SendFailed = x.SendFailed NoResponse = x.NoResponse BadQuery = x.BadQuery BadResponse = x.BadResponse InternalError = x.InternalError TransportError = x.TransportError ClientError = x.ClientError Paused = x.Paused DEnd = x.DEnd Unknown = 100 )
const ( EB32 = x.EB32 EB64 = x.EB64 )
encoding type, base32 or base64
const ( // DNS transport types DOH = x.DOH DNSCrypt = x.DNSCrypt DNS53 = x.DNS53 DOT = x.DOT ODOH = x.ODOH // DNS decorators CT = x.CT // DNS transport IDs Goos = x.Goos System = x.System Local = x.Local Default = x.Default Preferred = x.Preferred Preset = x.Preset Fixed = x.Fixed BlockFree = x.BlockFree Bootstrap = x.Bootstrap BlockAll = x.BlockAll Alg = x.Alg DcProxy = x.DcProxy Plus = x.Plus IpMapper = x.IpMapper NoDNS = "" // preferred network to use with t.Query NetTypeUDP = "udp" NetTypeTCP = "tcp" // preferred forwarding network, if any // ipn.Base is treated as a no-proxy NetBaseProxy = x.Base NetAutoProxy = x.Auto NetNoProxy = x.Block NetExitProxy = x.Exit // pseudo transport ID to tag dns64 responses AlgDNS64 = "dns64" )
const AnyResolver = "__anyresolver"
const Local464Resolver = "__local464" // preset "forced" DNS64/NAT64
const OverlayResolver = "__overlay" // "net.DefaultResolver" dnsx.Goos
const Rfc7050WKN = "ipv4only.arpa."
ref: datatracker.ietf.org/doc/html/rfc8880
const UnderlayResolver = "__underlay" // used by transport dnsx.System
Variables ¶
var ( EchPrefix = "ech." NoPkiPrefix = "nopki." NoIPPort []netip.AddrPort = nil )
Functions ¶
func CanUseProxy ¶
func Categorize ¶
func ChooseHealthyProxy ¶
func IsEncrypted ¶
func IsLocalProxy ¶
meta proxies like pid == Auto are not considered local.
func NewDNSGateway ¶
func NewDNSGateway(pctx context.Context, fakeaddrs []netip.AddrPort, outer RdnsResolver, dns64 NatPt) (t *dnsgateway)
NewDNSGateway returns a DNS ALG, ready for use.
func NewResolver ¶
func NewResolver(pctx context.Context, fakeaddrs string, dtr x.DNSTransport, l x.DNSListener, pt NatPt) *resolver
func NewXdomains ¶
NewXdomains returns a new xdomains object keyed by tid+uid.
func NewXips ¶
NewXips returns a new xips object with primary and secondary ips. May return nil if tid is empty.
func RegisterAddrs ¶
RegisterAddrs registers IP ports with all dialers for a given hostname. If id is dnsx.Bootstrap, the hostname is "protected" from re-resolutions. hostname is a domain name, and as a special case, can be protect.UidSelf or protect.UidSystem.
func Req ¶
Req sends q to transport t and returns the answer, if any; errors are unset if answer is not servfail or empty; smm, the in/out parameter, is dns summary as got from t.
func Status2Str ¶
Types ¶
type DNS64 ¶
type DNS64 interface {
// Add64 registers DNS64 resolver f to id.
Add64(id string) bool
// Remove64 deregisters any current resolver from id.
Remove64(id string) bool
// ResetNat64Prefix sets the NAT64 prefix for transport id to ip6prefix.
ResetNat64Prefix(ip6prefix string) bool
// D64 synthesizes ans64 (AAAA) from ans6 if required, using resolver f.
// Returned ans64 is nil if no DNS64 synthesis is needed (not AAAA).
// Returned ans64 is ans6 if it already has AAAA records.
D64(network, id, uid string, ans6 *dns.Msg) *dns.Msg
}
type Gateway ¶
type Gateway interface {
// given an alg or real ip, retrieves assoc real ips as csv, if any
X(maybeAlg netip.Addr, uid string, tids ...string) (realips []netip.Addr, undidAlg bool)
// given an alg or real ip, retrieves assoc dns names as csv, if any
PTR(maybeAlg netip.Addr, uid, tid string, force bool) (domaincsv string, didForce bool)
// given domain, retrieve assoc alg ips or real ips as csv, if any
RESOLV(domain, uid, tid string) []netip.Addr
// given an alg or real ip, retrieve assoc blocklists as csv, if any
RDNSBL(maybeAlg netip.Addr) (blocklistcsv string)
// S reveals internal state for debugging
S() string
// contains filtered or unexported methods
}
type MDNSTransport ¶
type NAT64 ¶
type NAT64 interface {
// Returns true if ip is a NAT64 address from transport id.
IsNat64(id string, ip netip.Addr) bool
// Translates ip to IPv4 using the NAT64 prefix for transport id.
// As a special case, ip is zero addr, output is always IPv4 zero addr.
X64(id string, ip netip.Addr) netip.Addr
}
type QueryError ¶
type QueryError struct {
// contains filtered or unexported fields
}
func NewBadQueryError ¶
func NewBadQueryError(err error) *QueryError
func NewBadResponseQueryError ¶
func NewBadResponseQueryError(err error) *QueryError
func NewClientQueryError ¶
func NewClientQueryError(err error) *QueryError
with http, for 4xx errors
func NewEndQueryError ¶
func NewEndQueryError() *QueryError
func NewInternalQueryError ¶
func NewInternalQueryError(err error) *QueryError
func NewNoResponseQueryError ¶
func NewNoResponseQueryError(err error) *QueryError
func NewPausedQueryError ¶
func NewPausedQueryError() *QueryError
func NewSendFailedQueryError ¶
func NewSendFailedQueryError(err error) *QueryError
func NewTransportQueryError ¶
func NewTransportQueryError(err error) *QueryError
with http, for 5xx errors
func WillErr ¶
func WillErr(t Transport) *QueryError
func (*QueryError) Error ¶
func (e *QueryError) Error() string
func (*QueryError) Status ¶
func (e *QueryError) Status() int
func (*QueryError) String ¶
func (e *QueryError) String() string
func (*QueryError) Unwrap ¶
func (e *QueryError) Unwrap() error
type RdnsResolver ¶
type RdnsResolver interface {
x.RDNSResolver
// contains filtered or unexported methods
}
type Resolver ¶
type Resolver interface {
TransportProviderInternal
TransportMultProviderInternal
TransportMultInternal
ResolverSelf
RdnsResolver
NatPt
// IsDnsAddr returns true if the ip:port is resolver's fake endpoint
IsDnsAddr(ipport netip.AddrPort) bool
// Serve reads DNS query from conn and writes DNS answer to conn
Serve(proto string, conn protect.Conn, uid string)
// StopAll stops all transports.
StopAll()
// S reveals internal state for debugging
S() string
}
type ResolverSelf ¶
type ResolverSelf interface {
// LocalLookup performs resolution on Default and/or Goos DNSes.
// To be only used by protect.UidSelf.
LocalLookup(q []byte) (a []byte, tid string, err error)
// Lookup performs resolution on chosen Transport.
// To be only used by protect.UidSelf.
Lookup(q []byte, chosen ...string) (a []byte, tid string, err error)
// LookupFor performs resolution for uid.
LookupFor(q []byte, uid string) (a []byte, tid string, err error)
}
ResolverSelf is for internal resolution needs.
type Transport ¶
type Transport interface {
x.DNSTransport
// Given a DNS query (including ID), returns a DNS response with matching
// ID, or an error if no response was received. The error may be accompanied
// by a SERVFAIL response if appropriate.
Query(network string, q *dns.Msg, summary *x.DNSSummary) (*dns.Msg, error)
// IPPorts returns all ip:ports of this server.
IPPorts() []netip.AddrPort
// Stop closes the transport.
Stop() error
}
Transport represents a DNS query transport. This interface is exported by gobind, so it has to be very simple.
func NewPlusTransport ¶
func NewPlusTransport(ctx context.Context, r TransportProviderInternal, ts ...Transport) Transport
type TransportMult ¶
type TransportMult interface {
x.DNSTransportMult
Transport
}
TransportMult is a hybrid: transport and a multi-transport.
type TransportMultInternal ¶
type TransportMultInternal interface {
x.DNSTransportMult
}
type TransportMultProviderInternal ¶
type TransportMultProviderInternal interface {
x.DNSTransportMultProvider
// GetMultInternal returns multi-transport, if available
GetMultInternal(id string) (TransportMult, error)
}
type TransportProviderInternal ¶
type TransportProviderInternal interface {
x.DNSTransportProvider
// GetInternal returns the internal transport interface for the given ID.
GetInternal(id string) (Transport, error)
// Gateway implements a DNS ALG transport
Gateway() Gateway
// MDNS returns the mdns transport, if available; error otherwise.
MDNS() (MDNSTransport, error)
}