github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/app/dns/nameserver_fakedns.go (about) 1 //go:build !confonly 2 // +build !confonly 3 4 package dns 5 6 import ( 7 "context" 8 9 core "github.com/v2fly/v2ray-core/v5" 10 "github.com/v2fly/v2ray-core/v5/common/net" 11 "github.com/v2fly/v2ray-core/v5/features/dns" 12 ) 13 14 type FakeDNSServer struct { 15 fakeDNSEngine dns.FakeDNSEngine 16 } 17 18 func NewFakeDNSServer(fakeDNSEngine dns.FakeDNSEngine) *FakeDNSServer { 19 return &FakeDNSServer{fakeDNSEngine: fakeDNSEngine} 20 } 21 22 func (FakeDNSServer) Name() string { 23 return "fakedns" 24 } 25 26 func (f *FakeDNSServer) QueryIP(ctx context.Context, domain string, _ net.IP, opt dns.IPOption, _ bool) ([]net.IP, error) { 27 if !opt.FakeEnable { 28 return nil, nil // Returning empty ip record with no error will continue DNS lookup, effectively indicating that this server is disabled. 29 } 30 if f.fakeDNSEngine == nil { 31 if err := core.RequireFeatures(ctx, func(fd dns.FakeDNSEngine) { 32 f.fakeDNSEngine = fd 33 }); err != nil { 34 return nil, newError("Unable to locate a fake DNS Engine").Base(err).AtError() 35 } 36 } 37 var ips []net.Address 38 if fkr0, ok := f.fakeDNSEngine.(dns.FakeDNSEngineRev0); ok { 39 ips = fkr0.GetFakeIPForDomain3(domain, opt.IPv4Enable, opt.IPv6Enable) 40 } else { 41 ips = filterIP(f.fakeDNSEngine.GetFakeIPForDomain(domain), opt) 42 } 43 44 netIP, err := toNetIP(ips) 45 if err != nil { 46 return nil, newError("Unable to convert IP to net ip").Base(err).AtError() 47 } 48 49 newError(f.Name(), " got answer: ", domain, " -> ", ips).AtInfo().WriteToLog() 50 51 if len(netIP) > 0 { 52 return netIP, nil 53 } 54 return nil, dns.ErrEmptyResponse 55 } 56 57 func isFakeDNS(server Server) bool { 58 _, ok := server.(*FakeDNSServer) 59 return ok 60 }