/// <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)); }