dns

package
v4.0.0-...-960decf Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 13, 2022 License: AGPL-3.0 Imports: 37 Imported by: 0

Documentation ¶

Overview ¶

Package dns is an implementation of core.DNS feature.

Index ¶

Constants ¶

View Source
const NextProtoDQ = "doq-i00"

NextProtoDQ - During connection establishment, DNS/QUIC support is indicated by selecting the ALPN token "dq" in the crypto handshake.

Variables ¶

View Source
var (
	DomainMatchingType_name = map[int32]string{
		0: "Full",
		1: "Subdomain",
		2: "Keyword",
		3: "Regex",
	}
	DomainMatchingType_value = map[string]int32{
		"Full":      0,
		"Subdomain": 1,
		"Keyword":   2,
		"Regex":     3,
	}
)

Enum value maps for DomainMatchingType.

View Source
var (
	QueryStrategy_name = map[int32]string{
		0: "USE_IP",
		1: "USE_IP4",
		2: "USE_IP6",
		3: "USE_IP_FAILFAST",
	}
	QueryStrategy_value = map[string]int32{
		"USE_IP":          0,
		"USE_IP4":         1,
		"USE_IP6":         2,
		"USE_IP_FAILFAST": 3,
	}
)

Enum value maps for QueryStrategy.

View Source
var File_app_dns_config_proto protoreflect.FileDescriptor

Functions ¶

func Fqdn ¶

func Fqdn(domain string) string

Fqdn normalize domain make sure it ends with '.'

Types ¶

type ClassicNameServer ¶

type ClassicNameServer struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

ClassicNameServer implemented traditional UDP DNS.

func NewClassicNameServer ¶

func NewClassicNameServer(address net.Destination, dispatcher routing.Dispatcher) *ClassicNameServer

NewClassicNameServer creates udp server object for remote resolving.

func (*ClassicNameServer) Cleanup ¶

func (s *ClassicNameServer) Cleanup() error

Cleanup clears expired items from cache

func (*ClassicNameServer) HandleResponse ¶

func (s *ClassicNameServer) HandleResponse(ctx context.Context, packet *udp_proto.Packet)

HandleResponse handles udp response packet from remote DNS server.

func (*ClassicNameServer) Name ¶

func (s *ClassicNameServer) Name() string

Name implements Server.

func (*ClassicNameServer) QueryIP ¶

func (s *ClassicNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option dns_feature.IPOption, disableCache bool) ([]net.IP, error)

QueryIP implements Server.

type Client ¶

type Client struct {
	// contains filtered or unexported fields
}

Client is the interface for DNS client.

func NewClient ¶

func NewClient(ctx context.Context, ns *NameServer, clientIP net.IP, container router.GeoIPMatcherContainer, matcherInfos *[]*DomainMatcherInfo, updateDomainRule func(strmatcher.Matcher, int, []*DomainMatcherInfo) error) (*Client, error)

NewClient creates a DNS client managing a name server with client IP, domain rules and expected IPs.

func NewLocalDNSClient ¶

func NewLocalDNSClient() *Client

NewLocalDNSClient creates localdns client object for directly lookup in system DNS.

func NewSimpleClient ¶

func NewSimpleClient(ctx context.Context, endpoint *net.Endpoint, clientIP net.IP) (*Client, error)

NewSimpleClient creates a DNS client with a simple destination.

func (*Client) MatchExpectedIPs ¶

func (c *Client) MatchExpectedIPs(domain string, ips []net.IP) ([]net.IP, error)

MatchExpectedIPs matches queried domain IPs with expected IPs and returns matched ones.

func (*Client) Name ¶

func (c *Client) Name() string

Name returns the server name the client manages.

func (*Client) QueryIP ¶

func (c *Client) QueryIP(ctx context.Context, domain string, option dns.IPOption, disableCache bool) ([]net.IP, error)

QueryIP send DNS query to the name server with the client's IP.

type Config ¶

