Fix: only rule mode need break conn when sni update

This commit is contained in:
Author: littoy 2022-04-15 00:46:07 +08:00 committed by yaling888
parent 6327cf7434
commit 46f7c5e565
3 changed files with 11 additions and 5 deletions

View File

@ -16,6 +16,7 @@ type sniffing struct {
metadata *C.Metadata metadata *C.Metadata
totalWrite *atomic.Uint64 totalWrite *atomic.Uint64
allowBreak bool
} }
func (r *sniffing) Read(b []byte) (int, error) { func (r *sniffing) Read(b []byte) (int, error) {
@ -30,8 +31,12 @@ func (r *sniffing) Write(b []byte) (int, error) {
} else { } else {
resolver.InsertHostByIP(r.metadata.DstIP, header.Domain()) resolver.InsertHostByIP(r.metadata.DstIP, header.Domain())
log.Warnln("use sni update host: %s ip: %s", header.Domain(), r.metadata.DstIP.String()) log.Warnln("use sni update host: %s ip: %s", header.Domain(), r.metadata.DstIP.String())
r.Conn.Close() if r.allowBreak {
return 0, errors.New("sni update, break current link to avoid leaks") r.Conn.Close()
return 0, errors.New("sni update, break current link to avoid leaks")
} else {
r.metadata.Host = header.Domain()
}
} }
} }
@ -45,10 +50,11 @@ func (r *sniffing) Close() error {
return r.Conn.Close() return r.Conn.Close()
} }
func NewSniffing(conn C.Conn, metadata *C.Metadata) C.Conn { func NewSniffing(conn C.Conn, metadata *C.Metadata, rule C.Rule) C.Conn {
return &sniffing{ return &sniffing{
Conn: conn, Conn: conn,
metadata: metadata, metadata: metadata,
totalWrite: atomic.NewUint64(0), totalWrite: atomic.NewUint64(0),
allowBreak: rule != nil,
} }
} }

View File

@ -80,7 +80,7 @@ func NewTCPTracker(conn C.Conn, manager *Manager, metadata *C.Metadata, rule C.R
} }
manager.Join(t) manager.Join(t)
return NewSniffing(t, metadata) return NewSniffing(t, metadata, rule)
} }
type udpTracker struct { type udpTracker struct {

View File

@ -303,7 +303,7 @@ func handleTCPConn(connCtx C.ConnContext) {
defer cancel() defer cancel()
if MitmOutbound != nil && metadata.Type != C.MITM { if MitmOutbound != nil && metadata.Type != C.MITM {
if remoteConn, err1 := MitmOutbound.DialContext(ctx, metadata); err1 == nil { if remoteConn, err1 := MitmOutbound.DialContext(ctx, metadata); err1 == nil {
remoteConn = statistic.NewSniffing(remoteConn, metadata) remoteConn = statistic.NewSniffing(remoteConn, metadata, nil)
defer func(remoteConn C.Conn) { defer func(remoteConn C.Conn) {
_ = remoteConn.Close() _ = remoteConn.Close()
}(remoteConn) }(remoteConn)