This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git


The following commit(s) were added to refs/heads/main by this push:
     new 79292fe  Adapt ambient mesh 1.23 iptables mode (#195)
79292fe is described below

commit 79292fe07f17f98f486e0c4471213e1961fb2d1d
Author: mrproliu <[email protected]>
AuthorDate: Thu May 22 11:23:04 2025 +0800

    Adapt ambient mesh 1.23 iptables mode (#195)
---
 pkg/accesslog/collector/connection.go | 50 ++++++++++++++++++++++++-----------
 pkg/tools/ip/conntrack.go             | 19 ++++++++++---
 2 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/pkg/accesslog/collector/connection.go 
b/pkg/accesslog/collector/connection.go
index b25c02e..29adfa9 100644
--- a/pkg/accesslog/collector/connection.go
+++ b/pkg/accesslog/collector/connection.go
@@ -254,6 +254,7 @@ func (c *ConnectionPartitionContext) 
IsOnlyLocalPortEmpty(socketPair *ip.SocketP
 func (c *ConnectionPartitionContext) BuildSocketPair(event 
*events.SocketConnectEvent) *ip.SocketPair {
        var result *ip.SocketPair
        haveConnTrack := false
+       remoteAddrPort := uint16(event.RemoteAddrPort)
        switch event.SocketFamily {
        case unix.AF_INET:
                result = &ip.SocketPair{
@@ -262,18 +263,26 @@ func (c *ConnectionPartitionContext) 
BuildSocketPair(event *events.SocketConnect
                        SrcIP:   ip.ParseIPV4(event.LocalAddrV4),
                        SrcPort: uint16(event.LocalAddrPort),
                }
+               remoteAddr := ip.ParseIPV4(event.RemoteAddrV4)
+               ignoredConntrack := true
                if event.ConnTrackUpstreamIPl != 0 && 
event.ConnTrackUpstreamPort != 0 {
                        haveConnTrack = true
-                       result.DestIP = 
ip.ParseIPV4(uint32(event.ConnTrackUpstreamIPl))
-                       result.DestPort = uint16(event.ConnTrackUpstreamPort)
+                       conntrackIP := 
ip.ParseIPV4(uint32(event.ConnTrackUpstreamIPl))
+                       if !ip.ShouldIgnoreConntrack(remoteAddr, conntrackIP, 
uint16(event.ConnTrackUpstreamPort)) {
+                               result.DestIP = conntrackIP
+                               result.DestPort = 
uint16(event.ConnTrackUpstreamPort)
+                               ignoredConntrack = false
+                       }
 
                        if connectionLogger.Enable(logrus.DebugLevel) {
-                               connectionLogger.Debugf("found the connection 
from the conntrack, connection ID: %d, randomID: %d, original: %s:%d, 
conntrack: %s:%d",
-                                       event.ConID, event.RandomID, 
ip.ParseIPV4(event.RemoteAddrV4), uint16(event.RemoteAddrPort), result.DestIP, 
result.DestPort)
+                               connectionLogger.Debugf("found the connection 
from the conntrack, connection ID: %d, randomID: %d, "+
+                                       "original: %s:%d, conntrack: %s:%d, 
ignored: %t",
+                                       event.ConID, event.RandomID, 
remoteAddr, remoteAddrPort, result.DestIP, result.DestPort, ignoredConntrack)
                        }
-               } else {
-                       result.DestIP = ip.ParseIPV4(event.RemoteAddrV4)
-                       result.DestPort = uint16(event.RemoteAddrPort)
+               }
+               if ignoredConntrack {
+                       result.DestIP = remoteAddr
+                       result.DestPort = remoteAddrPort
                }
        case unix.AF_INET6:
                result = &ip.SocketPair{
@@ -282,24 +291,35 @@ func (c *ConnectionPartitionContext) 
BuildSocketPair(event *events.SocketConnect
                        SrcIP:   ip.ParseIPV6(event.LocalAddrV6),
                        SrcPort: uint16(event.LocalAddrPort),
                }
+               remoteAddr := ip.ParseIPV6(event.RemoteAddrV6)
+               ignoredConntrack := true
                if event.ConnTrackUpstreamIPl != 0 && 
event.ConnTrackUpstreamPort != 0 {
                        haveConnTrack = true
+                       var conntrackIP string
                        if event.ConnTrackUpstreamIPh != 0 {
                                var ipv6 [16]uint8
                                binary.BigEndian.PutUint64(ipv6[0:8], 
event.ConnTrackUpstreamIPh)
                                binary.BigEndian.PutUint64(ipv6[8:16], 
event.ConnTrackUpstreamIPl)
-                               result.DestIP = ip.ParseIPV6(ipv6)
+                               conntrackIP = ip.ParseIPV6(ipv6)
                        } else {
-                               result.DestIP = 
ip.ParseIPV4(uint32(event.ConnTrackUpstreamIPl))
+                               conntrackIP = 
ip.ParseIPV4(uint32(event.ConnTrackUpstreamIPl))
+                       }
+
+                       if !ip.ShouldIgnoreConntrack(remoteAddr, conntrackIP, 
uint16(event.ConnTrackUpstreamPort)) {
+                               result.DestIP = conntrackIP
+                               result.DestPort = 
uint16(event.ConnTrackUpstreamPort)
+                               ignoredConntrack = false
                        }
-                       result.DestPort = uint16(event.ConnTrackUpstreamPort)
+
                        if connectionLogger.Enable(logrus.DebugLevel) {
-                               connectionLogger.Debugf("found the connection 
from the conntrack, connection ID: %d, randomID: %d, original: %s:%d, 
conntrack: %s:%d",
-                                       event.ConID, event.RandomID, 
ip.ParseIPV6(event.RemoteAddrV6), uint16(event.RemoteAddrPort), result.DestIP, 
result.DestPort)
+                               connectionLogger.Debugf("found the connection 
from the conntrack, connection ID: %d, randomID: %d, "+
+                                       "original: %s:%d, conntrack: %s:%d, 
ignored: %t",
+                                       event.ConID, event.RandomID, 
remoteAddr, remoteAddrPort, result.DestIP, result.DestPort, ignoredConntrack)
                        }
-               } else {
-                       result.DestIP = ip.ParseIPV6(event.RemoteAddrV6)
-                       result.DestPort = uint16(event.RemoteAddrPort)
+               }
+               if ignoredConntrack {
+                       result.DestIP = remoteAddr
+                       result.DestPort = remoteAddrPort
                }
        }
 
diff --git a/pkg/tools/ip/conntrack.go b/pkg/tools/ip/conntrack.go
index 3e3f934..831d2cc 100644
--- a/pkg/tools/ip/conntrack.go
+++ b/pkg/tools/ip/conntrack.go
@@ -27,6 +27,7 @@ import (
        "golang.org/x/sys/unix"
 
        "github.com/apache/skywalking-rover/pkg/logger"
+       "github.com/apache/skywalking-rover/pkg/tools"
 )
 
 var log = logger.GetLogger("tools", "ip")
@@ -71,15 +72,27 @@ func (c *ConnTrack) UpdateRealPeerAddress(addr *SocketPair) 
error {
                }
 
                if res := c.filterValidateReply(session, tuple); res != nil {
-                       addr.DestIP = res.Src.String()
-                       addr.NeedConnTrack = false
-                       log.Debugf("update real peer address from conntrack: 
%s:%d", addr.DestIP, addr.DestPort)
+                       if !ShouldIgnoreConntrack(addr.DestIP, 
res.Src.String(), *res.Proto.SrcPort) {
+                               addr.DestIP = res.Src.String()
+                               addr.NeedConnTrack = false
+                               log.Debugf("update real peer address from 
conntrack: %s:%d", addr.DestIP, addr.DestPort)
+                       } else {
+                               log.Debugf("ignore conntrack, original dest IP: 
%s:%d, conntrack IP: %s:%d",
+                                       addr.DestIP, addr.DestPort, 
res.Src.String(), *res.Proto.SrcPort)
+                       }
                        return nil
                }
        }
        return nil
 }
 
+func ShouldIgnoreConntrack(originalDestIP, conntrackIP string, conntrackPort 
uint16) bool {
+       // if the original dest IP is not local host
+       // and the conntrack IP is local host, and port is 15001, such as 
127.0.0.1:15001, means the conntrack is to istio-proxy
+       // then we should ignore the conntrack
+       return conntrackPort == 15001 && tools.IsLocalHostAddress(conntrackIP) 
&& !tools.IsLocalHostAddress(originalDestIP)
+}
+
 func (c *ConnTrack) parseSocketToTuple(addr *SocketPair) *conntrack.IPTuple {
        tcp := uint8(syscall.IPPROTO_TCP)
        srcIP := net.ParseIP(addr.SrcIP)

Reply via email to