Skip to content

Commit

Permalink
Merge pull request #2212 from mzz2017/master
Browse files Browse the repository at this point in the history
DoH性能问题、DoH下AAAA重新过滤、DNS查询分组订阅
  • Loading branch information
kslr committed Feb 5, 2020
2 parents 5dd8571 + be9ce7f commit e164596
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 14 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
*.DS_Store
bazel-*
.idea
54 changes: 46 additions & 8 deletions app/dns/dohdns.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"sync"
"sync/atomic"
"time"
dns_feature "v2ray.com/core/features/dns"

"golang.org/x/net/dns/dnsmessage"
"v2ray.com/core/common"
Expand Down Expand Up @@ -185,7 +186,6 @@ func (s *DoHNameServer) Cleanup() error {

func (s *DoHNameServer) updateIP(req *dnsRequest, ipRec *IPRecord) {
elapsed := time.Since(req.start)
newError(s.name, " got answere: ", req.domain, " ", req.reqType, " -> ", ipRec.IP, " ", elapsed).AtInfo().WriteToLog()

s.Lock()
rec := s.ips[req.domain]
Expand All @@ -198,17 +198,29 @@ func (s *DoHNameServer) updateIP(req *dnsRequest, ipRec *IPRecord) {
updated = true
}
case dnsmessage.TypeAAAA:
addr := make([]net.Address, 0)
for _, ip := range ipRec.IP {
if len(ip.IP()) == net.IPv6len {
addr = append(addr, ip)
}
}
ipRec.IP = addr
if isNewer(rec.AAAA, ipRec) {
rec.AAAA = ipRec
updated = true
}
}
newError(s.name, " got answere: ", req.domain, " ", req.reqType, " -> ", ipRec.IP, " ", elapsed).AtInfo().WriteToLog()

if updated {
s.ips[req.domain] = rec
s.pub.Publish(req.domain, nil)
}

switch req.reqType {
case dnsmessage.TypeA:
s.pub.Publish(req.domain+"4", nil)
case dnsmessage.TypeAAAA:
s.pub.Publish(req.domain+"6", nil)
}
s.Unlock()
common.Must(s.cleanup.Start())
}
Expand Down Expand Up @@ -329,12 +341,15 @@ func (s *DoHNameServer) findIPsForDomain(domain string, option IPOption) ([]net.
return nil, lastErr
}

if (option.IPv4Enable && record.A != nil) || (option.IPv6Enable && record.AAAA != nil) {
return nil, dns_feature.ErrEmptyResponse
}

return nil, errRecordNotFound
}

// QueryIP is called from dns.Server->queryIPTimeout
func (s *DoHNameServer) QueryIP(ctx context.Context, domain string, option IPOption) ([]net.IP, error) {

fqdn := Fqdn(domain)

ips, err := s.findIPsForDomain(fqdn, option)
Expand All @@ -343,9 +358,32 @@ func (s *DoHNameServer) QueryIP(ctx context.Context, domain string, option IPOpt
return ips, err
}

sub := s.pub.Subscribe(fqdn)
defer sub.Close()

// ipv4 and ipv6 belong to different subscription groups
var sub4, sub6 *pubsub.Subscriber
if option.IPv4Enable {
sub4 = s.pub.Subscribe(fqdn + "4")
defer sub4.Close()
}
if option.IPv6Enable {
sub6 = s.pub.Subscribe(fqdn + "6")
defer sub6.Close()
}
done := make(chan interface{})
go func() {
if sub4 != nil {
select {
case <-sub4.Wait():
case <-ctx.Done():
}
}
if sub6 != nil {
select {
case <-sub6.Wait():
case <-ctx.Done():
}
}
close(done)
}()
s.sendQuery(ctx, fqdn, option)

for {
Expand All @@ -357,7 +395,7 @@ func (s *DoHNameServer) QueryIP(ctx context.Context, domain string, option IPOpt
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-sub.Wait():
case <-done:
}
}
}
39 changes: 33 additions & 6 deletions app/dns/udpns.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,13 @@ func (s *ClassicNameServer) updateIP(domain string, newRec record) {

if updated {
s.ips[domain] = rec
s.pub.Publish(domain, nil)
}

if newRec.A != nil {
s.pub.Publish(domain+"4", nil)
}
if newRec.AAAA != nil {
s.pub.Publish(domain+"6", nil)
}
s.Unlock()
common.Must(s.cleanup.Start())
}
Expand Down Expand Up @@ -245,9 +249,32 @@ func (s *ClassicNameServer) QueryIP(ctx context.Context, domain string, option I
return ips, err
}

sub := s.pub.Subscribe(fqdn)
defer sub.Close()

// ipv4 and ipv6 belong to different subscription groups
var sub4, sub6 *pubsub.Subscriber
if option.IPv4Enable {
sub4 = s.pub.Subscribe(fqdn + "4")
defer sub4.Close()
}
if option.IPv6Enable {
sub6 = s.pub.Subscribe(fqdn + "6")
defer sub6.Close()
}
done := make(chan interface{})
go func() {
if sub4 != nil {
select {
case <-sub4.Wait():
case <-ctx.Done():
}
}
if sub6 != nil {
select {
case <-sub6.Wait():
case <-ctx.Done():
}
}
close(done)
}()
s.sendQuery(ctx, fqdn, option)

for {
Expand All @@ -259,7 +286,7 @@ func (s *ClassicNameServer) QueryIP(ctx context.Context, domain string, option I
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-sub.Wait():
case <-done:
}
}
}

0 comments on commit e164596

Please sign in to comment.