fix: validate Docker IPv4 forwarding (#13820)

This commit is contained in:
ssongliu
2026-09-15 18:36:36 +08:00
committed by GitHub
parent 6b20ff0b13
commit b9c8e39560
4 changed files with 39 additions and 0 deletions

View File

@@ -18,6 +18,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/utils/common"
"github.com/1Panel-dev/1Panel/agent/utils/controller"
"github.com/1Panel-dev/1Panel/agent/utils/docker"
"github.com/1Panel-dev/1Panel/agent/utils/firewall/docker_guard"
)
const dockerNftablesMinVersion = "29.0.0"
@@ -82,6 +83,11 @@ func (u *DockerService) UpdateFirewallBackend(backend string) error {
if backend == constant.FirewallProviderNftables && !dockerNftablesSupported(version) {
return fmt.Errorf("Docker Engine %s or later is required for the nftables firewall backend", dockerNftablesMinVersion)
}
if backend == constant.FirewallProviderNftables {
if err := docker_guard.CheckIPv4Forwarding(); err != nil {
return err
}
}
original, readErr := os.ReadFile(constant.DaemonJsonPath)
existed := readErr == nil

View File

@@ -0,0 +1,27 @@
package docker_guard
import (
"errors"
"fmt"
"os"
"strings"
)
const ipv4ForwardingPath = "/proc/sys/net/ipv4/ip_forward"
var ErrIPv4ForwardingDisabled = errors.New("IPv4 forwarding is disabled; set net.ipv4.ip_forward=1 before using Docker's firewall backend")
func CheckIPv4Forwarding() error {
return checkIPv4Forwarding(os.ReadFile)
}
func checkIPv4Forwarding(readFile func(string) ([]byte, error)) error {
value, err := readFile(ipv4ForwardingPath)
if err != nil {
return fmt.Errorf("inspect IPv4 forwarding: %w", err)
}
if strings.TrimSpace(string(value)) != "1" {
return ErrIPv4ForwardingDisabled
}
return nil
}

View File

@@ -133,6 +133,9 @@ func NewManager() *Manager { return &Manager{runner: commandRunner{}} }
func (m *Manager) Initialize(policies []Policy) error {
mutationMu.Lock()
defer mutationMu.Unlock()
if err := CheckIPv4Forwarding(); err != nil {
return err
}
inventory, err := m.ListPolicies()
if err != nil {
return err

View File

@@ -30,6 +30,9 @@ func (m *NftablesManager) Initialize(policies []Policy) error {
if !m.runner.Exists("nft") {
return errors.New("nft is not installed")
}
if err := CheckIPv4Forwarding(); err != nil {
return err
}
if err := m.checkForwardPolicy(); err != nil {
return err
}