Skip to content

Commit 03a93e9

Browse files
kerumetogvisor-bot
authored andcommitted
Isolate NETLINK_NETFILTER socket behavior behind the nftables flag in runsc.
Added nftables flag to runner build to satisfy stub tests. PiperOrigin-RevId: 771518457
1 parent 550b7eb commit 03a93e9

File tree

10 files changed

+55
-2
lines changed

10 files changed

+55
-2
lines changed

pkg/sentry/socket/netlink/netfilter/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ go_library(
1616
"//pkg/sentry/socket/netlink",
1717
"//pkg/sentry/socket/netlink/nlmsg",
1818
"//pkg/syserr",
19+
"//pkg/tcpip/nftables",
1920
],
2021
)

pkg/sentry/socket/netlink/netfilter/protocol.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"gvisor.dev/gvisor/pkg/sentry/socket/netlink"
2323
"gvisor.dev/gvisor/pkg/sentry/socket/netlink/nlmsg"
2424
"gvisor.dev/gvisor/pkg/syserr"
25+
"gvisor.dev/gvisor/pkg/tcpip/nftables"
2526
)
2627

2728
// Protocol implements netlink.Protocol.
@@ -33,6 +34,10 @@ var _ netlink.Protocol = (*Protocol)(nil)
3334

3435
// NewProtocol creates a NETLINK_NETFILTER netlink.Protocol.
3536
func NewProtocol(t *kernel.Task) (netlink.Protocol, *syserr.Error) {
37+
if !nftables.IsNFTablesEnabled() {
38+
return nil, syserr.ErrProtocolNotSupported
39+
}
40+
3641
return &Protocol{}, nil
3742
}
3843

