func()

in pkg/networkutils/network.go [378:421]


func (n *linuxNetwork) CleanUpStaleAWSChains(v4Enabled, v6Enabled bool) error {
	ipProtocol := iptables.ProtocolIPv4
	if v6Enabled {
		ipProtocol = iptables.ProtocolIPv6
	}

	ipt, err := n.newIptables(ipProtocol)
	if err != nil {
		return errors.Wrap(err, "stale chain cleanup: failed to create iptables")
	}

	exists, err := ipt.ChainExists("nat", "AWS-SNAT-CHAIN-1")
	if err != nil {
		return errors.Wrap(err, "stale chain cleanup: failed to check if AWS-SNAT-CHAIN-1 exists")
	}

	if exists {
		existingChains, err := ipt.ListChains("nat")
		if err != nil {
			return errors.Wrap(err, "stale chain cleanup: failed to list iptables nat chains")
		}

		for _, chain := range existingChains {
			if !strings.HasPrefix(chain, "AWS-CONNMARK-CHAIN") && !strings.HasPrefix(chain, "AWS-SNAT-CHAIN") {
				continue
			}
			parsedChain := strings.Split(chain, "-")
			chainNum, err := strconv.Atoi(parsedChain[len(parsedChain)-1])
			if err != nil {
				return errors.Wrap(err, "stale chain cleanup: failed to convert string to int")
			}
			// Chains 1 --> x (0 indexed) will be stale
			if chainNum > 0 {
				// No need to clear the chain since computeStaleIptablesRules cleans up all rules already
				log.Infof("Deleting stale chain: %s", chain)
				err := ipt.DeleteChain("nat", chain)
				if err != nil {
					return errors.Wrapf(err, "stale chain cleanup: failed to delete chain %s", chain)
				}
			}
		}
	}
	return nil
}