Skip to content

Commit 8267e0a

Browse files
committed
don't skip a TCP connection if its entry cannot be found in the conntrack table (e.g., Cilium rewrites destinations at the eBPF level bypassing conntrack)
1 parent 78cc794 commit 8267e0a

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

containers/conntrack.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package containers
22

33
import (
4+
"github.com/coroot/coroot-node-agent/common"
45
"github.com/florianl/go-conntrack"
56
"inet.af/netaddr"
7+
"k8s.io/klog/v2"
68
"syscall"
79
)
810

@@ -19,9 +21,9 @@ func ConntrackInit() error {
1921
return nil
2022
}
2123

22-
func ConntrackGetActualDestination(src, dst netaddr.IPPort) (netaddr.IPPort, error) {
24+
func ConntrackGetActualDestination(src, dst netaddr.IPPort) netaddr.IPPort {
2325
if conntrackClient == nil {
24-
return dst, nil
26+
return dst
2527
}
2628

2729
tcp := uint8(syscall.IPPROTO_TCP)
@@ -47,7 +49,10 @@ func ConntrackGetActualDestination(src, dst netaddr.IPPort) (netaddr.IPPort, err
4749
}
4850
sessions, err := conntrackClient.Get(conntrack.Conntrack, family, req)
4951
if err != nil {
50-
return netaddr.IPPort{}, err
52+
if !common.IsNotExist(err) {
53+
klog.Errorf("failed to resolve actual destination for %s->%s: %s", src, dst, err)
54+
}
55+
return dst
5156
}
5257
for _, s := range sessions {
5358
if !ipTupleValid(s.Origin) || !ipTupleValid(s.Reply) {
@@ -62,11 +67,13 @@ func ConntrackGetActualDestination(src, dst netaddr.IPPort) (netaddr.IPPort, err
6267
if reply == nil {
6368
continue
6469
}
65-
ip, _ := netaddr.FromStdIP(*reply.Src)
66-
port := *reply.Proto.SrcPort
67-
return netaddr.IPPortFrom(ip, port), nil
70+
ip, ok := netaddr.FromStdIP(*reply.Src)
71+
if !ok {
72+
continue
73+
}
74+
return netaddr.IPPortFrom(ip, *reply.Proto.SrcPort)
6875
}
69-
return netaddr.IPPort{}, nil
76+
return dst
7077
}
7178

7279
func ipTuplesEqual(a, b *conntrack.IPTuple) bool {

containers/container.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -374,15 +374,9 @@ func (c *Container) onConnectionOpen(pid uint32, src, dst netaddr.IPPort, failed
374374
if failed {
375375
c.connectsFailed[dst]++
376376
} else {
377-
actualDst, err := ConntrackGetActualDestination(src, dst)
378-
if err != nil {
379-
klog.Errorf("failed to resolve actual destination for %s->%s: %s", src, dst, err)
380-
} else if actualDst.IsValid() {
381-
c.connectsSuccessful[AddrPair{src: dst, dst: actualDst}]++
382-
c.connectionsActive[AddrPair{src: src, dst: dst}] = actualDst
383-
} else {
384-
klog.Errorf("invalid actual destination for %s->%s: %s", src, dst, actualDst)
385-
}
377+
actualDst := ConntrackGetActualDestination(src, dst)
378+
c.connectsSuccessful[AddrPair{src: dst, dst: actualDst}]++
379+
c.connectionsActive[AddrPair{src: src, dst: dst}] = actualDst
386380
}
387381
c.connectLastAttempt[dst] = time.Now()
388382
}

0 commit comments

Comments
 (0)