diff --git a/plist b/plist index bba087a26..cceea7c91 100644 --- a/plist +++ b/plist @@ -344,6 +344,7 @@ /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SadController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/ServiceController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SessionsController.php +/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SettingsController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SpdController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/TunnelController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/VtiController.php @@ -365,6 +366,7 @@ /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/dialogRemote.xml /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/dialogSPD.xml /usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/dialogVTI.xml +/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/settings.xml /usr/local/opnsense/mvc/app/controllers/OPNsense/Interfaces/Api/GifSettingsController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/Interfaces/Api/GreSettingsController.php /usr/local/opnsense/mvc/app/controllers/OPNsense/Interfaces/Api/LaggSettingsController.php @@ -699,6 +701,7 @@ /usr/local/opnsense/mvc/app/models/OPNsense/IDS/Migrations/M1_0_6.php /usr/local/opnsense/mvc/app/models/OPNsense/IDS/Migrations/M1_0_7.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/ACL/ACL.xml +/usr/local/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/CharonLogLevelField.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/ConnnectionField.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/IKEAdressField.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/IPsecProposalField.php @@ -710,6 +713,7 @@ /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Menu/Menu.xml /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Migrations/M1_0_0.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Migrations/M1_0_1.php +/usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Migrations/M1_0_2.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Swanctl.php /usr/local/opnsense/mvc/app/models/OPNsense/IPsec/Swanctl.xml /usr/local/opnsense/mvc/app/models/OPNsense/Interfaces/ACL/ACL.xml @@ -860,6 +864,7 @@ /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/pre_shared_keys.volt /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/sad.volt /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/sessions.volt +/usr/local/opnsense/mvc/app/views/OPNsense/IPsec/settings.volt /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/spd.volt /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/tunnels.volt /usr/local/opnsense/mvc/app/views/OPNsense/IPsec/vti.volt @@ -2196,7 +2201,6 @@ /usr/local/www/vpn_ipsec_mobile.php /usr/local/www/vpn_ipsec_phase1.php /usr/local/www/vpn_ipsec_phase2.php -/usr/local/www/vpn_ipsec_settings.php /usr/local/www/vpn_openvpn_client.php /usr/local/www/vpn_openvpn_server.php /usr/local/www/wizard.php diff --git a/src/etc/inc/plugins.inc.d/ipsec.inc b/src/etc/inc/plugins.inc.d/ipsec.inc index 4d77fe613..e6737de8a 100644 --- a/src/etc/inc/plugins.inc.d/ipsec.inc +++ b/src/etc/inc/plugins.inc.d/ipsec.inc @@ -227,9 +227,8 @@ function ipsec_devices() function ipsec_firewall(\OPNsense\Firewall\Plugin $fw) { global $config; - if ( - !isset($config['system']['disablevpnrules']) && + empty((new \OPNsense\IPsec\IPsec())->general->disablevpnrules) && isset($config['ipsec']['enable']) && isset($config['ipsec']['phase1']) ) { $enable_replyto = empty($config['system']['disablereplyto']); @@ -264,7 +263,7 @@ function ipsec_firewall(\OPNsense\Firewall\Plugin $fw) "quick" => false, "type" => "pass", "statetype" => "keep", - "#ref" => "vpn_ipsec_settings.php#disablevpnrules", + "#ref" => "ui/ipsec/connections/settings", "descr" => "IPsec: " . (!empty($ph1ent['descr']) ? $ph1ent['descr'] : $rgip) ); @@ -923,25 +922,8 @@ function ipsec_write_strongswan_conf() $a_phase1 = isset($config['ipsec']['phase1']) ? $config['ipsec']['phase1'] : []; $a_phase2 = isset($config['ipsec']['phase2']) ? $config['ipsec']['phase2'] : []; $a_client = isset($config['ipsec']['client']) ? $config['ipsec']['client'] : []; - $strongswanTree = [ - '# Automatically generated, please do not modify' => '', - 'starter' => [ - 'load_warning' => 'no' - ], - 'charon' => [ - 'threads' => 16, - 'ikesa_table_size' => 32, - 'ikesa_table_segments' => 4, - 'init_limit_half_open' => 1000, - 'ignore_acquire_ts' => 'yes', - 'syslog' => [ - 'identifier' => 'charon', - 'daemon' => [ - 'ike_name' => 'yes' - ] - ] - ] - ]; + + $strongswanTree = (new \OPNsense\IPsec\IPsec())->strongswanTree(); foreach ($a_phase1 as $ph1ent) { if (isset($ph1ent['disabled'])) { @@ -958,21 +940,6 @@ function ipsec_write_strongswan_conf() if (isset($a_client['enable']) && isset($a_client['net_list'])) { $strongswanTree['charon']['cisco_unity'] = 'yes'; } - if (!empty($config['ipsec']['max_ikev1_exchanges'])) { - $strongswanTree['charon']['max_ikev1_exchanges'] = $config['ipsec']['max_ikev1_exchanges']; - } - - // Debugging configuration - // lkey is the log key, which is a three-letter abbreviation of the subsystem to log, e.g. `ike`. - // The value will be a number between -1 (silent) and 4 (highest verbosity). - foreach (array_keys(IPSEC_LOG_SUBSYSTEMS) as $lkey) { - if ( - isset($config['ipsec']["ipsec_{$lkey}"]) && is_numeric($config['ipsec']["ipsec_{$lkey}"]) && - array_key_exists(intval($config['ipsec']["ipsec_{$lkey}"]), IPSEC_LOG_LEVELS) - ) { - $strongswanTree['charon']['syslog']['daemon'][$lkey] = $config['ipsec']["ipsec_{$lkey}"]; - } - } $strongswanTree['charon']['plugins'] = []; @@ -1282,6 +1249,7 @@ function ipsec_configure_do($verbose = false, $interface = '') return; } } + $ipsec_mdl = new \OPNsense\IPsec\IPsec(); /* configure VTI if needed */ ipsec_configure_vti(); @@ -1289,12 +1257,13 @@ function ipsec_configure_do($verbose = false, $interface = '') ipsec_setup_pinghosts(); // Prefer older IPsec SAs (advanced setting) - if (isset($config['ipsec']['preferoldsa'])) { + if (!empty((string)$ipsec_mdl->general->preferred_oldsa)) { set_single_sysctl('net.key.preferred_oldsa', '-30'); } else { set_single_sysctl('net.key.preferred_oldsa', '0'); } + $ipseccfg = $config['ipsec'] ?? []; $a_phase1 = isset($config['ipsec']['phase1']) ? $config['ipsec']['phase1'] : []; $a_phase2 = isset($config['ipsec']['phase2']) ? $config['ipsec']['phase2'] : []; @@ -1333,14 +1302,14 @@ function ipsec_configure_do($verbose = false, $interface = '') $swanctl = (new \OPNsense\IPsec\Swanctl())->getConfig(); $swanctl['secrets'] = ipsec_write_secrets(); - if (!empty($config['ipsec']['passthrough_networks'])) { + if ((string)$ipsec_mdl->general->passthrough_networks) { $swanctl['connections']['pass'] = [ 'remote_addrs' => '127.0.0.1', 'unique' => 'replace', 'children' => [ 'pass' => [ - 'local_ts' => $config['ipsec']['passthrough_networks'], - 'remote_ts' => $config['ipsec']['passthrough_networks'], + 'local_ts' => (string)$ipsec_mdl->general->passthrough_networks, + 'remote_ts' => (string)$ipsec_mdl->general->passthrough_networks, 'mode' => 'pass', 'start_action' => 'route' ] diff --git a/src/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SettingsController.php b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SettingsController.php new file mode 100644 index 000000000..7a38bcb81 --- /dev/null +++ b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SettingsController.php @@ -0,0 +1,55 @@ + [ + 'general' => $data[self::$internalModelName]['general'], + 'charon' => $data[self::$internalModelName]['charon'], + ] + ]; + } +} diff --git a/src/opnsense/mvc/app/controllers/OPNsense/IPsec/ConnectionsController.php b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/ConnectionsController.php index e273641a9..c7dfa4574 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/IPsec/ConnectionsController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/ConnectionsController.php @@ -39,4 +39,10 @@ class ConnectionsController extends \OPNsense\Base\IndexController $this->view->formDialogChild = $this->getForm('dialogChild'); $this->view->formDialogPool = $this->getForm('dialogPool'); } + + public function settingsAction() + { + $this->view->pick('OPNsense/IPsec/settings'); + $this->view->formSettings = $this->getForm('settings'); + } } diff --git a/src/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/settings.xml b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/settings.xml new file mode 100644 index 000000000..1864db80b --- /dev/null +++ b/src/opnsense/mvc/app/controllers/OPNsense/IPsec/forms/settings.xml @@ -0,0 +1,200 @@ +
\ No newline at end of file diff --git a/src/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/CharonLogLevelField.php b/src/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/CharonLogLevelField.php new file mode 100644 index 000000000..8c12deaa8 --- /dev/null +++ b/src/opnsense/mvc/app/models/OPNsense/IPsec/FieldTypes/CharonLogLevelField.php @@ -0,0 +1,69 @@ +internalOptionList = [ + "-1" => gettext("Absolutely silent"), + "0" => gettext("Very basic auditing logs, (e.g. SA up/SA down)"), + "1" => gettext("Generic control flow with errors (default)"), + "2" => gettext("More detailed debugging control flow"), + "3" => gettext("Including RAW data dumps in hex"), + "4" => gettext("Also include sensitive material in dumps, e.g. keys"), + ]; + + return parent::actionPostLoadingEvent(); + } +} diff --git a/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.php b/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.php index 48c39fa18..a918fcf65 100644 --- a/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.php +++ b/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.php @@ -183,4 +183,31 @@ class IPsec extends BaseModel 'type' => $keyType ]; } + + private function traverseItems($node) + { + $result = []; + foreach ($node->iterateItems() as $key => $item) { + if ($item->isContainer()) { + $result[$key] = $this->traverseItems($item); + } elseif (is_a($item, "OPNsense\\Base\\FieldTypes\\BooleanField")) { + $result[$key] = !empty((string)$item) ? 'yes' : 'no'; + } else { + $result[$key] = (string)$item; + } + } + return $result; + } + + public function strongswanTree() + { + $result = [ + '# Automatically generated, please do not modify' => '', + 'starter' => [ + 'load_warning' => 'no' + ], + 'charon' => $this->traverseItems($this->charon) + ]; + return $result; + } } diff --git a/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.xml b/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.xml index a9bdbe071..fbcade759 100644 --- a/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.xml +++ b/src/opnsense/mvc/app/models/OPNsense/IPsec/IPsec.xml @@ -1,13 +1,92 @@