Improve fake-ip dual stack behavior

This commit is contained in:
世界 2023-07-23 14:40:59 +08:00
parent 8d629ef323
commit ec0fa4781f
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
2 changed files with 20 additions and 2 deletions

View File

@ -69,6 +69,7 @@ type Router struct {
transportDomainStrategy map[dns.Transport]dns.DomainStrategy transportDomainStrategy map[dns.Transport]dns.DomainStrategy
dnsReverseMapping *DNSReverseMapping dnsReverseMapping *DNSReverseMapping
fakeIPStore adapter.FakeIPStore fakeIPStore adapter.FakeIPStore
fakeIPDualStack bool
interfaceFinder myInterfaceFinder interfaceFinder myInterfaceFinder
autoDetectInterface bool autoDetectInterface bool
defaultInterface string defaultInterface string
@ -253,6 +254,7 @@ func NewRouter(
inet6Range = fakeIPOptions.Inet6Range.Build() inet6Range = fakeIPOptions.Inet6Range.Build()
} }
router.fakeIPStore = fakeip.NewStore(router, router.logger, inet4Range, inet6Range) router.fakeIPStore = fakeip.NewStore(router, router.logger, inet4Range, inet6Range)
router.fakeIPDualStack = inet4Range.IsValid() && inet6Range.IsValid()
} }
usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor() usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor()

View File

@ -63,14 +63,14 @@ func (r *Router) matchDNS(ctx context.Context) (context.Context, dns.Transport,
if domainStrategy, dsLoaded := r.transportDomainStrategy[transport]; dsLoaded { if domainStrategy, dsLoaded := r.transportDomainStrategy[transport]; dsLoaded {
return ctx, transport, domainStrategy return ctx, transport, domainStrategy
} else { } else {
return ctx, transport, r.defaultDomainStrategy return ctx, transport, dns.DomainStrategyAsIS
} }
} }
} }
if domainStrategy, dsLoaded := r.transportDomainStrategy[r.defaultTransport]; dsLoaded { if domainStrategy, dsLoaded := r.transportDomainStrategy[r.defaultTransport]; dsLoaded {
return ctx, r.defaultTransport, domainStrategy return ctx, r.defaultTransport, domainStrategy
} else { } else {
return ctx, r.defaultTransport, r.defaultDomainStrategy return ctx, r.defaultTransport, dns.DomainStrategyAsIS
} }
} }
@ -128,6 +128,22 @@ func (r *Router) Lookup(ctx context.Context, domain string, strategy dns.DomainS
if strategy == dns.DomainStrategyAsIS { if strategy == dns.DomainStrategyAsIS {
strategy = transportStrategy strategy = transportStrategy
} }
if strategy == dns.DomainStrategyAsIS {
switch r.defaultDomainStrategy {
case dns.DomainStrategyUseIPv4, dns.DomainStrategyUseIPv6:
strategy = r.defaultDomainStrategy
}
}
if strategy == dns.DomainStrategyAsIS && metadata.FakeIP && r.fakeIPDualStack {
if metadata.IPVersion == 4 {
strategy = dns.DomainStrategyUseIPv4
} else if metadata.IPVersion == 6 {
strategy = dns.DomainStrategyPreferIPv6
}
}
if strategy == dns.DomainStrategyAsIS {
strategy = r.defaultDomainStrategy
}
ctx, cancel := context.WithTimeout(ctx, C.DNSTimeout) ctx, cancel := context.WithTimeout(ctx, C.DNSTimeout)
defer cancel() defer cancel()
addrs, err := r.dnsClient.Lookup(ctx, transport, domain, strategy) addrs, err := r.dnsClient.Lookup(ctx, transport, domain, strategy)