diff --git a/src/etc/inc/filter.inc b/src/etc/inc/filter.inc index acb589551..30d4a8b94 100644 --- a/src/etc/inc/filter.inc +++ b/src/etc/inc/filter.inc @@ -421,6 +421,14 @@ function filter_configure_sync($verbose = false, $load_aliases = true) $limitrules .= "set timeout src.track {$config['system']['srctrack']}\n"; } + if (!empty($config['system']['syncookies'])) { + $arange = ""; + if ($config['system']['syncookies'] == "adaptive") { + $arange = "(start {$config['system']['syncookies_adaptstart']}%, end {$config['system']['syncookies_adaptend']}%)"; + } + $limitrules .= "set syncookies {$config['system']['syncookies']} {$arange}\n"; +} + $rules = "{$limitrules}\n"; $rules .= "{$aliases} \n"; $rules .= filter_setup_logging_interfaces($cnfint); diff --git a/src/www/system_advanced_firewall.php b/src/www/system_advanced_firewall.php index 6c90248fd..8772ce2bc 100644 --- a/src/www/system_advanced_firewall.php +++ b/src/www/system_advanced_firewall.php @@ -60,6 +60,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $pconfig['enablenatreflectionhelper'] = isset($config['system']['enablenatreflectionhelper']) ? $config['system']['enablenatreflectionhelper'] : null; $pconfig['bypassstaticroutes'] = isset($config['filter']['bypassstaticroutes']); $pconfig['ip_change_kill_states'] = isset($config['system']['ip_change_kill_states']); + $pconfig['syncookies'] = isset($config['system']['syncookies']) ? $config['system']['syncookies'] : null; + $pconfig['syncookies_adaptstart'] = isset($config['system']['syncookies_adaptstart']) ? $config['system']['syncookies_adaptstart'] : null; + $pconfig['syncookies_adaptend'] = isset($config['system']['syncookies_adaptend']) ? $config['system']['syncookies_adaptend'] : null; } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { $pconfig = $_POST; $input_errors = array(); @@ -86,6 +89,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (!empty($pconfig['maximumtableentries']) && !is_numericint($pconfig['maximumtableentries'])) { $input_errors[] = gettext("The Firewall Maximum Table Entries value must be an integer."); } + + if (!empty($pconfig['syncookies'])) { + if (!in_array($pconfig['syncookies'], ['always', 'adaptive'])) { + $input_errors[] = sprintf(gettext("Unknown syncookie type %s.", $pconfig['syncookies'])); + } + if ((empty($pconfig['syncookies_adaptstart']) && !empty($pconfig['syncookies_adaptstart'])) || (!empty($pconfig['syncookies_adaptstart']) && empty($pconfig['syncookies_adaptend']))) { + $input_errors[] = gettext("Syncookie Adaptive values must be set together."); + } + if (!empty($pconfig['syncookies_adaptstart']) && !is_numericint($pconfig['syncookies_adaptstart'])) { + $input_errors[] = gettext("Syncookie Adaptive Start value must be an integer."); + } + if (!empty($pconfig['syncookies_adaptend']) && !is_numericint($pconfig['syncookies_adaptend'])) { + $input_errors[] = gettext("Syncookie Adaptive End value must be an integer."); + } + if (!empty($pconfig['syncookies_adaptend']) && !empty($pconfig['syncookies_adaptstart']) && $pconfig['syncookies_adaptstart'] < $pconfig['syncookies_adaptend']) { + $input_errors[] = gettext("Syncookie Adaptive Start must be a higher value than End."); + } + } if (count($input_errors) == 0) { if (!empty($pconfig['pf_share_forward'])) { $config['system']['pf_share_forward'] = true; @@ -211,6 +232,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { unset($config['system']['ip_change_kill_states']); } + if (!empty($pconfig['syncookies'])) { + $config['system']['syncookies'] = $pconfig['syncookies']; + $config['system']['syncookies_adaptstart'] = $pconfig['syncookies_adaptstart']; + $config['system']['syncookies_adaptend'] = $pconfig['syncookies_adaptend']; + } else { + unset($config['system']['syncookies']); + unset($config['system']['syncookies_adaptstart']); + unset($config['system']['syncookies_adaptend']); + } + write_config(); $savemsg = get_std_save_message(); @@ -228,6 +259,14 @@ include("head.inc");
@@ -641,6 +680,57 @@ include("head.inc"); +