pkg/tcpip/nftables/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ go_library(
2424
"nftables_types.go",
2525
"nftinterp.go",
2626
],
27+
visibility = [
28+
"//:sandbox",
29+
],
2730
deps = [
2831
"//pkg/abi/linux",
32+
"//pkg/atomicbitops",
2933
"//pkg/rand",
3034
"//pkg/tcpip",
3135
"//pkg/tcpip/checksum",

pkg/tcpip/nftables/nftables.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ func (nf *NFTables) CheckEgress(pkt *stack.PacketBuffer, af stack.AddressFamily)
6565

6666
// checkHook returns true if the packet should continue traversing the stack or false
6767
// if the packet should be dropped.
68+
// If NFTables is not enabled, the packet is always allowed to continue traversing the stack.
6869
func (nf *NFTables) checkHook(pkt *stack.PacketBuffer, af stack.AddressFamily, hook stack.NFHook) bool {
70+
if !IsNFTablesEnabled() {
71+
return true
72+
}
6973
v, err := nf.EvaluateHook(af, hook, pkt)
7074

7175
if err != nil {

pkg/tcpip/nftables/nftables_types.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,28 @@ import (
4646
"time"
4747

4848
"gvisor.dev/gvisor/pkg/abi/linux"
49+
"gvisor.dev/gvisor/pkg/atomicbitops"
4950
"gvisor.dev/gvisor/pkg/rand"
5051
"gvisor.dev/gvisor/pkg/tcpip"
5152
"gvisor.dev/gvisor/pkg/tcpip/stack"
5253
)
5354

54-
// TODO(b/345684870): Break this file up into multiple files by operation type.
55-
// Each operation should get its own file.
5655
// TODO(b/345684870): Make the nftables package thread-safe! Must be done before
5756
// the package is used in production.
5857

58+
// enableNFTables is a flag that indicates whether NFTables is enabled.
59+
var enableNFTables atomicbitops.Bool
60+
61+
// EnableNFTables enables NFTables.
62+
func EnableNFTables() {
63+
enableNFTables.Store(true)
64+
}
65+
66+
// IsNFTablesEnabled returns true if NFTables is enabled.
67+
func IsNFTablesEnabled() bool {
68+
return enableNFTables.Load()
69+
}
70+
5971
// Defines general constants for the nftables interpreter.
6072
const (
6173

runsc/cli/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ go_library(
1818
"//pkg/refs",
1919
"//pkg/sentry/platform",
2020
"//pkg/sentry/syscalls/linux",
21+
"//pkg/tcpip/nftables",
2122
"//runsc/cmd",
2223
"//runsc/cmd/nvproxy",
2324
"//runsc/cmd/trace",

runsc/cli/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"gvisor.dev/gvisor/pkg/refs"
3434
"gvisor.dev/gvisor/pkg/sentry/platform"
3535
"gvisor.dev/gvisor/pkg/sentry/syscalls/linux"
36+
"gvisor.dev/gvisor/pkg/tcpip/nftables"
3637
"gvisor.dev/gvisor/runsc/cmd"
3738
"gvisor.dev/gvisor/runsc/cmd/nvproxy"
3839
"gvisor.dev/gvisor/runsc/cmd/trace"
@@ -93,6 +94,10 @@ func Main() {
9394
util.Fatalf("%s", err.Error())
9495
}
9596

97+
if conf.Nftables {
98+
nftables.EnableNFTables()
99+
}
100+
96101
var errorLogger io.Writer
97102
if *logFD > -1 {
98103
errorLogger = os.NewFile(uintptr(*logFD), "error log file")

test/runner/defs.bzl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def _syscall_test(
8080
save = False,
8181
save_resume = False,
8282
netstack_sr = False,
83+
nftables = False,
8384
**kwargs):
8485
# Prepend "runsc" to non-native platform names.
8586
full_platform = platform if platform == "native" else "runsc_" + platform
@@ -102,6 +103,8 @@ def _syscall_test(
102103
name += "_save_resume"
103104
if save and netstack_sr:
104105
name += "_netstack_save"
106+
if nftables:
107+
name += "_nftables"
105108

106109
# Apply all tags.
107110
if tags == None:
@@ -173,6 +176,7 @@ def _syscall_test(
173176
"--save=" + str(save),
174177
"--save-resume=" + str(save_resume),
175178
"--netstack-sr=" + str(netstack_sr),
179+
"--nftables=" + str(nftables),
176180
]
177181

178182
# Trace points are platform agnostic, so enable them for ptrace only.
@@ -217,6 +221,7 @@ def syscall_test_variants(
217221
timeout = None,
218222
overlay = False,
219223
netstack_sr = False,
224+
nftables = False,
220225
**kwargs):
221226
"""Generates syscall tests for all variants.
222227
@@ -266,6 +271,7 @@ def syscall_test_variants(
266271
timeout = timeout,
267272
overlay = overlay,
268273
netstack_sr = netstack_sr,
274+
nftables = nftables,
269275
**kwargs
270276
)
271277

@@ -289,6 +295,7 @@ def syscall_test_variants(
289295
size = size,
290296
timeout = timeout,
291297
netstack_sr = netstack_sr,
298+
nftables = nftables,
292299
**kwargs
293300
)
294301

@@ -313,6 +320,7 @@ def syscall_test_variants(
313320
size = size,
314321
timeout = timeout,
315322
netstack_sr = netstack_sr,
323+
nftables = nftables,
316324
**kwargs
317325
)
318326
if not use_tmpfs:
@@ -336,6 +344,7 @@ def syscall_test_variants(
336344
size = size,
337345
timeout = timeout,
338346
netstack_sr = netstack_sr,
347+
nftables = nftables,
339348
**kwargs
340349
)
341350
if add_fusefs:
@@ -357,6 +366,7 @@ def syscall_test_variants(
357366
size = size,
358367
timeout = timeout,
359368
netstack_sr = netstack_sr,
369+
nftables = nftables,
360370
**kwargs
361371
)
362372

@@ -381,6 +391,7 @@ def syscall_test(
381391
size = "medium",
382392
overlay = False,
383393
netstack_sr = False,
394+
nftables = False,
384395
perf = False,
385396
**kwargs):
386397
"""syscall_test is a macro that will create targets for all platforms.
@@ -459,6 +470,7 @@ def syscall_test(
459470
size,
460471
overlay = overlay,
461472
netstack_sr = False,
473+
nftables = nftables,
462474
**kwargs
463475
)
464476

@@ -488,6 +500,7 @@ def syscall_test(
488500
"large", # size, use size as large by default for all S/R tests.
489501
"long", # timeout, use long timeout for S/R tests.
490502
netstack_sr = False,
503+
nftables = nftables,
491504
**kwargs
492505
)
493506

@@ -514,6 +527,7 @@ def syscall_test(
514527
"large", # size, use size as large by default for all S/R tests.
515528
"long", # timeout, use long timeout for S/R tests.
516529
netstack_sr = True, # netstack_sr, generate all tests with netstack s/r.
530+
nftables = nftables,
517531
**kwargs
518532
)
519533

@@ -540,5 +554,6 @@ def syscall_test(
540554
"large", # size, use size as large by default for all S/R tests.
541555
"long", # timeout, use long timeout for S/R tests.
542556
netstack_sr = False,
557+
nftables = nftables,
543558
**kwargs
544559
)

test/runner/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ var (
7272
save = flag.Bool("save", false, "enables save restore")
7373
saveResume = flag.Bool("save-resume", false, "enables save resume")
7474
netstackSR = flag.Bool("netstack-sr", false, "enables netstack s/r")
75+
nftables = flag.Bool("nftables", false, "enables nftables")
7576
)
7677

7778
const (
@@ -402,6 +403,10 @@ func runRunsc(tc *gtest.TestCase, spec *specs.Spec) error {
402403
// better place for these messages.
403404
args = append(args, "-log=/dev/null")
404405

406+
if *nftables {
407+
args = append(args, "-TESTONLY-nftables=true")
408+
}
409+
405410
// Create the state file.
406411
if *save || *saveResume {
407412
if *netstackSR {

test/syscalls/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,7 @@ syscall_test(
939939

940940
syscall_test(
941941
add_hostinet = True,
942+
nftables = True,
942943
test = "//test/syscalls/linux:socket_netlink_netfilter_test",
943944
)
944945

0 commit comments

Comments
 (0)