type Config struct {

	// Nameservers used by this DNS. Only traditional UDP servers are support at
	// the moment. A special value 'localhost' as a domain address can be set to
	// use DNS on local system.
	//
	// Deprecated: Do not use.
	NameServers []*net.Endpoint `protobuf:"bytes,1,rep,name=NameServers,proto3" json:"NameServers,omitempty"`
	// NameServer list used by this DNS client.
	NameServer []*NameServer `protobuf:"bytes,5,rep,name=name_server,json=nameServer,proto3" json:"name_server,omitempty"`
	// Static hosts. Domain to IP.
	// Deprecated. Use static_hosts.
	//
	// Deprecated: Do not use.
	Hosts map[string]*net.IPOrDomain `` /* 151-byte string literal not displayed */
	// Client IP for EDNS client subnet. Must be 4 bytes (IPv4) or 16 bytes
	// (IPv6).
	ClientIp    []byte                `protobuf:"bytes,3,opt,name=client_ip,json=clientIp,proto3" json:"client_ip,omitempty"`
	StaticHosts []*Config_HostMapping `protobuf:"bytes,4,rep,name=static_hosts,json=staticHosts,proto3" json:"static_hosts,omitempty"`
	// Tag is the inbound tag of DNS client.
	Tag string `protobuf:"bytes,6,opt,name=tag,proto3" json:"tag,omitempty"`
	// DisableCache disables DNS cache
	DisableCache           bool          `protobuf:"varint,8,opt,name=disableCache,proto3" json:"disableCache,omitempty"`
	QueryStrategy          QueryStrategy `` /* 139-byte string literal not displayed */
	DisableFallback        bool          `protobuf:"varint,10,opt,name=disableFallback,proto3" json:"disableFallback,omitempty"`
	DisableFallbackIfMatch bool          `protobuf:"varint,11,opt,name=disableFallbackIfMatch,proto3" json:"disableFallbackIfMatch,omitempty"`
	// contains filtered or unexported fields
}

func (*Config) Descriptor deprecated

func (*Config) Descriptor() ([]byte, []int)

Deprecated: Use Config.ProtoReflect.Descriptor instead.

func (*Config) GetClientIp ¶

func (x *Config) GetClientIp() []byte

func (*Config) GetDisableCache ¶

func (x *Config) GetDisableCache() bool

func (*Config) GetDisableFallback ¶

func (x *Config) GetDisableFallback() bool

func (*Config) GetDisableFallbackIfMatch ¶

func (x *Config) GetDisableFallbackIfMatch() bool

func (*Config) GetHosts deprecated

func (x *Config) GetHosts() map[string]*net.IPOrDomain

Deprecated: Do not use.

func (*Config) GetNameServer ¶

func (x *Config) GetNameServer() []*NameServer

func (*Config) GetNameServers deprecated

func (x *Config) GetNameServers() []*net.Endpoint

Deprecated: Do not use.

func (*Config) GetQueryStrategy ¶

func (x *Config) GetQueryStrategy() QueryStrategy

func (*Config) GetStaticHosts ¶

func (x *Config) GetStaticHosts() []*Config_HostMapping

func (*Config) GetTag ¶

func (x *Config) GetTag() string

func (*Config) ProtoMessage ¶

func (*Config) ProtoMessage()

func (*Config) ProtoReflect ¶

func (x *Config) ProtoReflect() protoreflect.Message

func (*Config) Reset ¶

func (x *Config) Reset()

func (*Config) String ¶

func (x *Config) String() string

type Config_HostMapping ¶

