From 52954b8cebae16e20c6939c1e31e60202a8bada5 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 28 Mar 2024 18:21:34 +0700 Subject: [PATCH] Set bootstrap ip for ControlD upstream in cd mode --- cmd/cli/cli.go | 22 +++++++++++++++++++--- config.go | 13 +++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index aab4440..08aa97c 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -12,6 +12,7 @@ import ( "net" "net/http" "net/netip" + "net/url" "os" "os/exec" "path/filepath" @@ -1431,6 +1432,20 @@ func processCDFlags(cfg *ctrld.Config) error { mainLog.Load().Err(err).Msg("disregarding invalid custom config") } + bootstrapIP := func(endpoint string) string { + u, err := url.Parse(endpoint) + if err != nil { + logger.Warn().Err(err).Msgf("no bootstrap IP for invalid endpoint: %s", endpoint) + return "" + } + switch { + case dns.IsSubDomain(ctrld.FreeDnsDomain, u.Host): + return ctrld.FreeDNSBoostrapIP + case dns.IsSubDomain(ctrld.PremiumDnsDomain, u.Host): + return ctrld.PremiumDNSBoostrapIP + } + return "" + } cfg.Network = make(map[string]*ctrld.NetworkConfig) cfg.Network["0"] = &ctrld.NetworkConfig{ Name: "Network 0", @@ -1438,9 +1453,10 @@ func processCDFlags(cfg *ctrld.Config) error { } cfg.Upstream = make(map[string]*ctrld.UpstreamConfig) cfg.Upstream["0"] = &ctrld.UpstreamConfig{ - Endpoint: resolverConfig.DOH, - Type: cdUpstreamProto, - Timeout: 5000, + BootstrapIP: bootstrapIP(resolverConfig.DOH), + Endpoint: resolverConfig.DOH, + Type: cdUpstreamProto, + Timeout: 5000, } rules := make([]ctrld.Rule, 0, len(resolverConfig.Exclude)) for _, domain := range resolverConfig.Exclude { diff --git a/config.go b/config.go index 582069c..202f105 100644 --- a/config.go +++ b/config.go @@ -46,6 +46,15 @@ const ( // depending on the record type of the DNS query. IpStackSplit = "split" + // FreeDnsDomain is the domain name of free ControlD service. + FreeDnsDomain = "freedns.controld.com" + // FreeDNSBoostrapIP is the IP address of freedns.controld.com. + FreeDNSBoostrapIP = "76.76.2.11" + // PremiumDnsDomain is the domain name of premium ControlD service. + PremiumDnsDomain = "dns.controld.com" + // PremiumDNSBoostrapIP is the IP address of dns.controld.com. + PremiumDNSBoostrapIP = "76.76.2.22" + controlDComDomain = "controld.com" controlDNetDomain = "controld.net" controlDDevDomain = "controld.dev" @@ -104,14 +113,14 @@ func InitConfig(v *viper.Viper, name string) { }) v.SetDefault("upstream", map[string]*UpstreamConfig{ "0": { - BootstrapIP: "76.76.2.11", + BootstrapIP: FreeDNSBoostrapIP, Name: "Control D - Anti-Malware", Type: ResolverTypeDOH, Endpoint: "https://freedns.controld.com/p1", Timeout: 5000, }, "1": { - BootstrapIP: "76.76.2.11", + BootstrapIP: FreeDNSBoostrapIP, Name: "Control D - No Ads", Type: ResolverTypeDOQ, Endpoint: "p2.freedns.controld.com",