From b9ee4b902fb06310662550875173492bc7968867 Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Thu, 23 Jun 2022 15:13:32 +0800 Subject: [PATCH] Feature: remove pre resolve process name --- component/process/process.go | 5 ++++- tunnel/tunnel.go | 34 ++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/component/process/process.go b/component/process/process.go index 677a74cb..2f004d0f 100644 --- a/component/process/process.go +++ b/component/process/process.go @@ -28,6 +28,9 @@ func ShouldFindProcess(metadata *C.Metadata) bool { if metadata.Process != "" { return false } + if metadata.SrcIP.IsUnspecified() { + return true + } for _, ip := range localIPs { if ip == metadata.SrcIP { return true @@ -41,7 +44,7 @@ func AppendLocalIPs(ip ...netip.Addr) { } func getLocalIPs() []netip.Addr { - ips := []netip.Addr{netip.IPv4Unspecified(), netip.IPv6Unspecified()} + var ips []netip.Addr netInterfaces, err := net.Interfaces() if err != nil { diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index 4138aa77..559270df 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -190,19 +190,6 @@ func preHandleMetadata(metadata *C.Metadata) error { } } - // pre resolve process name - srcPort, err := strconv.ParseUint(metadata.SrcPort, 10, 16) - if err == nil && P.ShouldFindProcess(metadata) { - path, err := P.FindProcessName(metadata.NetWork.String(), metadata.SrcIP, int(srcPort)) - if err != nil { - log.Debugln("[Process] find process %s: %v", metadata.String(), err) - } else { - log.Debugln("[Process] %s from process %s", metadata.String(), path) - metadata.Process = filepath.Base(path) - metadata.ProcessPath = path - } - } - return nil } @@ -385,7 +372,10 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { configMux.RLock() defer configMux.RUnlock() - var resolved bool + var ( + resolved bool + processFound bool + ) if node := resolver.DefaultHosts.Search(metadata.Host); node != nil { metadata.DstIP = node.Data @@ -404,6 +394,22 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { resolved = true } + if !processFound && rule.ShouldFindProcess() && P.ShouldFindProcess(metadata) { + processFound = true + + srcPort, err := strconv.ParseUint(metadata.SrcPort, 10, 16) + if err == nil { + path, err := P.FindProcessName(metadata.NetWork.String(), metadata.SrcIP, int(srcPort)) + if err != nil { + log.Debugln("[Process] find process %s: %v", metadata.String(), err) + } else { + log.Debugln("[Process] %s from process %s", metadata.String(), path) + metadata.Process = filepath.Base(path) + metadata.ProcessPath = path + } + } + } + if rule.Match(metadata) { adapter, ok := proxies[rule.Adapter()] if !ok {