package libnetwork import ( "context" "fmt" "sync" "time" "github.com/containerd/log" "github.com/moby/moby/api/types/system" "github.com/moby/moby/v2/daemon/libnetwork/internal/nftables" "github.com/moby/moby/v2/daemon/libnetwork/iptables" "github.com/moby/moby/v2/daemon/libnetwork/osl" ) // FirewallBackend returns the name of the firewall backend for "docker info". func (c *Controller) FirewallBackend() *system.FirewallInfo { var info system.FirewallInfo info.Driver = "iptables" if nftables.Enabled() { info.Driver = "nftables" } if iptables.UsingFirewalld() { info.Driver += "+firewalld" if reloadedAt := iptables.FirewalldReloadedAt(); !reloadedAt.IsZero() { info.Info = [][2]string{{"ReloadedAt", reloadedAt.Format(time.RFC3339)}} } } return &info } // enabledIptablesVersions returns the iptables versions that are enabled // for the controller. func (c *Controller) enabledIptablesVersions() []iptables.IPVersion { var versions []iptables.IPVersion if c.cfg.BridgeConfig.EnableIPTables { versions = append(versions, iptables.IPv4) } if c.cfg.BridgeConfig.EnableIP6Tables { versions = append(versions, iptables.IPv6) } return versions } // getDefaultOSLSandbox returns the controller's default [osl.Sandbox]. It // creates the sandbox if it does not yet exist. func (c *Controller) getDefaultOSLSandbox(key string) (*osl.Namespace, error) { var err error c.defOsSboxOnce.Do(func() { c.defOsSbox, err = osl.NewSandbox(key, false, false) }) if err != nil { c.defOsSboxOnce = sync.Once{} return nil, fmt.Errorf("failed to create default sandbox: %v", err) } return c.defOsSbox, nil } // setupOSLSandbox sets the sandbox [osl.Sandbox], and applies operating- // specific configuration. // // Depending on the Sandbox settings, it may either use the Controller's // default sandbox, or configure a new one. func (c *Controller) setupOSLSandbox(sb *Sandbox) error { if sb.config.useDefaultSandBox { defSB, err := c.getDefaultOSLSandbox(sb.Key()) if err != nil { return err } sb.osSbox = defSB } if sb.osSbox == nil && !sb.config.useExternalKey { newSB, err := osl.NewSandbox(sb.Key(), !sb.config.useDefaultSandBox, false) if err != nil { return fmt.Errorf("failed to create new osl sandbox: %v", err) } sb.osSbox = newSB } if sb.osSbox != nil { // Apply operating specific knobs on the load balancer sandbox err := sb.osSbox.InvokeFunc(func() { sb.osSbox.ApplyOSTweaks(sb.oslTypes) }) if err != nil { log.G(context.TODO()).Errorf("Failed to apply performance tuning sysctls to the sandbox: %v", err) } // Keep this just so performance is not changed sb.osSbox.ApplyOSTweaks(sb.oslTypes) } return nil }