From 09426dcd3626eb66fb4709952330d766a324bf9e Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 5 Dec 2024 17:06:06 +0700 Subject: [PATCH] cmd/cli: new flow for LAN hostname query If there is no explicit rules for LAN hostname queries, using OS resolver instead of forwarding requests to remote upstreams. --- cmd/cli/dns_proxy.go | 10 ++++++---- cmd/cli/dns_proxy_test.go | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/cmd/cli/dns_proxy.go b/cmd/cli/dns_proxy.go index f195f62..a69f5b5 100644 --- a/cmd/cli/dns_proxy.go +++ b/cmd/cli/dns_proxy.go @@ -456,7 +456,7 @@ func (p *prog) proxy(ctx context.Context, req *proxyRequest) *proxyResponse { res.clientInfo = true return res } - upstreams, upstreamConfigs = p.upstreamsAndUpstreamConfigForLanAndPtr(upstreams, upstreamConfigs) + upstreams, upstreamConfigs = p.upstreamsAndUpstreamConfigForPtr(upstreams, upstreamConfigs) ctrld.Log(ctx, mainLog.Load().Debug(), "private PTR lookup, using upstreams: %v", upstreams) case isLanHostnameQuery(req.msg): isLanOrPtrQuery = true @@ -465,7 +465,8 @@ func (p *prog) proxy(ctx context.Context, req *proxyRequest) *proxyResponse { res.clientInfo = true return res } - upstreams, upstreamConfigs = p.upstreamsAndUpstreamConfigForLanAndPtr(upstreams, upstreamConfigs) + upstreams = []string{upstreamOS} + upstreamConfigs = []*ctrld.UpstreamConfig{osUpstreamConfig} ctrld.Log(ctx, mainLog.Load().Debug(), "lan hostname lookup, using upstreams: %v", upstreams) default: ctrld.Log(ctx, mainLog.Load().Debug(), "no explicit policy matched, using default routing -> %v", upstreams) @@ -605,7 +606,7 @@ func (p *prog) proxy(ctx context.Context, req *proxyRequest) *proxyResponse { return res } -func (p *prog) upstreamsAndUpstreamConfigForLanAndPtr(upstreams []string, upstreamConfigs []*ctrld.UpstreamConfig) ([]string, []*ctrld.UpstreamConfig) { +func (p *prog) upstreamsAndUpstreamConfigForPtr(upstreams []string, upstreamConfigs []*ctrld.UpstreamConfig) ([]string, []*ctrld.UpstreamConfig) { if len(p.localUpstreams) > 0 { tmp := make([]string, 0, len(p.localUpstreams)+len(upstreams)) tmp = append(tmp, p.localUpstreams...) @@ -1060,7 +1061,8 @@ func isLanHostnameQuery(m *dns.Msg) bool { name := strings.TrimSuffix(q.Name, ".") return !strings.Contains(name, ".") || strings.HasSuffix(name, ".domain") || - strings.HasSuffix(name, ".lan") + strings.HasSuffix(name, ".lan") || + strings.HasSuffix(name, ".local") } // isSrvLookup reports whether DNS message is a SRV query. diff --git a/cmd/cli/dns_proxy_test.go b/cmd/cli/dns_proxy_test.go index 6e7a431..9deb9ed 100644 --- a/cmd/cli/dns_proxy_test.go +++ b/cmd/cli/dns_proxy_test.go @@ -365,6 +365,9 @@ func Test_isLanHostnameQuery(t *testing.T) { {"A not LAN", newDnsMsgWithHostname("example.com", dns.TypeA), false}, {"AAAA not LAN", newDnsMsgWithHostname("example.com", dns.TypeAAAA), false}, {"Not A or AAAA", newDnsMsgWithHostname("foo", dns.TypeTXT), false}, + {".domain", newDnsMsgWithHostname("foo.domain", dns.TypeA), true}, + {".lan", newDnsMsgWithHostname("foo.lan", dns.TypeA), true}, + {".local", newDnsMsgWithHostname("foo.local", dns.TypeA), true}, } for _, tc := range tests { tc := tc