mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-07-18 17:08:06 +08:00
fix: quic sniffer should consider skipDomain
This commit is contained in:
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
@ -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 (
|
||||
|
Reference in New Issue
Block a user