Browse Source

Add dns sniffer

世界 4 years ago
parent
commit
4736d3b844
2 changed files with 37 additions and 1 deletions
  1. 3 1
      app/dispatcher/sniffer.go
  2. 34 0
      common/protocol/dns/sniffer.go

+ 3 - 1
app/dispatcher/sniffer.go

@@ -6,6 +6,7 @@ import (
 	"github.com/v2fly/v2ray-core/v4/common"
 	"github.com/v2fly/v2ray-core/v4/common/net"
 	"github.com/v2fly/v2ray-core/v4/common/protocol/bittorrent"
+	"github.com/v2fly/v2ray-core/v4/common/protocol/dns"
 	"github.com/v2fly/v2ray-core/v4/common/protocol/http"
 	"github.com/v2fly/v2ray-core/v4/common/protocol/quic"
 	"github.com/v2fly/v2ray-core/v4/common/protocol/tls"
@@ -39,6 +40,7 @@ func NewSniffer(ctx context.Context) *Sniffer {
 			{func(c context.Context, b []byte) (SniffResult, error) { return quic.SniffQUIC(b) }, false, net.Network_UDP},
 			{func(c context.Context, b []byte) (SniffResult, error) { return bittorrent.SniffBittorrent(b) }, false, net.Network_TCP},
 			{func(c context.Context, b []byte) (SniffResult, error) { return bittorrent.SniffUTP(b) }, false, net.Network_UDP},
+			{func(c context.Context, b []byte) (SniffResult, error) { return dns.SniffDNS(b) }, false, net.Network_Unknown},
 		},
 	}
 	if sniffer, err := newFakeDNSSniffer(ctx); err == nil {
@@ -61,7 +63,7 @@ func (s *Sniffer) Sniff(c context.Context, payload []byte, network net.Network)
 		if si.metadataSniffer {
 			continue
 		}
-		if si.network != network {
+		if si.network != network && si.network != net.Network_Unknown {
 			continue
 		}
 		result, err := s(c, payload)

+ 34 - 0
common/protocol/dns/sniffer.go

@@ -0,0 +1,34 @@
+package dns
+
+import (
+	"golang.org/x/net/dns/dnsmessage"
+
+	"github.com/v2fly/v2ray-core/v4/common"
+	"github.com/v2fly/v2ray-core/v4/common/errors"
+)
+
+var errNotDNS = errors.New("not dns")
+
+type SniffHeader struct {
+	domain string
+}
+
+func (s *SniffHeader) Protocol() string {
+	return "dns"
+}
+
+func (s *SniffHeader) Domain() string {
+	return s.domain
+}
+
+func SniffDNS(b []byte) (*SniffHeader, error) {
+	var parser dnsmessage.Parser
+	if common.Error2(parser.Start(b)) != nil {
+		return nil, errNotDNS
+	}
+	question, err := parser.Question()
+	if err != nil {
+		return nil, errNotDNS
+	}
+	return &SniffHeader{domain: question.Name.String()}, nil
+}