type Config_HostMapping struct {
	Type   DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"`
	Domain string             `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
	Ip     [][]byte           `protobuf:"bytes,3,rep,name=ip,proto3" json:"ip,omitempty"`
	// ProxiedDomain indicates the mapped domain has the same IP address on this
	// domain. V2Ray will use this domain for IP queries.
	ProxiedDomain string `protobuf:"bytes,4,opt,name=proxied_domain,json=proxiedDomain,proto3" json:"proxied_domain,omitempty"`
	// contains filtered or unexported fields
}

func (*Config_HostMapping) Descriptor deprecated

func (*Config_HostMapping) Descriptor() ([]byte, []int)

Deprecated: Use Config_HostMapping.ProtoReflect.Descriptor instead.

func (*Config_HostMapping) GetDomain ¶

func (x *Config_HostMapping) GetDomain() string

func (*Config_HostMapping) GetIp ¶

func (x *Config_HostMapping) GetIp() [][]byte

func (*Config_HostMapping) GetProxiedDomain ¶

func (x *Config_HostMapping) GetProxiedDomain() string

func (*Config_HostMapping) GetType ¶

func (*Config_HostMapping) ProtoMessage ¶

func (*Config_HostMapping) ProtoMessage()

func (*Config_HostMapping) ProtoReflect ¶

func (x *Config_HostMapping) ProtoReflect() protoreflect.Message

func (*Config_HostMapping) Reset ¶

func (x *Config_HostMapping) Reset()

func (*Config_HostMapping) String ¶

func (x *Config_HostMapping) String() string

type DNS ¶

type DNS struct {
	sync.Mutex
	// contains filtered or unexported fields
}

DNS is a DNS rely server.

func New ¶

func New(ctx context.Context, config *Config) (*DNS, error)

New creates a new DNS server with given configuration.

func (*DNS) Close ¶

func (s *DNS) Close() error

Close implements common.Closable.

func (*DNS) GetIPOption ¶

func (s *DNS) GetIPOption() *dns.IPOption

GetIPOption implements ClientWithIPOption.

func (s *DNS) IsOwnLink(ctx context.Context) bool

IsOwnLink implements proxy.dns.ownLinkVerifier

func (*DNS) LookupIP ¶

func (s *DNS) LookupIP(domain string) ([]net.IP, error)

LookupIP implements dns.Client.

func (*DNS) LookupIPv4 ¶

func (s *DNS) LookupIPv4(domain string) ([]net.IP, error)

LookupIPv4 implements dns.IPv4Lookup.

func (*DNS) LookupIPv6 ¶

func (s *DNS) LookupIPv6(domain string) ([]net.IP, error)

LookupIPv6 implements dns.IPv6Lookup.

func (*DNS) SetFailFastOption ¶

func (s *DNS) SetFailFastOption(isFailFast bool)

func (*DNS) SetFakeDNSOption ¶

func (s *DNS) SetFakeDNSOption(isFakeEnable bool)

SetFakeDNSOption implements ClientWithIPOption.

func (*DNS) SetQueryOption ¶

func (s *DNS) SetQueryOption(isIPv4Enable, isIPv6Enable bool)

SetQueryOption implements ClientWithIPOption.

func (*DNS) Start ¶

func (s *DNS) Start() error

Start implements common.Runnable.

func (*DNS) Type ¶

func (*DNS) Type() interface{}

Type implements common.HasType.

type DoHNameServer ¶

type DoHNameServer struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

DoHNameServer implemented DNS over HTTPS (RFC8484) Wire Format, which is compatible with traditional dns over udp(RFC1035), thus most of the DOH implementation is copied from udpns.go

func NewDoHLocalNameServer ¶

func NewDoHLocalNameServer(url *url.URL) *DoHNameServer

NewDoHLocalNameServer creates DOH client object for local resolving

func NewDoHNameServer ¶

func NewDoHNameServer(url *url.URL, dispatcher routing.Dispatcher) (*DoHNameServer, error)

NewDoHNameServer creates DOH server object for remote resolving.

func (*DoHNameServer) Cleanup ¶

func (s *DoHNameServer) Cleanup() error

Cleanup clears expired items from cache

func (*DoHNameServer) Name ¶

func (s *DoHNameServer) Name() string

Name implements Server.

func (*DoHNameServer) QueryIP ¶

func (s *DoHNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option dns_feature.IPOption, disableCache bool) ([]net.IP, error)

QueryIP implements Server.

type DomainMatcherInfo ¶

type DomainMatcherInfo struct {
	// contains filtered or unexported fields
}

DomainMatcherInfo contains information attached to index returned by Server.domainMatcher

type DomainMatchingType ¶

type DomainMatchingType int32
const (
	DomainMatchingType_Full      DomainMatchingType = 0
	DomainMatchingType_Subdomain DomainMatchingType = 1
	DomainMatchingType_Keyword   DomainMatchingType = 2
	DomainMatchingType_Regex     DomainMatchingType = 3
)

func (DomainMatchingType) Descriptor ¶

func (DomainMatchingType) Enum ¶

func (DomainMatchingType) EnumDescriptor deprecated

func (DomainMatchingType) EnumDescriptor() ([]byte, []int)

Deprecated: Use DomainMatchingType.Descriptor instead.

func (DomainMatchingType) Number ¶

func (DomainMatchingType) String ¶

func (x DomainMatchingType) String() string

func (DomainMatchingType) Type ¶

type FakeDNSServer ¶

type FakeDNSServer struct {
	// contains filtered or unexported fields
}

func NewFakeDNSServer ¶

func NewFakeDNSServer() *FakeDNSServer

func (FakeDNSServer) Name ¶

func (FakeDNSServer) Name() string

func (*FakeDNSServer) QueryIP ¶

func (f *FakeDNSServer) QueryIP(ctx context.Context, domain string, _ net.IP, opt dns.IPOption, _ bool) ([]net.IP, error)

type IPRecord ¶

type IPRecord struct {
	ReqID  uint16
	IP     []net.Address
	Expire time.Time
	RCode  dnsmessage.RCode
}

IPRecord is a cacheable item for a resolved domain

type LocalNameServer ¶

type LocalNameServer struct {
	// contains filtered or unexported fields
}

LocalNameServer is an wrapper over local DNS feature.

func NewLocalNameServer ¶

func NewLocalNameServer() *LocalNameServer

NewLocalNameServer creates localdns server object for directly lookup in system DNS.

func (*LocalNameServer) Name ¶

func (s *LocalNameServer) Name() string

Name implements Server.

func (*LocalNameServer) QueryIP ¶

func (s *LocalNameServer) QueryIP(_ context.Context, domain string, _ net.IP, option dns.IPOption, _ bool) ([]net.IP, error)

QueryIP implements Server.

type NameServer ¶

type NameServer struct {
	Address           *net.Endpoint                `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	ClientIp          []byte                       `protobuf:"bytes,5,opt,name=client_ip,json=clientIp,proto3" json:"client_ip,omitempty"`
	SkipFallback      bool                         `protobuf:"varint,6,opt,name=skipFallback,proto3" json:"skipFallback,omitempty"`
	PrioritizedDomain []*NameServer_PriorityDomain `protobuf:"bytes,2,rep,name=prioritized_domain,json=prioritizedDomain,proto3" json:"prioritized_domain,omitempty"`
	Geoip             []*router.GeoIP              `protobuf:"bytes,3,rep,name=geoip,proto3" json:"geoip,omitempty"`
	OriginalRules     []*NameServer_OriginalRule   `protobuf:"bytes,4,rep,name=original_rules,json=originalRules,proto3" json:"original_rules,omitempty"`
	// contains filtered or unexported fields
}

