/// <summary>
        /// Gets an array of chain specific rules from iptables-save output
        /// and parse them as an IptableChain
        /// Chain specific rules, are all the rules (include policy) of the same chain
        /// </summary>
        /// <param name="chain">Chain specific rules</param>
        /// <returns>IptablesChain</returns>
        public static IptablesChain ParseChain(string[] chain)
        {
            var    rules           = new List <IptableRule>();
            string chainHeaderLine = chain.First(l => l.StartsWith(":")); //Get's the chain header line ":<ChainName> <defaultaction> [bytesin:bytesou]

            int priority = 0;

            foreach (var line in chain)
            {
                if (line.StartsWith("-"))
                {
                    rules.Add(IptableRule.ParseRuleFromIptablesSaveLine(line, priority));
                    priority++;
                }
            }

            var name = GetChainNameFromLine(chainHeaderLine);
            var defaultPolicyRule = GetChainDefaultPolicyRule(chainHeaderLine, priority);

            if (defaultPolicyRule != null)
            {
                rules.Add(GetChainDefaultPolicyRule(chainHeaderLine, priority));
            }

            return(new IptablesChain(name, rules));
        }
        /// <summary>
        /// Creates a rule based on the chain's default action (policy)
        /// </summary>
        /// <param name="chainHeaderLine">The chain policy line output from iptables-save</param>
        /// <param name="priority">Rule priority</param>
        /// <returns>the chain's policy (default) rule</returns>
        private static IptableRule GetChainDefaultPolicyRule(string chainHeaderLine, int priority)
        {
            var actionString = ChainRegex.Matches(chainHeaderLine)[0].Groups[2].Value;

            if (actionString == "-")
            {
                return(null);
            }

            return(new IptableRule(priority, IptableRule.ParseAction(actionString), null, null));
        }