Feature: make tls sni sniffing switch config
This commit is contained in:
@@ -26,11 +26,9 @@ func (r *sniffing) Read(b []byte) (int, error) {
|
||||
func (r *sniffing) Write(b []byte) (int, error) {
|
||||
if r.totalWrite.Load() < 128 && r.metadata.Host == "" && (r.metadata.DstPort == "443" || r.metadata.DstPort == "8443" || r.metadata.DstPort == "993" || r.metadata.DstPort == "465" || r.metadata.DstPort == "995") {
|
||||
header, err := tls.SniffTLS(b)
|
||||
if err != nil {
|
||||
// log.Errorln("Expect no error but actually %s %s:%s:%s", err.Error(), tt.Metadata.Host, tt.Metadata.DstIP.String(), tt.Metadata.DstPort)
|
||||
} else {
|
||||
if err == nil {
|
||||
resolver.InsertHostByIP(r.metadata.DstIP, header.Domain())
|
||||
log.Warnln("use sni update host: %s ip: %s", header.Domain(), r.metadata.DstIP.String())
|
||||
log.Debugln("[SNIFFER] use sni update host: %s ip: %s", header.Domain(), r.metadata.DstIP.String())
|
||||
if r.allowBreak {
|
||||
_ = r.Conn.Close()
|
||||
return 0, errors.New("sni update, break current link to avoid leaks")
|
||||
|
||||
@@ -58,13 +58,13 @@ func (tt *tcpTracker) Close() error {
|
||||
}
|
||||
|
||||
func NewTCPTracker(conn C.Conn, manager *Manager, metadata *C.Metadata, rule C.Rule) C.Conn {
|
||||
uuid, _ := uuid.NewV4()
|
||||
uuidM, _ := uuid.NewV4()
|
||||
|
||||
t := &tcpTracker{
|
||||
Conn: conn,
|
||||
manager: manager,
|
||||
trackerInfo: &trackerInfo{
|
||||
UUID: uuid,
|
||||
UUID: uuidM,
|
||||
Start: time.Now(),
|
||||
Metadata: metadata,
|
||||
Chain: conn.Chains(),
|
||||
@@ -80,7 +80,7 @@ func NewTCPTracker(conn C.Conn, manager *Manager, metadata *C.Metadata, rule C.R
|
||||
}
|
||||
|
||||
manager.Join(t)
|
||||
return NewSniffing(t, metadata, rule)
|
||||
return t
|
||||
}
|
||||
|
||||
type udpTracker struct {
|
||||
@@ -115,13 +115,13 @@ func (ut *udpTracker) Close() error {
|
||||
}
|
||||
|
||||
func NewUDPTracker(conn C.PacketConn, manager *Manager, metadata *C.Metadata, rule C.Rule) *udpTracker {
|
||||
uuid, _ := uuid.NewV4()
|
||||
uuidM, _ := uuid.NewV4()
|
||||
|
||||
ut := &udpTracker{
|
||||
PacketConn: conn,
|
||||
manager: manager,
|
||||
trackerInfo: &trackerInfo{
|
||||
UUID: uuid,
|
||||
UUID: uuidM,
|
||||
Start: time.Now(),
|
||||
Metadata: metadata,
|
||||
Chain: conn.Chains(),
|
||||
|
||||
@@ -38,6 +38,9 @@ var (
|
||||
// Outbound Rule
|
||||
mode = Rule
|
||||
|
||||
// sniffing switch
|
||||
sniffing = false
|
||||
|
||||
// default timeout for UDP session
|
||||
udpTimeout = 60 * time.Second
|
||||
|
||||
@@ -99,6 +102,14 @@ func SetMode(m TunnelMode) {
|
||||
mode = m
|
||||
}
|
||||
|
||||
func Sniffing() bool {
|
||||
return sniffing
|
||||
}
|
||||
|
||||
func SetSniffing(s bool) {
|
||||
sniffing = s
|
||||
}
|
||||
|
||||
// SetMitmOutbound set the MITM outbound
|
||||
func SetMitmOutbound(outbound C.ProxyAdapter) {
|
||||
if outbound != nil {
|
||||
@@ -341,6 +352,9 @@ func handleTCPConn(connCtx C.ConnContext) {
|
||||
|
||||
if remoteConn.Chains().Last() != "REJECT" && !isMitmOutbound {
|
||||
remoteConn = statistic.NewTCPTracker(remoteConn, statistic.DefaultManager, metadata, rule)
|
||||
if sniffing {
|
||||
remoteConn = statistic.NewSniffing(remoteConn, metadata, rule)
|
||||
}
|
||||
}
|
||||
|
||||
defer func(remoteConn C.Conn) {
|
||||
|
||||
Reference in New Issue
Block a user