From d3afd68acb8af56bdb38e2775d1424366efdf418 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 26 Dec 2017 19:20:24 +0100 Subject: [PATCH] Firewall/rule parsing. add initial SNAT implementation, for https://github.com/opnsense/core/issues/1326 --- .../app/library/OPNsense/Firewall/Plugin.php | 14 ++++ .../library/OPNsense/Firewall/SNatRule.php | 82 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/opnsense/mvc/app/library/OPNsense/Firewall/SNatRule.php diff --git a/src/opnsense/mvc/app/library/OPNsense/Firewall/Plugin.php b/src/opnsense/mvc/app/library/OPNsense/Firewall/Plugin.php index 7a84b0284..9f453b6ab 100644 --- a/src/opnsense/mvc/app/library/OPNsense/Firewall/Plugin.php +++ b/src/opnsense/mvc/app/library/OPNsense/Firewall/Plugin.php @@ -264,6 +264,20 @@ class Plugin $this->natRules[$prio][] = $rule; } + /** + * register a destination Nat rule + * @param int $prio priority + * @param array $conf configuration + */ + public function registerSNatRule($prio, $conf) + { + $rule = new SNatRule($this->interfaceMapping, $conf); + if (empty($this->natRules[$prio])) { + $this->natRules[$prio] = array(); + } + $this->natRules[$prio][] = $rule; + } + /** * register an Npt rule * @param int $prio priority diff --git a/src/opnsense/mvc/app/library/OPNsense/Firewall/SNatRule.php b/src/opnsense/mvc/app/library/OPNsense/Firewall/SNatRule.php new file mode 100644 index 000000000..eff5c55a9 --- /dev/null +++ b/src/opnsense/mvc/app/library/OPNsense/Firewall/SNatRule.php @@ -0,0 +1,82 @@ + 'parseIsComment', + 'nonat' => 'parseBool,no nat,nat', + 'log' => 'parseBool,log', + 'interface' => 'parseInterface', + 'ipprotocol' => 'parsePlain', + 'protocol' => 'parseReplaceSimple,tcp/udp:{tcp udp},proto ', + 'from' => 'parsePlain,from ', + 'to' => 'parsePlain,to ', + 'tag' => 'parsePlain, tag ', + 'tagged' => 'parsePlain, tagged ', + 'target' => 'parsePlain, -> ', + 'poolopts' => 'parsePlain', + 'staticnatport' => 'parseBool, static-port , port 1024:65535 ', + 'descr' => 'parseComment' + ); + + /** + * preprocess internal rule data to detail level of actual ruleset + * handles shortcuts, like inet46 and multiple interfaces + * @return array + */ + private function parseNatRules() + { + foreach ($this->reader() as $rule) { + if ($rule['target'] == "other-subnet") { + $rule['target'] = $rule['targetip'] . '/' . $rule['targetip_subnet']; + } + yield $rule; + } + } + + /** + * output rule as string + * @return string ruleset + */ + public function __toString() + { + $ruleTxt = ''; + foreach ($this->parseNatRules() as $rule) { + $ruleTxt .= $this->ruleToText($this->procorder, $rule). "\n"; + } + return $ruleTxt; + } +}