func (*NameServer) Descriptor deprecated

func (*NameServer) Descriptor() ([]byte, []int)

Deprecated: Use NameServer.ProtoReflect.Descriptor instead.

func (*NameServer) GetAddress ¶

func (x *NameServer) GetAddress() *net.Endpoint

func (*NameServer) GetClientIp ¶

func (x *NameServer) GetClientIp() []byte

func (*NameServer) GetGeoip ¶

func (x *NameServer) GetGeoip() []*router.GeoIP

func (*NameServer) GetOriginalRules ¶

func (x *NameServer) GetOriginalRules() []*NameServer_OriginalRule

func (*NameServer) GetPrioritizedDomain ¶

func (x *NameServer) GetPrioritizedDomain() []*NameServer_PriorityDomain

func (*NameServer) GetSkipFallback ¶

func (x *NameServer) GetSkipFallback() bool

func (*NameServer) ProtoMessage ¶

func (*NameServer) ProtoMessage()

func (*NameServer) ProtoReflect ¶

func (x *NameServer) ProtoReflect() protoreflect.Message

func (*NameServer) Reset ¶

func (x *NameServer) Reset()

func (*NameServer) String ¶

func (x *NameServer) String() string

type NameServer_OriginalRule ¶

type NameServer_OriginalRule struct {
	Rule string `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"`
	Size uint32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"`
	// contains filtered or unexported fields
}

func (*NameServer_OriginalRule) Descriptor deprecated

func (*NameServer_OriginalRule) Descriptor() ([]byte, []int)

Deprecated: Use NameServer_OriginalRule.ProtoReflect.Descriptor instead.

func (*NameServer_OriginalRule) GetRule ¶

func (x *NameServer_OriginalRule) GetRule() string

func (*NameServer_OriginalRule) GetSize ¶

func (x *NameServer_OriginalRule) GetSize() uint32

func (*NameServer_OriginalRule) ProtoMessage ¶

func (*NameServer_OriginalRule) ProtoMessage()

func (*NameServer_OriginalRule) ProtoReflect ¶

func (x *NameServer_OriginalRule) ProtoReflect() protoreflect.Message

func (*NameServer_OriginalRule) Reset ¶

func (x *NameServer_OriginalRule) Reset()

func (*NameServer_OriginalRule) String ¶

func (x *NameServer_OriginalRule) String() string

type NameServer_PriorityDomain ¶

type NameServer_PriorityDomain struct {
	Type   DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"`
	Domain string             `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"`
	// contains filtered or unexported fields
}

func (*NameServer_PriorityDomain) Descriptor deprecated

