From b92382b843e9fd5cfa68e0224d288b6666341b6d Mon Sep 17 00:00:00 2001 From: dyhkwong <50692134+dyhkwong@users.noreply.github.com> Date: Fri, 26 Apr 2024 23:08:52 +0800 Subject: [PATCH] fix fake IP mapping after fake IP pool runs out --- experimental/cachefile/fakeip.go | 13 +++++++++++++ route/router_dns.go | 2 +- transport/fakeip/memory.go | 7 +++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/experimental/cachefile/fakeip.go b/experimental/cachefile/fakeip.go index 1c387da8..8fe0f113 100644 --- a/experimental/cachefile/fakeip.go +++ b/experimental/cachefile/fakeip.go @@ -74,6 +74,7 @@ func (c *CacheFile) FakeIPStore(address netip.Addr, domain string) error { if err != nil { return err } + oldDomain := bucket.Get(address.AsSlice()) err = bucket.Put(address.AsSlice(), []byte(domain)) if err != nil { return err @@ -86,12 +87,24 @@ func (c *CacheFile) FakeIPStore(address netip.Addr, domain string) error { if err != nil { return err } + if oldDomain != nil { + if err := bucket.Delete(oldDomain); err != nil { + return err + } + } return bucket.Put([]byte(domain), address.AsSlice()) }) } func (c *CacheFile) FakeIPStoreAsync(address netip.Addr, domain string, logger logger.Logger) { c.saveFakeIPAccess.Lock() + if oldDomain, loaded := c.saveDomain[address]; loaded { + if address.Is4() { + delete(c.saveAddress4, oldDomain) + } else { + delete(c.saveAddress6, oldDomain) + } + } c.saveDomain[address] = domain if address.Is4() { c.saveAddress4[domain] = address diff --git a/route/router_dns.go b/route/router_dns.go index fee468fa..c3383e8b 100644 --- a/route/router_dns.go +++ b/route/router_dns.go @@ -65,7 +65,7 @@ func (r *Router) matchDNS(ctx context.Context, allowFakeIP bool, index int) (con ruleIndex += index + 1 } r.dnsLogger.DebugContext(ctx, "match[", ruleIndex, "] ", rule.String(), " => ", detour) - if (isFakeIP && !r.dnsIndependentCache) || rule.DisableCache() { + if isFakeIP || rule.DisableCache() { ctx = dns.ContextWithDisableCache(ctx, true) } if rewriteTTL := rule.RewriteTTL(); rewriteTTL != nil { diff --git a/transport/fakeip/memory.go b/transport/fakeip/memory.go index 0bca4910..1640ab34 100644 --- a/transport/fakeip/memory.go +++ b/transport/fakeip/memory.go @@ -40,6 +40,13 @@ func (s *MemoryStorage) FakeIPSaveMetadataAsync(metadata *adapter.FakeIPMetadata func (s *MemoryStorage) FakeIPStore(address netip.Addr, domain string) error { s.addressAccess.Lock() s.domainAccess.Lock() + if oldDomain, loaded := s.addressCache[address]; loaded { + if address.Is4() { + delete(s.domainCache4, oldDomain) + } else { + delete(s.domainCache6, oldDomain) + } + } s.addressCache[address] = domain if address.Is4() { s.domainCache4[domain] = address