Skip to content

Commit 8d3b0ae

Browse files
committed
Default net.ipv4.ip_unprivileged_port_start to 0 inside containers
1 parent 867c4b3 commit 8d3b0ae

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

docs/faq.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ Set sysctl value `net.ipv4.ip_unprivileged_port_start=0` .
322322
323323
See https://rootlesscontaine.rs/getting-started/common/sysctl/#optional-allowing-listening-on-tcp--udp-ports-below-1024
324324
325+
`nerdctl` now defaults `net.ipv4.ip_unprivileged_port_start=0` inside the container unless you override it with `--sysctl`. This does not change the host-side sysctl, which may still need to be configured for rootless port publishing.
326+
325327
### Can't ping
326328
327329
Set sysctl value `net.ipv4.ping_group_range=0 2147483647` .

pkg/cmd/container/create.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ func Create(ctx context.Context, client *containerd.Client, args []string, netMa
330330
}
331331
opts = append(opts, umaskOpts...)
332332

333+
opts = append(opts, withDefaultUnprivilegedPortSysctl(options.Sysctl))
334+
333335
rtCOpts, err := generateRuntimeCOpts(options.GOptions.CgroupManager, options.Runtime)
334336
if err != nil {
335337
return nil, generateRemoveOrphanedDirsFunc(ctx, id, dataStore, internalLabels), err
@@ -563,6 +565,31 @@ func GenerateLogURI(dataStore string) (*url.URL, error) {
563565
return cio.LogURIGenerator("binary", selfExe, args)
564566
}
565567

568+
func withDefaultUnprivilegedPortSysctl(sysctls []string) oci.SpecOpts {
569+
const key = "net.ipv4.ip_unprivileged_port_start"
570+
for _, kv := range sysctls {
571+
if strings.HasPrefix(kv, key) {
572+
return func(_ context.Context, _ oci.Client, _ *containers.Container, _ *oci.Spec) error {
573+
return nil
574+
}
575+
}
576+
}
577+
578+
return func(_ context.Context, _ oci.Client, _ *containers.Container, s *oci.Spec) error {
579+
if s.Linux == nil {
580+
return nil
581+
}
582+
if s.Linux.Sysctl == nil {
583+
s.Linux.Sysctl = make(map[string]string)
584+
}
585+
586+
if _, exists := s.Linux.Sysctl[key]; !exists {
587+
s.Linux.Sysctl[key] = "0"
588+
}
589+
return nil
590+
}
591+
}
592+
566593
func withNerdctlOCIHook(cmd string, args []string) (oci.SpecOpts, error) {
567594
if rootlessutil.IsRootless() {
568595
detachedNetNS, err := rootlessutil.DetachedNetNS()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/opencontainers/runtime-spec/specs-go"
8+
)
9+
10+
func TestWithDefaultUnprivilegedPortSysctl_DefaultsToZero(t *testing.T) {
11+
opt := withDefaultUnprivilegedPortSysctl(nil)
12+
13+
var s specs.Spec
14+
s.Linux = &specs.Linux{}
15+
if err := opt(context.Background(), nil, nil, &s); err != nil {
16+
t.Fatalf("unexpected error: %v", err)
17+
}
18+
19+
if s.Linux.Sysctl["net.ipv4.ip_unprivileged_port_start"] != "0" {
20+
t.Fatalf("expected net.ipv4.ip_unprivileged_port_start=0, got %q", s.Linux.Sysctl["net.ipv4.ip_unprivileged_port_start"])
21+
}
22+
}
23+
24+
func TestWithDefaultUnprivilegedPortSysctl_UserOverride(t *testing.T) {
25+
sysctls := []string{"net.ipv4.ip_unprivileged_port_start=1000"}
26+
opt := withDefaultUnprivilegedPortSysctl(sysctls)
27+
28+
var s specs.Spec
29+
s.Linux = &specs.Linux{Sysctl: map[string]string{}}
30+
if err := opt(context.Background(), nil, nil, &s); err != nil {
31+
t.Fatalf("unexpected error: %v", err)
32+
}
33+
34+
if _, ok := s.Linux.Sysctl["net.ipv4.ip_unprivileged_port_start"]; ok {
35+
t.Fatalf("expected helper not to override user setting")
36+
}
37+
}

0 commit comments

Comments
 (0)