summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErmal LUÇI <eri@pfsense.org>2015-01-13 16:38:12 +0100
committerErmal LUÇI <eri@pfsense.org>2015-01-13 19:57:28 +0100
commitb40137258e69f31a94366eff7ee32722a4f344b1 (patch)
tree09bfd29212e204999895a5711a73bb8fe9b044fb
parent6db7ee23db8582d1ee06c7fff83c19a014415838 (diff)
downloadpfsense-b40137258e69f31a94366eff7ee32722a4f344b1.zip
pfsense-b40137258e69f31a94366eff7ee32722a4f344b1.tar.gz
To avoid issues with clashing SAIDs go back to specifying the reqid in strongswan config.
To be able to manage this first upgrade the config to assign each phase2 an reqid Second use that during config generation Ticket #4208
-rw-r--r--conf.default/config.xml2
-rw-r--r--etc/inc/ipsec.inc23
-rw-r--r--etc/inc/upgrade_config.inc13
-rw-r--r--etc/inc/vpn.inc4
-rw-r--r--usr/local/www/vpn_ipsec_phase2.php8
5 files changed, 49 insertions, 1 deletions
diff --git a/conf.default/config.xml b/conf.default/config.xml
index 5c0b484..bbb5acb 100644
--- a/conf.default/config.xml
+++ b/conf.default/config.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<pfsense>
- <version>11.5</version>
+ <version>11.6</version>
<lastchange/>
<theme>pfsense_ng</theme>
<system>
diff --git a/etc/inc/ipsec.inc b/etc/inc/ipsec.inc
index 3d21753..2762616 100644
--- a/etc/inc/ipsec.inc
+++ b/etc/inc/ipsec.inc
@@ -671,4 +671,27 @@ function ipsec_fixup_network($network) {
return $result;
}
+function ipsec_new_reqid() {
+ global $config;
+
+ if (!is_array($config['ipsec']) || !is_array($config['ipsec']['phase2']))
+ return;
+
+ $ipsecreqid = lock('ipsecreqids', LOCK_EX);
+ $keyids = array();
+ $keyid = 1;
+ foreach ($config['ipsec']['phase2'] as $ph2)
+ $keyids[$ph2['reqid']] = $ph2['reqid'];
+
+ for ($i = 1; $i < 16000; $i++) {
+ if (!isset($keyids[$i])) {
+ $keyid = $i;
+ break;
+ }
+ }
+ unlock($ipsecreqid);
+
+ return $keyid;
+}
+
?>
diff --git a/etc/inc/upgrade_config.inc b/etc/inc/upgrade_config.inc
index 72fc80f..690db45 100644
--- a/etc/inc/upgrade_config.inc
+++ b/etc/inc/upgrade_config.inc
@@ -3539,4 +3539,17 @@ function upgrade_114_to_115() {
$config['unbound']['custom_options'] = base64_encode($config['unbound']['custom_options']);
}
+function upgrade_115_to_116() {
+ global $config;
+
+ if (!is_array($config['ipsec']) || !is_array($config['ipsec']['phase2']))
+ return;
+
+ $keyid = 1;
+ foreach ($config['ipsec']['phase2'] as $idx => $ph2) {
+ $config['ipsec']['phase2'][$idx]['reqid'] = $keyid;
+ $keyid++;
+ }
+}
+
?>
diff --git a/etc/inc/vpn.inc b/etc/inc/vpn.inc
index dac49bc..e0a66e0 100644
--- a/etc/inc/vpn.inc
+++ b/etc/inc/vpn.inc
@@ -668,6 +668,7 @@ EOD;
$ipseclifetime = 0;
$rightsubnet_spec = array();
$leftsubnet_spec = array();
+ $reqids = array();
$ealgoAHsp2arr = array();
$ealgoESPsp2arr = array();
if (is_array($a_phase2) && count($a_phase2)) {
@@ -807,6 +808,7 @@ EOD;
}
}
+ $reqids[] = $ph2ent['reqid'];
if (!empty($ph2ent['lifetime'])) {
if ($ipseclifetime == 0 || intval($ipseclifetime) > intval($ph2ent['lifetime']))
@@ -860,6 +862,7 @@ EOD;
$ipsecfin = '';
foreach ($rightsubnet_spec as $idx => $rsubnet) {
$ipsecfin .= "\nconn con{$ph1ent['ikeid']}00{$idx}\n";
+ $ipsecfin .= "\treqid = " . $reqids[$idx] . "\n";
$ipsecfin .= $ipsecconnect;
$ipsecfin .= "\trightsubnet = {$rsubnet}\n";
$ipsecfin .= "\tleftsubnet = " . $leftsubnet_spec[$idx] . "\n";
@@ -868,6 +871,7 @@ EOD;
log_error("No phase2 specifications for tunnel with REQID = {$ikeid}");
} else {
$ipsecfin = "\nconn con{$ph1ent['ikeid']}\n";
+ $ipsecfin .= "\treqid = " . $reqids[0] . "\n";
$ipsecfin .= $ipsecconnect;
if (!empty($rightsubnet_spec)) {
$tempsubnets = array();
diff --git a/usr/local/www/vpn_ipsec_phase2.php b/usr/local/www/vpn_ipsec_phase2.php
index 6f07408..160b264 100644
--- a/usr/local/www/vpn_ipsec_phase2.php
+++ b/usr/local/www/vpn_ipsec_phase2.php
@@ -93,6 +93,7 @@ if ($ph2found === true)
$pconfig['pfsgroup'] = $ph2['pfsgroup'];
$pconfig['lifetime'] = $ph2['lifetime'];
$pconfig['pinghost'] = $ph2['pinghost'];
+ $pconfig['reqid'] = $ph2['reqid'];
if (isset($ph2['mobile']))
$pconfig['mobile'] = true;
@@ -320,6 +321,10 @@ if ($_POST) {
$ph2ent['uniqid'] = $pconfig['uniqid'];
$ph2ent['mode'] = $pconfig['mode'];
$ph2ent['disabled'] = $pconfig['disabled'] ? true : false;
+ if (!isset($pconfig['reqid']))
+ $ph2ent['reqid'] = ipsec_new_reqid();
+ else
+ $ph2ent['reqid'] = $pconfig['reqid'];
if(($ph2ent['mode'] == "tunnel") || ($ph2ent['mode'] == "tunnel6")){
if (!empty($pconfig['natlocalid_address']))
@@ -832,6 +837,9 @@ function change_protocol() {
<?php endif; ?>
<input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
<input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>" />
+ <?php if (!empty($pconfig['reqid'])): ?>
+ <input name="reqid" type="hidden" value="<?=htmlspecialchars($pconfig['reqid']);?>" />
+ <?php endif; ?>
<input name="uniqid" type="hidden" value="<?=htmlspecialchars($pconfig['uniqid']);?>" />
</td>
</tr>
OpenPOWER on IntegriCloud