|  | @@ -2,31 +2,34 @@ package dns
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import (
 |  |  import (
 | 
											
												
													
														|  |  	"context"
 |  |  	"context"
 | 
											
												
													
														|  | -	"time"
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	"v2ray.com/core/common/net"
 |  |  	"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 {
 |  |  type NameServer interface {
 | 
											
												
													
														|  |  	QueryIP(ctx context.Context, domain string) ([]net.IP, error)
 |  |  	QueryIP(ctx context.Context, domain string) ([]net.IP, error)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  type LocalNameServer struct {
 |  |  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,
 | 
											
												
													
														|  | 
 |  | +		},
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  |  }
 |  |  }
 |