Fix: only rule mode need break conn when sni update
This commit is contained in:
parent
6327cf7434
commit
46f7c5e565
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user