|  | @@ -2,31 +2,34 @@ package dns
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"context"
 | 
	
		
			
				|  |  | -	"time"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/net"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -var (
 | 
	
		
			
				|  |  | -	multiQuestionDNS = map[net.Address]bool{
 | 
	
		
			
				|  |  | -		net.IPAddress([]byte{8, 8, 8, 8}): true,
 | 
	
		
			
				|  |  | -		net.IPAddress([]byte{8, 8, 4, 4}): true,
 | 
	
		
			
				|  |  | -		net.IPAddress([]byte{9, 9, 9, 9}): true,
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -type ARecord struct {
 | 
	
		
			
				|  |  | -	IPs    []net.IP
 | 
	
		
			
				|  |  | -	Expire time.Time
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  type NameServer interface {
 | 
	
		
			
				|  |  |  	QueryIP(ctx context.Context, domain string) ([]net.IP, error)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type LocalNameServer struct {
 | 
	
		
			
				|  |  | +	resolver net.Resolver
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (*LocalNameServer) QueryIP(ctx context.Context, domain string) ([]net.IP, error) {
 | 
	
		
			
				|  |  | -	return net.LookupIP(domain)
 | 
	
		
			
				|  |  | +func (s *LocalNameServer) QueryIP(ctx context.Context, domain string) ([]net.IP, error) {
 | 
	
		
			
				|  |  | +	ipAddr, err := s.resolver.LookupIPAddr(ctx, domain)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	var ips []net.IP
 | 
	
		
			
				|  |  | +	for _, addr := range ipAddr {
 | 
	
		
			
				|  |  | +		ips = append(ips, addr.IP)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return ips, nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func NewLocalNameServer() *LocalNameServer {
 | 
	
		
			
				|  |  | +	return &LocalNameServer{
 | 
	
		
			
				|  |  | +		resolver: net.Resolver{
 | 
	
		
			
				|  |  | +			PreferGo: true,
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 |