diff --git a/app/dns/nameserver.go b/app/dns/nameserver.go index 38addb238..a0d889ff2 100644 --- a/app/dns/nameserver.go +++ b/app/dns/nameserver.go @@ -156,3 +156,27 @@ func (this *UDPNameServer) QueryA(domain string) <-chan *ARecord { return response } + +type LocalNameServer struct { +} + +func (this *LocalNameServer) QueryA(domain string) <-chan *ARecord { + response := make(chan *ARecord) + + go func() { + defer close(response) + + ips, err := net.LookupIP(domain) + if err != nil { + log.Info("DNS: Failed to lookup IPs for domain ", domain) + return + } + + response <- &ARecord{ + IPs: ips, + Expire: time.Now().Add(time.Second * time.Duration(DefaultTTL)), + } + }() + + return response +} diff --git a/app/dns/server.go b/app/dns/server.go index 4db5f03e6..4f6834a73 100644 --- a/app/dns/server.go +++ b/app/dns/server.go @@ -32,7 +32,11 @@ func NewCacheServer(space app.Space, config *Config) *CacheServer { } dispatcher := space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) for idx, ns := range config.NameServers { - server.servers[idx] = NewUDPNameServer(ns, dispatcher) + if ns.Address().IsDomain() && ns.Address().Domain() == "localhost" { + server.servers[idx] = &LocalNameServer{} + } else { + server.servers[idx] = NewUDPNameServer(ns, dispatcher) + } } return server } diff --git a/shell/point/config_json.go b/shell/point/config_json.go index 72ca2ca79..fc319ffea 100644 --- a/shell/point/config_json.go +++ b/shell/point/config_json.go @@ -40,6 +40,13 @@ func (this *Config) UnmarshalJSON(data []byte) error { this.OutboundConfig = jsonConfig.OutboundConfig this.InboundDetours = jsonConfig.InboundDetours this.OutboundDetours = jsonConfig.OutboundDetours + if jsonConfig.DNSConfig == nil { + jsonConfig.DNSConfig = &dns.Config{ + NameServers: []v2net.Destination{ + v2net.UDPDestination(v2net.DomainAddress("localhost"), v2net.Port(53)), + }, + } + } this.DNSConfig = jsonConfig.DNSConfig return nil }