dns

package
v1.1.0 Latest Latest
Warning

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

Go to latest
Published: May 23, 2024 License: MPL-2.0 Imports: 39 Imported by: 0

Documentation

Overview

Package dns is an implementation of core.DNS feature.

Index

Constants

View Source
const NextProtoDQ = "doq"

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",
	}
	QueryStrategy_value = map[string]int32{
		"USE_IP":  0,
		"USE_IP4": 1,
		"USE_IP6": 2,
	}
)

Enum value maps for QueryStrategy.

View Source
var File_app_dns_config_proto protoreflect.FileDescriptor

Functions

func Fqdn

func Fqdn(domain string) string

Fqdn normalizes domain make sure it ends with '.'

func ResolveIpOptionOverride

func ResolveIpOptionOverride(queryStrategy QueryStrategy, ipOption dns.IPOption) dns.IPOption

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 sends 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: Marked as deprecated in app/dns/config.proto.
	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: Marked as deprecated in app/dns/config.proto.
	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 `` /* 133-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: Marked as deprecated in app/dns/config.proto.

func (*Config) GetNameServer

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

func (*Config) GetNameServers deprecated

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

Deprecated: Marked as deprecated in app/dns/config.proto.

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=xray.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. Xray 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) LookupHosts

func (s *DNS) LookupHosts(domain string) *net.Address

LookupHosts implements dns.HostsLookup.

func (*DNS) LookupIP

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

LookupIP implements dns.Client.

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, queryStrategy QueryStrategy) *DoHNameServer

NewDoHLocalNameServer creates DOH client object for local resolving

func NewDoHNameServer

func NewDoHNameServer(url *url.URL, dispatcher routing.Dispatcher, queryStrategy QueryStrategy) (*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) (ips []net.IP, err 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"`
	QueryStrategy     QueryStrategy                `` /* 133-byte string literal not displayed */
	// 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) GetQueryStrategy

func (x *NameServer) GetQueryStrategy() QueryStrategy

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=xray.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, queryStrategy QueryStrategy) (*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
)

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, queryStrategy QueryStrategy) (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, queryStrategy QueryStrategy) (*TCPNameServer, error)

NewTCPLocalNameServer creates DNS over TCP client object for local resolving

func NewTCPNameServer

func NewTCPNameServer(
	url *url.URL,
	dispatcher routing.Dispatcher,
	queryStrategy QueryStrategy,
) (*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