diff --git a/infra/conf/dns.go b/infra/conf/dns.go index 9775b00aa..93e6f7b58 100644 --- a/infra/conf/dns.go +++ b/infra/conf/dns.go @@ -160,6 +160,18 @@ func (c *DnsConfig) Build() (*dns.Config, error) { mappings = append(mappings, mapping) } + } else if strings.HasPrefix(domain, "regexp:") { + mapping := getHostMapping(addr) + mapping.Type = dns.DomainMatchingType_Regex + mapping.Domain = domain[7:] + + mappings = append(mappings, mapping) + } else if strings.HasPrefix(domain, "keyword:") { + mapping := getHostMapping(addr) + mapping.Type = dns.DomainMatchingType_Keyword + mapping.Domain = domain[8:] + + mappings = append(mappings, mapping) } else { mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Full diff --git a/infra/conf/dns_test.go b/infra/conf/dns_test.go index df04a57d2..fc3a4ba13 100644 --- a/infra/conf/dns_test.go +++ b/infra/conf/dns_test.go @@ -8,6 +8,7 @@ import ( "github.com/golang/protobuf/proto" "v2ray.com/core/app/dns" + "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/platform" @@ -20,7 +21,26 @@ func init() { common.Must(err) common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(wd, "..", "..", "release", "config", "geoip.dat"))) - common.Must(filesystem.CopyFile(platform.GetAssetLocation("geosite.dat"), filepath.Join(wd, "..", "..", "release", "config", "geosite.dat"))) + + geositeFilePath := platform.GetAssetLocation("geosite.dat") + geositeFile, err := os.OpenFile(geositeFilePath, os.O_CREATE|os.O_WRONLY, 0600) + common.Must(err) + defer geositeFile.Close() + + list := &router.GeoSiteList{ + Entry: []*router.GeoSite{ + { + CountryCode: "TEST", + Domain: []*router.Domain{ + {Type: router.Domain_Full, Value: "example.com"}, + }, + }, + }, + } + + listBytes, err := proto.Marshal(list) + common.Must(err) + common.Must2(geositeFile.Write(listBytes)) } func TestDnsConfigParsing(t *testing.T) { geositePath := platform.GetAssetLocation("geosite.dat") @@ -48,7 +68,10 @@ func TestDnsConfigParsing(t *testing.T) { }], "hosts": { "v2ray.com": "127.0.0.1", - "domain:example.com": "google.com" + "domain:example.com": "google.com", + "geosite:test": "10.0.0.1", + "keyword:google": "8.8.8.8", + "regexp:.*\\.com": "8.8.4.4" }, "clientIp": "10.0.0.1" }`, @@ -79,6 +102,21 @@ func TestDnsConfigParsing(t *testing.T) { Domain: "example.com", ProxiedDomain: "google.com", }, + { + Type: dns.DomainMatchingType_Full, + Domain: "example.com", + Ip: [][]byte{{10, 0, 0, 1}}, + }, + { + Type: dns.DomainMatchingType_Keyword, + Domain: "google", + Ip: [][]byte{{8, 8, 8, 8}}, + }, + { + Type: dns.DomainMatchingType_Regex, + Domain: ".*\\.com", + Ip: [][]byte{{8, 8, 4, 4}}, + }, { Type: dns.DomainMatchingType_Full, Domain: "v2ray.com",