diff --git a/client/firewall/iptables/manager_linux.go b/client/firewall/iptables/manager_linux.go index 84e20bd0bcf..6ddab0b8fe6 100644 --- a/client/firewall/iptables/manager_linux.go +++ b/client/firewall/iptables/manager_linux.go @@ -58,13 +58,17 @@ func Create(wgIface iFaceMapper) (*Manager, error) { if err != nil { return nil, fmt.Errorf("iptables is not installed in the system or not supported") } - m.ipv4Client = ipv4Client + if isIptablesClientAvailable(ipv4Client) { + m.ipv4Client = ipv4Client + } ipv6Client, err := iptables.NewWithProtocol(iptables.ProtocolIPv6) if err != nil { log.Errorf("ip6tables is not installed in the system or not supported: %v", err) } else { - m.ipv6Client = ipv6Client + if isIptablesClientAvailable(ipv6Client) { + m.ipv6Client = ipv6Client + } } if err := m.Reset(); err != nil { @@ -73,6 +77,11 @@ func Create(wgIface iFaceMapper) (*Manager, error) { return m, nil } +func isIptablesClientAvailable(client *iptables.IPTables) bool { + _, err := client.ListChains("filter") + return err == nil +} + // AddFiltering rule to the firewall // // If comment is empty rule ID is used as comment diff --git a/client/internal/routemanager/firewall_linux.go b/client/internal/routemanager/firewall_linux.go index f4358c7d1a5..959724ed35c 100644 --- a/client/internal/routemanager/firewall_linux.go +++ b/client/internal/routemanager/firewall_linux.go @@ -35,7 +35,15 @@ func NewFirewall(parentCTX context.Context) firewallManager { if isIptablesSupported() { log.Debugf("iptables is supported") ipv4Client, _ := iptables.NewWithProtocol(iptables.ProtocolIPv4) + if !isIptablesClientAvailable(ipv4Client) { + log.Infof("iptables is missing for ipv4") + ipv4Client = nil + } ipv6Client, _ := iptables.NewWithProtocol(iptables.ProtocolIPv6) + if !isIptablesClientAvailable(ipv6Client) { + log.Infof("iptables is missing for ipv6") + ipv6Client = nil + } return &iptablesManager{ ctx: ctx, @@ -59,6 +67,11 @@ func NewFirewall(parentCTX context.Context) firewallManager { return manager } +func isIptablesClientAvailable(client *iptables.IPTables) bool { + _, err := client.ListChains("filter") + return err == nil +} + func getInPair(pair routerPair) routerPair { return routerPair{ ID: pair.ID, diff --git a/client/internal/routemanager/iptables_linux.go b/client/internal/routemanager/iptables_linux.go index c738e21656d..be469b82a64 100644 --- a/client/internal/routemanager/iptables_linux.go +++ b/client/internal/routemanager/iptables_linux.go @@ -61,24 +61,28 @@ func (i *iptablesManager) CleanRoutingRules() { log.Debug("flushing tables") errMSGFormat := "iptables: failed cleaning %s chain %s,error: %v" - err = i.ipv4Client.ClearAndDeleteChain(iptablesFilterTable, iptablesRoutingForwardingChain) - if err != nil { - log.Errorf(errMSGFormat, ipv4, iptablesRoutingForwardingChain, err) - } + if i.ipv4Client != nil { + err = i.ipv4Client.ClearAndDeleteChain(iptablesFilterTable, iptablesRoutingForwardingChain) + if err != nil { + log.Errorf(errMSGFormat, ipv4, iptablesRoutingForwardingChain, err) + } - err = i.ipv4Client.ClearAndDeleteChain(iptablesNatTable, iptablesRoutingNatChain) - if err != nil { - log.Errorf(errMSGFormat, ipv4, iptablesRoutingNatChain, err) + err = i.ipv4Client.ClearAndDeleteChain(iptablesNatTable, iptablesRoutingNatChain) + if err != nil { + log.Errorf(errMSGFormat, ipv4, iptablesRoutingNatChain, err) + } } - err = i.ipv6Client.ClearAndDeleteChain(iptablesFilterTable, iptablesRoutingForwardingChain) - if err != nil { - log.Errorf(errMSGFormat, ipv6, iptablesRoutingForwardingChain, err) - } + if i.ipv6Client != nil { + err = i.ipv6Client.ClearAndDeleteChain(iptablesFilterTable, iptablesRoutingForwardingChain) + if err != nil { + log.Errorf(errMSGFormat, ipv6, iptablesRoutingForwardingChain, err) + } - err = i.ipv6Client.ClearAndDeleteChain(iptablesNatTable, iptablesRoutingNatChain) - if err != nil { - log.Errorf(errMSGFormat, ipv6, iptablesRoutingNatChain, err) + err = i.ipv6Client.ClearAndDeleteChain(iptablesNatTable, iptablesRoutingNatChain) + if err != nil { + log.Errorf(errMSGFormat, ipv6, iptablesRoutingNatChain, err) + } } log.Info("done cleaning up iptables rules") @@ -96,37 +100,41 @@ func (i *iptablesManager) RestoreOrCreateContainers() error { errMSGFormat := "iptables: failed creating %s chain %s,error: %v" - err := createChain(i.ipv4Client, iptablesFilterTable, iptablesRoutingForwardingChain) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv4, iptablesRoutingForwardingChain, err) - } + if i.ipv4Client != nil { + err := createChain(i.ipv4Client, iptablesFilterTable, iptablesRoutingForwardingChain) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv4, iptablesRoutingForwardingChain, err) + } - err = createChain(i.ipv4Client, iptablesNatTable, iptablesRoutingNatChain) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv4, iptablesRoutingNatChain, err) - } + err = createChain(i.ipv4Client, iptablesNatTable, iptablesRoutingNatChain) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv4, iptablesRoutingNatChain, err) + } - err = createChain(i.ipv6Client, iptablesFilterTable, iptablesRoutingForwardingChain) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv6, iptablesRoutingForwardingChain, err) + err = i.restoreRules(i.ipv4Client) + if err != nil { + return fmt.Errorf("iptables: error while restoring ipv4 rules: %v", err) + } } - err = createChain(i.ipv6Client, iptablesNatTable, iptablesRoutingNatChain) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv6, iptablesRoutingNatChain, err) - } + if i.ipv6Client != nil { + err := createChain(i.ipv6Client, iptablesFilterTable, iptablesRoutingForwardingChain) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv6, iptablesRoutingForwardingChain, err) + } - err = i.restoreRules(i.ipv4Client) - if err != nil { - return fmt.Errorf("iptables: error while restoring ipv4 rules: %v", err) - } + err = createChain(i.ipv6Client, iptablesNatTable, iptablesRoutingNatChain) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv6, iptablesRoutingNatChain, err) + } - err = i.restoreRules(i.ipv6Client) - if err != nil { - return fmt.Errorf("iptables: error while restoring ipv6 rules: %v", err) + err = i.restoreRules(i.ipv6Client) + if err != nil { + return fmt.Errorf("iptables: error while restoring ipv6 rules: %v", err) + } } - err = i.addJumpRules() + err := i.addJumpRules() if err != nil { return fmt.Errorf("iptables: error while creating jump rules: %v", err) } @@ -140,34 +148,38 @@ func (i *iptablesManager) addJumpRules() error { if err != nil { return err } - rule := append(iptablesDefaultForwardingRule, ipv4Forwarding) - err = i.ipv4Client.Insert(iptablesFilterTable, iptablesForwardChain, 1, rule...) - if err != nil { - return err - } + if i.ipv4Client != nil { + rule := append(iptablesDefaultForwardingRule, ipv4Forwarding) - i.rules[ipv4][ipv4Forwarding] = rule + err = i.ipv4Client.Insert(iptablesFilterTable, iptablesForwardChain, 1, rule...) + if err != nil { + return err + } + i.rules[ipv4][ipv4Forwarding] = rule - rule = append(iptablesDefaultNatRule, ipv4Nat) - err = i.ipv4Client.Insert(iptablesNatTable, iptablesPostRoutingChain, 1, rule...) - if err != nil { - return err + rule = append(iptablesDefaultNatRule, ipv4Nat) + err = i.ipv4Client.Insert(iptablesNatTable, iptablesPostRoutingChain, 1, rule...) + if err != nil { + return err + } + i.rules[ipv4][ipv4Nat] = rule } - i.rules[ipv4][ipv4Nat] = rule - rule = append(iptablesDefaultForwardingRule, ipv6Forwarding) - err = i.ipv6Client.Insert(iptablesFilterTable, iptablesForwardChain, 1, rule...) - if err != nil { - return err - } - i.rules[ipv6][ipv6Forwarding] = rule + if i.ipv6Client != nil { + rule := append(iptablesDefaultForwardingRule, ipv6Forwarding) + err = i.ipv6Client.Insert(iptablesFilterTable, iptablesForwardChain, 1, rule...) + if err != nil { + return err + } + i.rules[ipv6][ipv6Forwarding] = rule - rule = append(iptablesDefaultNatRule, ipv6Nat) - err = i.ipv6Client.Insert(iptablesNatTable, iptablesPostRoutingChain, 1, rule...) - if err != nil { - return err + rule = append(iptablesDefaultNatRule, ipv6Nat) + err = i.ipv6Client.Insert(iptablesNatTable, iptablesPostRoutingChain, 1, rule...) + if err != nil { + return err + } + i.rules[ipv6][ipv6Nat] = rule } - i.rules[ipv6][ipv6Nat] = rule return nil } @@ -177,35 +189,39 @@ func (i *iptablesManager) cleanJumpRules() error { var err error errMSGFormat := "iptables: failed cleaning rule from %s chain %s,err: %v" rule, found := i.rules[ipv4][ipv4Forwarding] - if found { - log.Debugf("iptables: removing %s rule: %s ", ipv4, ipv4Forwarding) - err = i.ipv4Client.DeleteIfExists(iptablesFilterTable, iptablesForwardChain, rule...) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv4, iptablesForwardChain, err) + if i.ipv4Client != nil { + if found { + log.Debugf("iptables: removing %s rule: %s ", ipv4, ipv4Forwarding) + err = i.ipv4Client.DeleteIfExists(iptablesFilterTable, iptablesForwardChain, rule...) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv4, iptablesForwardChain, err) + } } - } - rule, found = i.rules[ipv4][ipv4Nat] - if found { - log.Debugf("iptables: removing %s rule: %s ", ipv4, ipv4Nat) - err = i.ipv4Client.DeleteIfExists(iptablesNatTable, iptablesPostRoutingChain, rule...) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv4, iptablesPostRoutingChain, err) + rule, found = i.rules[ipv4][ipv4Nat] + if found { + log.Debugf("iptables: removing %s rule: %s ", ipv4, ipv4Nat) + err = i.ipv4Client.DeleteIfExists(iptablesNatTable, iptablesPostRoutingChain, rule...) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv4, iptablesPostRoutingChain, err) + } } } - rule, found = i.rules[ipv6][ipv6Forwarding] - if found { - log.Debugf("iptables: removing %s rule: %s ", ipv6, ipv6Forwarding) - err = i.ipv6Client.DeleteIfExists(iptablesFilterTable, iptablesForwardChain, rule...) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv6, iptablesForwardChain, err) + if i.ipv6Client == nil { + rule, found = i.rules[ipv6][ipv6Forwarding] + if found { + log.Debugf("iptables: removing %s rule: %s ", ipv6, ipv6Forwarding) + err = i.ipv6Client.DeleteIfExists(iptablesFilterTable, iptablesForwardChain, rule...) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv6, iptablesForwardChain, err) + } } - } - rule, found = i.rules[ipv6][ipv6Nat] - if found { - log.Debugf("iptables: removing %s rule: %s ", ipv6, ipv6Nat) - err = i.ipv6Client.DeleteIfExists(iptablesNatTable, iptablesPostRoutingChain, rule...) - if err != nil { - return fmt.Errorf(errMSGFormat, ipv6, iptablesPostRoutingChain, err) + rule, found = i.rules[ipv6][ipv6Nat] + if found { + log.Debugf("iptables: removing %s rule: %s ", ipv6, ipv6Nat) + err = i.ipv6Client.DeleteIfExists(iptablesNatTable, iptablesPostRoutingChain, rule...) + if err != nil { + return fmt.Errorf(errMSGFormat, ipv6, iptablesPostRoutingChain, err) + } } } return nil