Skip to content

Commit 981bec2

Browse files
Merge pull request #581 from danwinship/nftables-cni
SDN-4114: Do per-pod MCS/metadata blocking with nftables rather than iptables
2 parents f4cdaa2 + c23c2b2 commit 981bec2

File tree

21 files changed

+3271
-21
lines changed

21 files changed

+3271
-21
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ require (
3030
k8s.io/klog/v2 v2.100.1
3131
k8s.io/kubernetes v1.28.3 // actual branch sdn-4.15-kubernetes-1.28.3 in openshift/kubernetes
3232
k8s.io/utils v0.0.0-20230726121419-3b25d923346b
33+
sigs.k8s.io/knftables v0.0.16
3334
sigs.k8s.io/yaml v1.3.0
3435
)
3536

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6U
10671067
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0=
10681068
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
10691069
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
1070+
sigs.k8s.io/knftables v0.0.16 h1:ZpTfNsjnidgoXdxxzcZLdSctqkpSO3QB3jo3zQ4PXqM=
1071+
sigs.k8s.io/knftables v0.0.16/go.mod h1:f/5ZLKYEUPUhVjUCg6l80ACdL7CIIyeL0DxfgojGRTk=
10701072
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
10711073
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
10721074
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=

pkg/cmd/openshift-sdn-cni/openshift-sdn.go

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package openshift_sdn_cni
22

33
import (
44
"bytes"
5+
"context"
56
"encoding/json"
67
"fmt"
78
"io/ioutil"
89
"net"
910
"net/http"
1011
"os"
11-
"os/exec"
1212
"strings"
1313

1414
configv1 "github.com/openshift/api/config/v1"
@@ -21,8 +21,8 @@ import (
2121
"github.com/containernetworking/plugins/pkg/ip"
2222
"github.com/containernetworking/plugins/pkg/ipam"
2323
"github.com/containernetworking/plugins/pkg/ns"
24-
2524
"github.com/vishvananda/netlink"
25+
"sigs.k8s.io/knftables"
2626
)
2727

2828
type cniPlugin struct {
@@ -116,24 +116,73 @@ func (p *cniPlugin) testCmdAdd(args *skel.CmdArgs) (types.Result, error) {
116116
return convertToRequestedVersion(args.StdinData, result)
117117
}
118118

119-
func generateIPTablesCommands(platformType string) [][]string {
119+
func doNFTablesRules(platformType string) error {
120+
nft, err := knftables.New(knftables.IPv4Family, "openshift-block-output")
121+
if err != nil {
122+
return err
123+
}
124+
125+
tx := nft.NewTransaction()
126+
tx.Add(&knftables.Table{})
127+
128+
tx.Add(&knftables.Chain{
129+
Name: "block",
130+
})
131+
132+
// Block MCS
133+
tx.Add(&knftables.Rule{
134+
Chain: "block",
135+
Rule: knftables.Concat(
136+
"tcp dport { 22623, 22624 } tcp flags syn",
137+
"reject",
138+
),
139+
})
140+
141+
// Block cloud provider metadata IP except DNS
120142
metadataServiceIP := "169.254.169.254"
121143
if platformType == string(configv1.AlibabaCloudPlatformType) {
122144
metadataServiceIP = "100.100.100.200"
123145
}
124-
return [][]string{
125-
// Block MCS
126-
{"-A", "OUTPUT", "-p", "tcp", "-m", "tcp", "--dport", "22623", "--syn", "-j", "REJECT"},
127-
{"-A", "OUTPUT", "-p", "tcp", "-m", "tcp", "--dport", "22624", "--syn", "-j", "REJECT"},
128-
{"-A", "FORWARD", "-p", "tcp", "-m", "tcp", "--dport", "22623", "--syn", "-j", "REJECT"},
129-
{"-A", "FORWARD", "-p", "tcp", "-m", "tcp", "--dport", "22624", "--syn", "-j", "REJECT"},
130-
131-
// Block cloud provider metadata IP except DNS
132-
{"-A", "OUTPUT", "-p", "tcp", "-m", "tcp", "-d", metadataServiceIP, "!", "--dport", "53", "-j", "REJECT"},
133-
{"-A", "OUTPUT", "-p", "udp", "-m", "udp", "-d", metadataServiceIP, "!", "--dport", "53", "-j", "REJECT"},
134-
{"-A", "FORWARD", "-p", "tcp", "-m", "tcp", "-d", metadataServiceIP, "!", "--dport", "53", "-j", "REJECT"},
135-
{"-A", "FORWARD", "-p", "udp", "-m", "udp", "-d", metadataServiceIP, "!", "--dport", "53", "-j", "REJECT"},
136-
}
146+
tx.Add(&knftables.Rule{
147+
Chain: "block",
148+
Rule: knftables.Concat(
149+
"ip daddr", metadataServiceIP,
150+
"udp dport != 53",
151+
"reject",
152+
),
153+
})
154+
tx.Add(&knftables.Rule{
155+
Chain: "block",
156+
Rule: knftables.Concat(
157+
"ip daddr", metadataServiceIP,
158+
"tcp dport != 53",
159+
"reject",
160+
),
161+
})
162+
163+
tx.Add(&knftables.Chain{
164+
Name: "output",
165+
Type: knftables.PtrTo(knftables.FilterType),
166+
Hook: knftables.PtrTo(knftables.OutputHook),
167+
Priority: knftables.PtrTo(knftables.FilterPriority),
168+
})
169+
tx.Add(&knftables.Rule{
170+
Chain: "output",
171+
Rule: "goto block",
172+
})
173+
174+
tx.Add(&knftables.Chain{
175+
Name: "forward",
176+
Type: knftables.PtrTo(knftables.FilterType),
177+
Hook: knftables.PtrTo(knftables.ForwardHook),
178+
Priority: knftables.PtrTo(knftables.FilterPriority),
179+
})
180+
tx.Add(&knftables.Rule{
181+
Chain: "forward",
182+
Rule: "goto block",
183+
})
184+
185+
return nft.Run(context.Background(), tx)
137186
}
138187

139188
func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
@@ -253,11 +302,8 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
253302
}
254303

255304
// Block access to certain things
256-
for _, args := range generateIPTablesCommands(config.PlatformType) {
257-
out, err := exec.Command("iptables", append([]string{"-w"}, args...)...).CombinedOutput()
258-
if err != nil {
259-
return fmt.Errorf("could not set up pod iptables rules: %s", string(out))
260-
}
305+
if err = doNFTablesRules(config.PlatformType); err != nil {
306+
return fmt.Errorf("could not set up pod nftables rules: %v", err)
261307
}
262308

263309
return nil

vendor/modules.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,9 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client
14861486
## explicit; go 1.18
14871487
sigs.k8s.io/json
14881488
sigs.k8s.io/json/internal/golang/encoding/json
1489+
# sigs.k8s.io/knftables v0.0.16
1490+
## explicit; go 1.20
1491+
sigs.k8s.io/knftables
14891492
# sigs.k8s.io/structured-merge-diff/v4 v4.2.3
14901493
## explicit; go 1.13
14911494
sigs.k8s.io/structured-merge-diff/v4/fieldpath

vendor/sigs.k8s.io/knftables/.gitignore

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/sigs.k8s.io/knftables/CHANGELOG.md

Lines changed: 147 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/sigs.k8s.io/knftables/CONTRIBUTING.md

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)