From 213d80c1e2e285777872ea9cdb20df79c12e6ac7 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Wed, 28 May 2025 10:01:15 +0800 Subject: [PATCH] fix: quic sniffer should consider skipDomain --- component/sniffer/dispatcher.go | 29 ++++++++++++++++++++++------- component/sniffer/quic_sniffer.go | 21 +++++++++++---------- component/sniffer/sniff_test.go | 4 +++- constant/sniffer/sniffer.go | 4 +++- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/component/sniffer/dispatcher.go b/component/sniffer/dispatcher.go index 0f337101..eaf3401f 100644 --- a/component/sniffer/dispatcher.go +++ b/component/sniffer/dispatcher.go @@ -72,8 +72,16 @@ func (sd *Dispatcher) UDPSniff(packet C.PacketAdapter, packetSender C.PacketSend overrideDest := config.OverrideDest if inWhitelist { + replaceDomain := func(metadata *C.Metadata, host string) { + if sd.domainCanReplace(host) { + replaceDomain(metadata, host, overrideDest) + } else { + log.Debugln("[Sniffer] Skip sni[%s]", host) + } + } + if wrapable, ok := current.(sniffer.MultiPacketSniffer); ok { - return wrapable.WrapperSender(packetSender, overrideDest) + return wrapable.WrapperSender(packetSender, replaceDomain) } host, err := current.SniffData(packet.Data()) @@ -81,7 +89,7 @@ func (sd *Dispatcher) UDPSniff(packet C.PacketAdapter, packetSender C.PacketSend continue } - replaceDomain(metadata, host, overrideDest) + replaceDomain(metadata, host) return packetSender } } @@ -128,11 +136,9 @@ func (sd *Dispatcher) TCPSniff(conn *N.BufferedConn, metadata *C.Metadata) bool return false } - for _, matcher := range sd.skipDomain { - if matcher.MatchDomain(host) { - log.Debugln("[Sniffer] Skip sni[%s]", host) - return false - } + if !sd.domainCanReplace(host) { + log.Debugln("[Sniffer] Skip sni[%s]", host) + return false } sd.skipList.Delete(dst) @@ -157,6 +163,15 @@ func replaceDomain(metadata *C.Metadata, host string, overrideDest bool) { metadata.DNSMode = C.DNSNormal } +func (sd *Dispatcher) domainCanReplace(host string) bool { + for _, matcher := range sd.skipDomain { + if matcher.MatchDomain(host) { + return false + } + } + return true +} + func (sd *Dispatcher) Enable() bool { return sd != nil && sd.enable } diff --git a/component/sniffer/quic_sniffer.go b/component/sniffer/quic_sniffer.go index 38fa7568..f0a99578 100644 --- a/component/sniffer/quic_sniffer.go +++ b/component/sniffer/quic_sniffer.go @@ -74,22 +74,23 @@ func (sniffer *QuicSniffer) SniffData(b []byte) (string, error) { return "", ErrorUnsupportedSniffer } -func (sniffer *QuicSniffer) WrapperSender(packetSender constant.PacketSender, override bool) constant.PacketSender { +func (sniffer *QuicSniffer) WrapperSender(packetSender constant.PacketSender, replaceDomain sniffer.ReplaceDomain) constant.PacketSender { return &quicPacketSender{ - PacketSender: packetSender, - chClose: make(chan struct{}), - override: override, + PacketSender: packetSender, + replaceDomain: replaceDomain, + chClose: make(chan struct{}), } } var _ constant.PacketSender = (*quicPacketSender)(nil) type quicPacketSender struct { - lock sync.RWMutex - ranges utils.IntRanges[uint64] - buffer []byte - result *string - override bool + lock sync.RWMutex + ranges utils.IntRanges[uint64] + buffer []byte + result *string + + replaceDomain sniffer.ReplaceDomain constant.PacketSender @@ -123,7 +124,7 @@ func (q *quicPacketSender) DoSniff(metadata *constant.Metadata) error { q.lock.RLock() if q.result != nil { host := *q.result - replaceDomain(metadata, host, q.override) + q.replaceDomain(metadata, host) } q.lock.RUnlock() break diff --git a/component/sniffer/sniff_test.go b/component/sniffer/sniff_test.go index 6a535646..f911b209 100644 --- a/component/sniffer/sniff_test.go +++ b/component/sniffer/sniff_test.go @@ -78,7 +78,9 @@ func testQuicSniffer(data []string, async bool) (string, string, error) { resultCh := make(chan *constant.Metadata, 1) emptySender := &fakeSender{} - sender := q.WrapperSender(emptySender, true) + sender := q.WrapperSender(emptySender, func(metadata *constant.Metadata, host string) { + replaceDomain(metadata, host, true) + }) go func() { meta := constant.Metadata{Host: fakeHost} diff --git a/constant/sniffer/sniffer.go b/constant/sniffer/sniffer.go index 8de4b896..7418b673 100644 --- a/constant/sniffer/sniffer.go +++ b/constant/sniffer/sniffer.go @@ -10,8 +10,10 @@ type Sniffer interface { SupportPort(port uint16) bool } +type ReplaceDomain func(metadata *constant.Metadata, host string) + type MultiPacketSniffer interface { - WrapperSender(packetSender constant.PacketSender, override bool) constant.PacketSender + WrapperSender(packetSender constant.PacketSender, replaceDomain ReplaceDomain) constant.PacketSender } const (