From 1fd3889f21edff7ff895aca15008639fb3fe5ed3 Mon Sep 17 00:00:00 2001 From: PuerNya Date: Mon, 5 Feb 2024 02:42:15 +0800 Subject: [PATCH] fix: two fixes for fakeip stop storing fakeip into reversemapping force disable caching for fakeip transport --- route/router_dns.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/route/router_dns.go b/route/router_dns.go index 70244191..304af340 100644 --- a/route/router_dns.go +++ b/route/router_dns.go @@ -37,7 +37,7 @@ func (m *DNSReverseMapping) Query(address netip.Addr) (string, bool) { return domain, loaded } -func (r *Router) matchDNS(ctx context.Context, allowFakeIP bool, index int) (context.Context, dns.Transport, dns.DomainStrategy, adapter.DNSRule, int) { +func (r *Router) matchDNS(ctx context.Context, allowFakeIP bool, index int) (context.Context, dns.Transport, dns.DomainStrategy, adapter.DNSRule, int, bool) { metadata := adapter.ContextFrom(ctx) if metadata == nil { panic("no context") @@ -56,28 +56,29 @@ func (r *Router) matchDNS(ctx context.Context, allowFakeIP bool, index int) (con r.dnsLogger.ErrorContext(ctx, "transport not found: ", detour) continue } - if _, isFakeIP := transport.(adapter.FakeIPTransport); isFakeIP && !allowFakeIP { + _, isFakeIP := transport.(adapter.FakeIPTransport) + if isFakeIP && !allowFakeIP { continue } r.dnsLogger.DebugContext(ctx, "match[", ruleIndex, "] ", rule.String(), " => ", detour) - if rule.DisableCache() { + if isFakeIP || rule.DisableCache() { ctx = dns.ContextWithDisableCache(ctx, true) } if rewriteTTL := rule.RewriteTTL(); rewriteTTL != nil { ctx = dns.ContextWithRewriteTTL(ctx, *rewriteTTL) } if domainStrategy, dsLoaded := r.transportDomainStrategy[transport]; dsLoaded { - return ctx, transport, domainStrategy, rule, ruleIndex + return ctx, transport, domainStrategy, rule, ruleIndex, isFakeIP } else { - return ctx, transport, r.defaultDomainStrategy, rule, ruleIndex + return ctx, transport, r.defaultDomainStrategy, rule, ruleIndex, isFakeIP } } } } if domainStrategy, dsLoaded := r.transportDomainStrategy[r.defaultTransport]; dsLoaded { - return ctx, r.defaultTransport, domainStrategy, nil, -1 + return ctx, r.defaultTransport, domainStrategy, nil, -1, false } else { - return ctx, r.defaultTransport, r.defaultDomainStrategy, nil, -1 + return ctx, r.defaultTransport, r.defaultDomainStrategy, nil, -1, false } } @@ -88,6 +89,7 @@ func (r *Router) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, er var ( response *mDNS.Msg cached bool + isFakeIP bool err error ) response, cached = r.dnsClient.ExchangeCache(ctx, message) @@ -118,7 +120,7 @@ func (r *Router) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, er addressLimit bool ) - dnsCtx, transport, strategy, rule, ruleIndex = r.matchDNS(ctx, true, ruleIndex) + dnsCtx, transport, strategy, rule, ruleIndex, isFakeIP = r.matchDNS(ctx, true, ruleIndex) dnsCtx, cancel = context.WithTimeout(dnsCtx, C.DNSTimeout) if rule != nil && rule.WithAddressLimit() && isAddressQuery(message) { addressLimit = true @@ -145,7 +147,7 @@ func (r *Router) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, er } } } - if r.dnsReverseMapping != nil && len(message.Question) > 0 && response != nil && len(response.Answer) > 0 { + if !isFakeIP && r.dnsReverseMapping != nil && len(message.Question) > 0 && response != nil && len(response.Answer) > 0 { for _, answer := range response.Answer { switch record := answer.(type) { case *mDNS.A: @@ -179,7 +181,7 @@ func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainS ) metadata.ResetRuleCache() metadata.DestinationAddresses = nil - dnsCtx, transport, transportStrategy, rule, ruleIndex = r.matchDNS(ctx, false, ruleIndex) + dnsCtx, transport, transportStrategy, rule, ruleIndex, _ = r.matchDNS(ctx, false, ruleIndex) if strategy == dns.DomainStrategyAsIS { strategy = transportStrategy }