func (*NameServer_PriorityDomain) Descriptor() ([]byte, []int)

Deprecated: Use NameServer_PriorityDomain.ProtoReflect.Descriptor instead.

func (*NameServer_PriorityDomain) GetDomain ¶

func (x *NameServer_PriorityDomain) GetDomain() string

func (*NameServer_PriorityDomain) GetType ¶

func (*NameServer_PriorityDomain) ProtoMessage ¶

func (*NameServer_PriorityDomain) ProtoMessage()

func (*NameServer_PriorityDomain) ProtoReflect ¶

func (*NameServer_PriorityDomain) Reset ¶

func (x *NameServer_PriorityDomain) Reset()

func (*NameServer_PriorityDomain) String ¶

func (x *NameServer_PriorityDomain) String() string

type QUICNameServer ¶

type QUICNameServer struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

QUICNameServer implemented DNS over QUIC

func NewQUICNameServer ¶

func NewQUICNameServer(url *url.URL) (*QUICNameServer, error)

NewQUICNameServer creates DNS-over-QUIC client object for local resolving

func (*QUICNameServer) Cleanup ¶

func (s *QUICNameServer) Cleanup() error

Cleanup clears expired items from cache

func (*QUICNameServer) Name ¶

func (s *QUICNameServer) Name() string

Name returns client name

func (*QUICNameServer) QueryIP ¶

func (s *QUICNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option dns_feature.IPOption, disableCache bool) ([]net.IP, error)

QueryIP is called from dns.Server->queryIPTimeout

type QueryStrategy ¶

type QueryStrategy int32
const (
	QueryStrategy_USE_IP          QueryStrategy = 0
	QueryStrategy_USE_IP4         QueryStrategy = 1
	QueryStrategy_USE_IP6         QueryStrategy = 2
	QueryStrategy_USE_IP_FAILFAST QueryStrategy = 3
)

func (QueryStrategy) Descriptor ¶

func (QueryStrategy) Enum ¶

func (x QueryStrategy) Enum() *QueryStrategy

func (QueryStrategy) EnumDescriptor deprecated

func (QueryStrategy) EnumDescriptor() ([]byte, []int)

Deprecated: Use QueryStrategy.Descriptor instead.

func (QueryStrategy) Number ¶

func (QueryStrategy) String ¶

func (x QueryStrategy) String() string

func (QueryStrategy) Type ¶

type Server ¶

type Server interface {
	// Name of the Client.
	Name() string
	// QueryIP sends IP queries to its configured server.
	QueryIP(ctx context.Context, domain string, clientIP net.IP, option dns.IPOption, disableCache bool) ([]net.IP, error)
}

Server is the interface for Name Server.

func NewServer ¶

func NewServer(dest net.Destination, dispatcher routing.Dispatcher) (Server, error)

NewServer creates a name server object according to the network destination url.

type StaticHosts ¶

type StaticHosts struct {
	// contains filtered or unexported fields
}

StaticHosts represents static domain-ip mapping in DNS server.

func NewStaticHosts ¶

func NewStaticHosts(hosts []*Config_HostMapping, legacy map[string]*net.IPOrDomain) (*StaticHosts, error)

NewStaticHosts creates a new StaticHosts instance.

func (*StaticHosts) Lookup ¶

func (h *StaticHosts) Lookup(domain string, option dns.IPOption) []net.Address

Lookup returns IP addresses or proxied domain for the given domain, if exists in this StaticHosts.

type TCPNameServer ¶

type TCPNameServer struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

TCPNameServer implemented DNS over TCP (RFC7766).

func NewTCPLocalNameServer ¶

func NewTCPLocalNameServer(url *url.URL) (*TCPNameServer, error)

NewTCPLocalNameServer creates DNS over TCP client object for local resolving

func NewTCPNameServer ¶

func NewTCPNameServer(url *url.URL, dispatcher routing.Dispatcher) (*TCPNameServer, error)

NewTCPNameServer creates DNS over TCP server object for remote resolving.

func (*TCPNameServer) Cleanup ¶

func (s *TCPNameServer) Cleanup() error

Cleanup clears expired items from cache

func (*TCPNameServer) Name ¶

func (s *TCPNameServer) Name() string

Name implements Server.

func (*TCPNameServer) QueryIP ¶

func (s *TCPNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option dns_feature.IPOption, disableCache bool) ([]net.IP, error)

QueryIP implements Server.

Directories ¶

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL