Skip to content

Commit 43a0667

Browse files
authored
fix: drop orphan centralized nat outgoing tcp packets (#7000)
Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
1 parent c4efb3c commit 43a0667

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

pkg/daemon/gateway_linux.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,14 @@ func (c *Controller) updateIptablesChain(ipt *iptables.IPTables, table, chain, p
604604
return nil
605605
}
606606

607+
func centralizedNatOutgoingNonSynDropRule(cidr, matchset string) util.IPTableRule {
608+
return util.IPTableRule{
609+
Table: MANGLE,
610+
Chain: OvnPostrouting,
611+
Rule: strings.Fields(fmt.Sprintf(`-s %s -p tcp -m tcp --tcp-flags SYN NONE -m conntrack --ctstate NEW -m set ! --match-set %s dst -j DROP`, cidr, matchset)),
612+
}
613+
}
614+
607615
func (c *Controller) setIptables() error {
608616
klog.V(3).Infoln("start to set up iptables")
609617
node, err := c.nodesLister.Get(c.config.NodeName)
@@ -893,6 +901,8 @@ func (c *Controller) setIptables() error {
893901
// insert the rule before the one for nat outgoing
894902
n := len(natPostroutingRules)
895903
natPostroutingRules = append(natPostroutingRules[:n-1], rule, natPostroutingRules[n-1])
904+
// Drop orphan non-SYN packets before conntrack confirm to avoid poisoning later SNAT.
905+
manglePostroutingRules = append(manglePostroutingRules, centralizedNatOutgoingNonSynDropRule(cidr, matchset))
896906
}
897907

898908
if err = c.reconcileNatOutgoingPolicyIptablesChain(protocol); err != nil {

pkg/daemon/gateway_linux_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package daemon
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestCentralizedNatOutgoingNonSynDropRule(t *testing.T) {
11+
rule := centralizedNatOutgoingNonSynDropRule("10.26.0.0/16", "ovn40subnets")
12+
require.Equal(t, MANGLE, rule.Table)
13+
require.Equal(t, OvnPostrouting, rule.Chain)
14+
require.Equal(t, strings.Fields(`-s 10.26.0.0/16 -p tcp -m tcp --tcp-flags SYN NONE -m conntrack --ctstate NEW -m set ! --match-set ovn40subnets dst -j DROP`), rule.Rule)
15+
}

0 commit comments

Comments
 (0)