Skip to content

Commit

Permalink
Merge pull request ovn-kubernetes#4553 from tssurya/udn-add-rp-filter…
Browse files Browse the repository at this point in the history
…-loose-mode-management-port

UDN: Add RPFilter Loose Mode for management port
  • Loading branch information
trozet authored Aug 29, 2024
2 parents 28b1db4 + c94b937 commit 15c5621
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
20 changes: 20 additions & 0 deletions go-controller/pkg/node/gateway_udn.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,11 @@ func (udng *UserDefinedNetworkGateway) AddNetwork() error {
return fmt.Errorf("unable to create iprule %v for network %s, err: %v", rule, udng.GetNetworkName(), err)
}
}
// add loose mode for rp filter on management port
mgmtPortName := util.GetNetworkScopedK8sMgmtHostIntfName(uint(udng.networkID))
if err := addRPFilterLooseModeForManagementPort(mgmtPortName); err != nil {
return fmt.Errorf("could not set loose mode for reverse path filtering on management port %s: %v", mgmtPortName, err)
}
if udng.openflowManager != nil {
udng.openflowManager.addNetwork(udng.NetInfo, udng.masqCTMark, udng.v4MasqIP, udng.v6MasqIP)

Expand Down Expand Up @@ -540,3 +545,18 @@ func generateIPRuleForMasqIP(masqIP net.IP, isIPv6 bool, vrfTableId uint) netlin
r.Dst = util.GetIPNetFullMaskFromIP(masqIP)
return r
}

func addRPFilterLooseModeForManagementPort(mgmtPortName string) error {
// update the reverse path filtering options for ovn-k8s-mpX interface to avoid dropping packets with masqueradeIP
// coming out of managementport interface
// NOTE: v6 doesn't have rp_filter strict mode block
rpFilterLooseMode := "2"
// TODO: Convert testing framework to mock golang module utilities. Example:
// result, err := sysctl.Sysctl(fmt.Sprintf("net/ipv4/conf/%s/rp_filter", types.K8sMgmtIntfName), rpFilterLooseMode)
stdout, stderr, err := util.RunSysctl("-w", fmt.Sprintf("net.ipv4.conf.%s.rp_filter=%s", mgmtPortName, rpFilterLooseMode))
if err != nil || stdout != fmt.Sprintf("net.ipv4.conf.%s.rp_filter = %s", mgmtPortName, rpFilterLooseMode) {
return fmt.Errorf("could not set the correct rp_filter value for interface %s: stdout: %v, stderr: %v, err: %v",
mgmtPortName, stdout, stderr, err)
}
return nil
}
20 changes: 20 additions & 0 deletions go-controller/pkg/node/gateway_udn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ func getVRFCreationFakeOVSCommands(fexec *ovntest.FakeExec) {
})
}

func getRPFilterLooseModeFakeCommands(fexec *ovntest.FakeExec) {
fexec.AddFakeCmd(&ovntest.ExpectedCmd{
Cmd: "sysctl -w net.ipv4.conf.ovn-k8s-mp3.rp_filter=2",
Output: "net.ipv4.conf.ovn-k8s-mp3.rp_filter = 2",
})
}

func getDeletionFakeOVSCommands(fexec *ovntest.FakeExec, mgtPort string) {
fexec.AddFakeCmdsNoOutputNoError([]string{
"ovs-vsctl --timeout=15 -- --if-exists del-port br-int " + mgtPort,
Expand Down Expand Up @@ -421,6 +428,7 @@ var _ = Describe("UserDefinedNetworkGateway", func() {
setUpGatewayFakeOVSCommands(fexec)
getCreationFakeOVSCommands(fexec, mgtPort, mgtPortMAC, netName, nodeName, netInfo.MTU())
getVRFCreationFakeOVSCommands(fexec)
getRPFilterLooseModeFakeCommands(fexec)
setUpUDNOpenflowManagerFakeOVSCommands(fexec)
getDeletionFakeOVSCommands(fexec, mgtPort)
nodeLister.On("Get", mock.AnythingOfType("string")).Return(node, nil)
Expand Down Expand Up @@ -587,6 +595,7 @@ var _ = Describe("UserDefinedNetworkGateway", func() {
setUpGatewayFakeOVSCommands(fexec)
getCreationFakeOVSCommands(fexec, mgtPort, mgtPortMAC, netName, nodeName, netInfo.MTU())
getVRFCreationFakeOVSCommands(fexec)
getRPFilterLooseModeFakeCommands(fexec)
setUpUDNOpenflowManagerFakeOVSCommands(fexec)
getDeletionFakeOVSCommands(fexec, mgtPort)
nodeLister.On("Get", mock.AnythingOfType("string")).Return(node, nil)
Expand Down Expand Up @@ -821,6 +830,17 @@ var _ = Describe("UserDefinedNetworkGateway", func() {
Expect(err).NotTo(HaveOccurred())
Expect(fexec.CalledMatchesExpected()).To(BeTrue(), fexec.ErrorDesc)
})
ovntest.OnSupportedPlatformsIt("should set rp filer to loose mode for management port interface", func() {
getRPFilterLooseModeFakeCommands(fexec)
err := testNS.Do(func(ns.NetNS) error {
defer GinkgoRecover()
err := addRPFilterLooseModeForManagementPort(mgtPort)
Expect(err).NotTo(HaveOccurred())
return nil
})
Expect(err).NotTo(HaveOccurred())
Expect(fexec.CalledMatchesExpected()).To(BeTrue(), fexec.ErrorDesc)
})
})

func TestConstructUDNVRFIPRules(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ var _ = Describe("SecondaryNodeNetworkController", func() {
defer GinkgoRecover()
getCreationFakeOVSCommands(fexec, mgtPort, mgtPortMAC, netName, nodeName, NetInfo.MTU())
getVRFCreationFakeOVSCommands(fexec)
getRPFilterLooseModeFakeCommands(fexec)
getDeletionFakeOVSCommands(fexec, mgtPort)

By("starting secondary network controller for user defined primary network")
Expand Down

0 comments on commit 15c5621

Please sign in to comment.