fix(firewall/iptables): shared mutex for both iptables and ip6tables

This commit is contained in:
Quentin McGaw
2026-03-23 14:09:26 +00:00
parent 1b871496ea
commit c5b20a3b06
3 changed files with 10 additions and 8 deletions
+5 -6
View File
@@ -10,12 +10,11 @@ import (
) )
type Config struct { type Config struct {
runner CmdRunner runner CmdRunner
logger Logger logger Logger
iptablesMutex sync.Mutex iptablesMutex sync.Mutex
ip6tablesMutex sync.Mutex defaultRoutes []routing.DefaultRoute
defaultRoutes []routing.DefaultRoute localNetworks []routing.LocalNetwork
localNetworks []routing.LocalNetwork
// Fixed state // Fixed state
ipTables string ipTables string
+2 -2
View File
@@ -36,8 +36,8 @@ func (c *Config) runIP6tablesInstruction(ctx context.Context, instruction string
if c.ip6Tables == "" { if c.ip6Tables == "" {
return nil return nil
} }
c.ip6tablesMutex.Lock() // only one ip6tables command at once c.iptablesMutex.Lock() // only one ip6tables command at once
defer c.ip6tablesMutex.Unlock() defer c.iptablesMutex.Unlock()
if isDeleteMatchInstruction(instruction) { if isDeleteMatchInstruction(instruction) {
return deleteIPTablesRule(ctx, c.ip6Tables, instruction, return deleteIPTablesRule(ctx, c.ip6Tables, instruction,
+3
View File
@@ -215,6 +215,9 @@ func (c *Config) redirectPort(ctx context.Context, intf string,
interfaceFlag = "" interfaceFlag = ""
} }
c.iptablesMutex.Lock()
defer c.iptablesMutex.Unlock()
err = c.runIptablesInstructions(ctx, []string{ err = c.runIptablesInstructions(ctx, []string{
fmt.Sprintf("-t nat %s PREROUTING %s -p tcp --dport %d -j REDIRECT --to-ports %d", fmt.Sprintf("-t nat %s PREROUTING %s -p tcp --dport %d -j REDIRECT --to-ports %d",
appendOrDelete(remove), interfaceFlag, sourcePort, destinationPort), appendOrDelete(remove), interfaceFlag, sourcePort, destinationPort),