mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
64 lines
2.1 KiB
package dns |
|
|
|
import ( |
|
"github.com/xtls/xray-core/common/errors" |
|
"github.com/xtls/xray-core/common/net" |
|
"github.com/xtls/xray-core/common/strmatcher" |
|
"github.com/xtls/xray-core/common/uuid" |
|
) |
|
|
|
var typeMap = map[DomainMatchingType]strmatcher.Type{ |
|
DomainMatchingType_Full: strmatcher.Full, |
|
DomainMatchingType_Subdomain: strmatcher.Domain, |
|
DomainMatchingType_Keyword: strmatcher.Substr, |
|
DomainMatchingType_Regex: strmatcher.Regex, |
|
} |
|
|
|
// References: |
|
// https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml |
|
// https://unix.stackexchange.com/questions/92441/whats-the-difference-between-local-home-and-lan |
|
var localTLDsAndDotlessDomains = []*NameServer_PriorityDomain{ |
|
{Type: DomainMatchingType_Regex, Domain: "^[^.]+$"}, // This will only match domains without any dot |
|
{Type: DomainMatchingType_Subdomain, Domain: "local"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "localdomain"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "localhost"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "lan"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "home.arpa"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "example"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "invalid"}, |
|
{Type: DomainMatchingType_Subdomain, Domain: "test"}, |
|
} |
|
|
|
var localTLDsAndDotlessDomainsRule = &NameServer_OriginalRule{ |
|
Rule: "geosite:private", |
|
Size: uint32(len(localTLDsAndDotlessDomains)), |
|
} |
|
|
|
func toStrMatcher(t DomainMatchingType, domain string) (strmatcher.Matcher, error) { |
|
strMType, f := typeMap[t] |
|
if !f { |
|
return nil, errors.New("unknown mapping type", t).AtWarning() |
|
} |
|
matcher, err := strMType.New(domain) |
|
if err != nil { |
|
return nil, errors.New("failed to create str matcher").Base(err) |
|
} |
|
return matcher, nil |
|
} |
|
|
|
func toNetIP(addrs []net.Address) ([]net.IP, error) { |
|
ips := make([]net.IP, 0, len(addrs)) |
|
for _, addr := range addrs { |
|
if addr.Family().IsIP() { |
|
ips = append(ips, addr.IP()) |
|
} else { |
|
return nil, errors.New("Failed to convert address", addr, "to Net IP.").AtWarning() |
|
} |
|
} |
|
return ips, nil |
|
} |
|
|
|
func generateRandomTag() string { |
|
id := uuid.New() |
|
return "xray.system." + id.String() |
|
}
|
|
|