Browse Source

added fake dns + others matching logic

Shelikhoo 4 years ago
parent
commit
488f9845c6
4 changed files with 25 additions and 5 deletions
  1. 5 0
      app/dispatcher/default.go
  2. 12 3
      app/dispatcher/fakednssniffer.go
  3. 6 2
      app/dispatcher/sniffer.go
  4. 2 0
      infra/conf/v2ray.go

+ 5 - 0
app/dispatcher/default.go

@@ -186,6 +186,11 @@ func shouldOverride(result SniffResult, domainOverride []string) bool {
 		if strings.HasPrefix(protocolString, p) {
 			return true
 		}
+		if resultSubset, ok := result.(SnifferIsProtoSubsetOf); ok {
+			if resultSubset.IsProtoSubsetOf(p) {
+				return true
+			}
+		}
 	}
 	return false
 }

+ 12 - 3
app/dispatcher/fakednssniffer.go

@@ -4,6 +4,7 @@ package dispatcher
 
 import (
 	"context"
+	"strings"
 
 	core "github.com/v2fly/v2ray-core/v4"
 	"github.com/v2fly/v2ray-core/v4/common"
@@ -68,7 +69,15 @@ type ipAddressInRangeOpt struct {
 }
 
 type DNSThenOthersSniffResult struct {
-	domainName string
+	domainName           string
+	protocolOriginalName string
+}
+
+func (f DNSThenOthersSniffResult) IsProtoSubsetOf(protocolName string) bool {
+	if strings.HasPrefix(protocolName, f.protocolOriginalName) {
+		return true
+	}
+	return false
 }
 
 func (DNSThenOthersSniffResult) Protocol() string {
@@ -93,7 +102,7 @@ func newFakeDNSThenOthers(ctx context.Context, fakeDNSSniffer protocolSnifferWit
 					for _, v := range others {
 						if v.metadataSniffer || bytes != nil {
 							if result, err := v.protocolSniffer(ctx, bytes); err == nil {
-								return DNSThenOthersSniffResult{result.Domain()}, nil
+								return DNSThenOthersSniffResult{domainName: result.Domain(), protocolOriginalName: result.Protocol()}, nil
 							}
 						}
 					}
@@ -107,6 +116,6 @@ func newFakeDNSThenOthers(ctx context.Context, fakeDNSSniffer protocolSnifferWit
 				return nil, common.ErrNoClue
 			}
 		},
-		metadataSniffer: true,
+		metadataSniffer: false,
 	}, nil
 }

+ 6 - 2
app/dispatcher/sniffer.go

@@ -42,8 +42,8 @@ func NewSniffer(ctx context.Context) *Sniffer {
 		others := ret.sniffer
 		ret.sniffer = append(ret.sniffer, sniffer)
 		fakeDNSThenOthers, err := newFakeDNSThenOthers(ctx, sniffer, others)
-		if err != nil {
-			ret.sniffer = append(ret.sniffer, fakeDNSThenOthers)
+		if err == nil {
+			ret.sniffer = append([]protocolSnifferWithMetadata{fakeDNSThenOthers}, ret.sniffer...)
 		}
 	}
 	return ret
@@ -128,3 +128,7 @@ func (c compositeResult) ProtocolForDomainResult() string {
 type SnifferResultComposite interface {
 	ProtocolForDomainResult() string
 }
+
+type SnifferIsProtoSubsetOf interface {
+	IsProtoSubsetOf(protocolName string) bool
+}

+ 2 - 0
infra/conf/v2ray.go

@@ -75,6 +75,8 @@ func (c *SniffingConfig) Build() (*proxyman.SniffingConfig, error) {
 				p = append(p, "tls")
 			case "fakedns":
 				p = append(p, "fakedns")
+			case "fakedns+others":
+				p = append(p, "fakedns+others")
 			default:
 				return nil, newError("unknown protocol: ", domainOverride)
 			}