diff --git a/adapter/inbound.go b/adapter/inbound.go index 1218c049..d55fc9cd 100644 --- a/adapter/inbound.go +++ b/adapter/inbound.go @@ -55,6 +55,7 @@ type InboundContext struct { Protocol string Domain string + SniffDomain string Client string SniffContext any PacketSniffError error diff --git a/common/sniff/http.go b/common/sniff/http.go index 012f2c99..f5d2788d 100644 --- a/common/sniff/http.go +++ b/common/sniff/http.go @@ -23,6 +23,6 @@ func HTTPHost(_ context.Context, metadata *adapter.InboundContext, reader io.Rea } } metadata.Protocol = C.ProtocolHTTP - metadata.Domain = M.ParseSocksaddr(request.Host).AddrString() + metadata.SniffDomain = M.ParseSocksaddr(request.Host).AddrString() return nil } diff --git a/common/sniff/http_test.go b/common/sniff/http_test.go index 9f64efa8..965bcd5a 100644 --- a/common/sniff/http_test.go +++ b/common/sniff/http_test.go @@ -17,7 +17,7 @@ func TestSniffHTTP1(t *testing.T) { var metadata adapter.InboundContext err := sniff.HTTPHost(context.Background(), &metadata, strings.NewReader(pkt)) require.NoError(t, err) - require.Equal(t, metadata.Domain, "www.google.com") + require.Equal(t, metadata.SniffDomain, "www.google.com") } func TestSniffHTTP1WithPort(t *testing.T) { @@ -26,5 +26,5 @@ func TestSniffHTTP1WithPort(t *testing.T) { var metadata adapter.InboundContext err := sniff.HTTPHost(context.Background(), &metadata, strings.NewReader(pkt)) require.NoError(t, err) - require.Equal(t, metadata.Domain, "www.gov.cn") + require.Equal(t, metadata.SniffDomain, "www.gov.cn") } diff --git a/common/sniff/quic.go b/common/sniff/quic.go index 4c2e667c..b8621bf7 100644 --- a/common/sniff/quic.go +++ b/common/sniff/quic.go @@ -308,7 +308,7 @@ find: metadata.SniffContext = fragments return E.Cause1(ErrNeedMoreData, err) } - metadata.Domain = fingerprint.ServerName + metadata.SniffDomain = fingerprint.ServerName for metadata.Client == "" { if len(frameTypeList) == 1 { metadata.Client = C.ClientFirefox diff --git a/common/sniff/quic_test.go b/common/sniff/quic_test.go index 1149f68e..96f28ae3 100644 --- a/common/sniff/quic_test.go +++ b/common/sniff/quic_test.go @@ -29,7 +29,7 @@ func TestSniffQUICChromeNew(t *testing.T) { require.NoError(t, err) err = sniff.QUICClientHello(context.Background(), &metadata, pkt) require.NoError(t, err) - require.Equal(t, "www.google.com", metadata.Domain) + require.Equal(t, "www.google.com", metadata.SniffDomain) } func TestSniffQUICChromium(t *testing.T) { @@ -45,7 +45,7 @@ func TestSniffQUICChromium(t *testing.T) { require.NoError(t, err) err = sniff.QUICClientHello(context.Background(), &metadata, pkt) require.NoError(t, err) - require.Equal(t, metadata.Domain, "google.com") + require.Equal(t, metadata.SniffDomain, "google.com") } func TestSniffUQUICChrome115(t *testing.T) { @@ -57,7 +57,7 @@ func TestSniffUQUICChrome115(t *testing.T) { require.NoError(t, err) require.Equal(t, metadata.Protocol, C.ProtocolQUIC) require.Equal(t, metadata.Client, C.ClientQUICGo) - require.Equal(t, metadata.Domain, "www.google.com") + require.Equal(t, metadata.SniffDomain, "www.google.com") } func TestSniffQUICFirefox(t *testing.T) { @@ -69,7 +69,7 @@ func TestSniffQUICFirefox(t *testing.T) { require.NoError(t, err) require.Equal(t, metadata.Protocol, C.ProtocolQUIC) require.Equal(t, metadata.Client, C.ClientFirefox) - require.Equal(t, metadata.Domain, "www.google.com") + require.Equal(t, metadata.SniffDomain, "www.google.com") } func TestSniffQUICSafari(t *testing.T) { @@ -81,7 +81,7 @@ func TestSniffQUICSafari(t *testing.T) { require.NoError(t, err) require.Equal(t, metadata.Protocol, C.ProtocolQUIC) require.Equal(t, metadata.Client, C.ClientSafari) - require.Equal(t, metadata.Domain, "www.google.com") + require.Equal(t, metadata.SniffDomain, "www.google.com") } func FuzzSniffQUIC(f *testing.F) { diff --git a/common/sniff/tls.go b/common/sniff/tls.go index 613086e8..ed79b63e 100644 --- a/common/sniff/tls.go +++ b/common/sniff/tls.go @@ -22,7 +22,7 @@ func TLSClientHello(ctx context.Context, metadata *adapter.InboundContext, reade }).HandshakeContext(ctx) if clientHello != nil { metadata.Protocol = C.ProtocolTLS - metadata.Domain = clientHello.ServerName + metadata.SniffDomain = clientHello.ServerName return nil } if errors.Is(err, io.ErrUnexpectedEOF) { diff --git a/experimental/clashapi/trafficontrol/tracker.go b/experimental/clashapi/trafficontrol/tracker.go index 342c7403..b2257b68 100644 --- a/experimental/clashapi/trafficontrol/tracker.go +++ b/experimental/clashapi/trafficontrol/tracker.go @@ -5,7 +5,6 @@ import ( "time" "github.com/sagernet/sing-box/adapter" - C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/atomic" "github.com/sagernet/sing/common/bufio" @@ -48,11 +47,8 @@ func (t TrackerMetadata) MarshalJSON() ([]byte, error) { if t.Metadata.Client != "" { sniffURL += ":" + t.Metadata.Client } - if t.Metadata.Domain != "" { - switch t.Metadata.Protocol { - case C.ProtocolHTTP, C.ProtocolQUIC, C.ProtocolTLS: - sniffURL += "://" + t.Metadata.Domain - } + if t.Metadata.SniffDomain != "" { + sniffURL += "://" + t.Metadata.SniffDomain } } var processPath string diff --git a/route/route.go b/route/route.go index 38f07412..b6ac27ca 100644 --- a/route/route.go +++ b/route/route.go @@ -526,6 +526,9 @@ func (r *Router) actionSniff( streamSniffers..., ) if err == nil { + if metadata.SniffDomain != "" { + metadata.Domain = metadata.SniffDomain + } //goland:noinspection GoDeprecation if action.OverrideDestination && M.IsDomainName(metadata.Domain) { metadata.Destination = M.Socksaddr{ @@ -533,10 +536,10 @@ func (r *Router) actionSniff( Port: metadata.Destination.Port, } } - if metadata.Domain != "" && metadata.Client != "" { - r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain, ", client: ", metadata.Client) - } else if metadata.Domain != "" { - r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain) + if metadata.SniffDomain != "" && metadata.Client != "" { + r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.SniffDomain, ", client: ", metadata.Client) + } else if metadata.SniffDomain != "" { + r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.SniffDomain) } else { r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol) } @@ -623,6 +626,9 @@ func (r *Router) actionSniff( continue } if metadata.Protocol != "" { + if metadata.SniffDomain != "" { + metadata.Domain = metadata.SniffDomain + } //goland:noinspection GoDeprecation if action.OverrideDestination && M.IsDomainName(metadata.Domain) { metadata.Destination = M.Socksaddr{ @@ -630,10 +636,10 @@ func (r *Router) actionSniff( Port: metadata.Destination.Port, } } - if metadata.Domain != "" && metadata.Client != "" { - r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain, ", client: ", metadata.Client) - } else if metadata.Domain != "" { - r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain) + if metadata.SniffDomain != "" && metadata.Client != "" { + r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.SniffDomain, ", client: ", metadata.Client) + } else if metadata.SniffDomain != "" { + r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.SniffDomain) } else if metadata.Client != "" { r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", client: ", metadata.Client) } else {