diff --git a/bin/build-shadow b/bin/build-shadow new file mode 100755 index 00000000..f8d21dda --- /dev/null +++ b/bin/build-shadow @@ -0,0 +1,4 @@ +TAG=$(echo $TRAVIS_BRANCH | sed "s/\//-/") +TAG=${TAG:-latest} +docker build -t registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:$TAG -f docker/shadow/Dockerfile . +docker push registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:$TAG \ No newline at end of file diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index b3f24d73..13be8682 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -3,7 +3,7 @@ package main import ( "os" - "github.com/alibaba/kt-connect/pkg/proxy/server" + "github.com/alibaba/kt-connect/pkg/proxy/daemon" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) @@ -14,8 +14,11 @@ func init() { } func main() { - err := server.Run() + log.Info().Msg("Start kt connect proxy") + srv := daemon.NewDNSServerDefault() + err := srv.ListenAndServe() if err != nil { panic(err.Error()) } + log.Info().Msgf("DNS Server Start At 53...\n") } diff --git a/go.sum b/go.sum index 1be961fe..c62da0e2 100644 --- a/go.sum +++ b/go.sum @@ -146,6 +146,7 @@ golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0 golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/pkg/proxy/daemon/dnsserver.go b/pkg/proxy/daemon/dnsserver.go index bb5f397d..f980744c 100644 --- a/pkg/proxy/daemon/dnsserver.go +++ b/pkg/proxy/daemon/dnsserver.go @@ -51,14 +51,12 @@ func getDomain(origin string) string { namespace = "default" } - index := strings.Index(domain, ".") - - if index+1 == len(domain) { + if !strings.Contains(domain, ".svc.cluster.local.") { domain = domain + namespace + ".svc.cluster.local." log.Info().Msgf("*** Use in cluster dns address %s\n", domain) } - log.Info().Msgf("Format domain %s to %s\n", origin, domain) + log.Info().Msgf("Format domain %s to %s\n", origin, domain) return domain } @@ -68,18 +66,16 @@ func query(w dns.ResponseWriter, req *dns.Msg) (rr []dns.RR) { return } + msg := new(dns.Msg) + msg.RecursionDesired = true + qtype := req.Question[0].Qtype name := req.Question[0].Name - domain := getDomain(name) - - log.Info().Msgf("Received DNS query for %s: \n", domain) - msg := new(dns.Msg) + log.Info().Msgf("Received DNS query for %s: \n", domain) msg.SetQuestion(domain, qtype) - msg.RecursionDesired = true - - rr = exchange(domain, qtype, msg) + rr = exchange(domain, qtype, msg, name) return } @@ -98,7 +94,7 @@ func getResolvServer() (address string, err error) { return } -func exchange(domain string, Qtype uint16, m *dns.Msg) (rr []dns.RR) { +func exchange(domain string, Qtype uint16, m *dns.Msg, name string) (rr []dns.RR) { address, err := getResolvServer() if err != nil { log.Error().Msgf(err.Error()) @@ -119,6 +115,36 @@ func exchange(domain string, Qtype uint16, m *dns.Msg) (rr []dns.RR) { return } - rr = res.Answer + for _, item := range res.Answer { + log.Info().Msgf("response: %s", item.String()) + r, err := getAnswer(name, domain, item) + if err != nil { + return + } + rr = append(rr, r) + } + + return +} + +func getAnswer(name string, inClusterName string, acutal dns.RR) (tmp dns.RR, err error) { + var parts []string + if name != inClusterName { + log.Info().Msgf("origin %s query name is not same %s", inClusterName, name) + parts = append(parts, name) + + log.Info().Msgf("origin answer rr to %s", acutal.String()) + answer := strings.Split(acutal.String(), "\t") + + parts = append(parts, answer[1:]...) + rrStr := strings.Join(parts, " ") + log.Info().Msgf("rewrite rr to %s", rrStr) + tmp, err = dns.NewRR(rrStr) + if err != nil { + return + } + } else { + tmp = acutal + } return } diff --git a/pkg/proxy/daemon/dnsserver_test.go b/pkg/proxy/daemon/dnsserver_test.go new file mode 100644 index 00000000..ea9ca521 --- /dev/null +++ b/pkg/proxy/daemon/dnsserver_test.go @@ -0,0 +1,18 @@ +package daemon + +import ( + "testing" + "github.com/miekg/dns" +) + +func TestAnswerRewrite(t *testing.T) { + acutal, _ := dns.NewRR("tomcat.default.svc.cluster.local. 5 IN A 172.21.4.129") + r, err := getAnswer("tomcat.", "tomcat.default.svc.cluster.local.", acutal) + if err != nil { + t.Errorf("error") + return + } + if r.String() != "tomcat. 5 IN A 172.21.4.129" { + t.Errorf("error") + } +} \ No newline at end of file diff --git a/pkg/proxy/server/server.go b/pkg/proxy/server/server.go deleted file mode 100644 index 9e2297e1..00000000 --- a/pkg/proxy/server/server.go +++ /dev/null @@ -1,20 +0,0 @@ -package server - -import ( - "fmt" - - "github.com/alibaba/kt-connect/pkg/proxy/daemon" - "github.com/rs/zerolog/log" -) - -// Run start kt proxy -func Run() (err error) { - log.Info().Msg("Start kt connect proxy") - srv := daemon.NewDNSServerDefault() - err = srv.ListenAndServe() - if err != nil { - return - } - fmt.Printf("DNS Server Start At 53...\n") - return -}