github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/app/dns/config.go (about)

     1  //go:build !confonly
     2  // +build !confonly
     3  
     4  package dns
     5  
     6  import (
     7  	"golang.org/x/net/dns/dnsmessage"
     8  
     9  	"github.com/v2fly/v2ray-core/v5/common/net"
    10  	"github.com/v2fly/v2ray-core/v5/common/strmatcher"
    11  	"github.com/v2fly/v2ray-core/v5/common/uuid"
    12  	"github.com/v2fly/v2ray-core/v5/features/dns"
    13  )
    14  
    15  var typeMap = map[DomainMatchingType]strmatcher.Type{
    16  	DomainMatchingType_Full:      strmatcher.Full,
    17  	DomainMatchingType_Subdomain: strmatcher.Domain,
    18  	DomainMatchingType_Keyword:   strmatcher.Substr,
    19  	DomainMatchingType_Regex:     strmatcher.Regex,
    20  }
    21  
    22  // References:
    23  // https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml
    24  // https://unix.stackexchange.com/questions/92441/whats-the-difference-between-local-home-and-lan
    25  var localTLDsAndDotlessDomains = []*NameServer_PriorityDomain{
    26  	{Type: DomainMatchingType_Regex, Domain: "^[^.]+$"}, // This will only match domains without any dot
    27  	{Type: DomainMatchingType_Subdomain, Domain: "local"},
    28  	{Type: DomainMatchingType_Subdomain, Domain: "localdomain"},
    29  	{Type: DomainMatchingType_Subdomain, Domain: "localhost"},
    30  	{Type: DomainMatchingType_Subdomain, Domain: "lan"},
    31  	{Type: DomainMatchingType_Subdomain, Domain: "home.arpa"},
    32  	{Type: DomainMatchingType_Subdomain, Domain: "example"},
    33  	{Type: DomainMatchingType_Subdomain, Domain: "invalid"},
    34  	{Type: DomainMatchingType_Subdomain, Domain: "test"},
    35  }
    36  
    37  var localTLDsAndDotlessDomainsRule = &NameServer_OriginalRule{
    38  	Rule: "geosite:private",
    39  	Size: uint32(len(localTLDsAndDotlessDomains)),
    40  }
    41  
    42  func toStrMatcher(t DomainMatchingType, domain string) (strmatcher.Matcher, error) {
    43  	strMType, f := typeMap[t]
    44  	if !f {
    45  		return nil, newError("unknown mapping type", t).AtWarning()
    46  	}
    47  	matcher, err := strMType.New(domain)
    48  	if err != nil {
    49  		return nil, newError("failed to create str matcher").Base(err)
    50  	}
    51  	return matcher, nil
    52  }
    53  
    54  func toNetIP(addrs []net.Address) ([]net.IP, error) {
    55  	ips := make([]net.IP, 0, len(addrs))
    56  	for _, addr := range addrs {
    57  		if addr.Family().IsIP() {
    58  			ips = append(ips, addr.IP())
    59  		} else {
    60  			return nil, newError("Failed to convert address", addr, "to Net IP.").AtWarning()
    61  		}
    62  	}
    63  	return ips, nil
    64  }
    65  
    66  func toIPOption(s QueryStrategy) dns.IPOption {
    67  	return dns.IPOption{
    68  		IPv4Enable: s == QueryStrategy_USE_IP || s == QueryStrategy_USE_IP4,
    69  		IPv6Enable: s == QueryStrategy_USE_IP || s == QueryStrategy_USE_IP6,
    70  		FakeEnable: false,
    71  	}
    72  }
    73  
    74  func toReqTypes(option dns.IPOption) []dnsmessage.Type {
    75  	var reqTypes []dnsmessage.Type
    76  	if option.IPv4Enable {
    77  		reqTypes = append(reqTypes, dnsmessage.TypeA)
    78  	}
    79  	if option.IPv6Enable {
    80  		reqTypes = append(reqTypes, dnsmessage.TypeAAAA)
    81  	}
    82  	return reqTypes
    83  }
    84  
    85  func generateRandomTag() string {
    86  	id := uuid.New()
    87  	return "v2ray.system." + id.String()
    88  }