Project

General

Profile

Download (49.3 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2

    
3
/*
4
	vpn.inc
5
	Copyright (C) 2004 Scott Ullrich
6
	Copyright (C) 2008 Shrew Soft Inc
7
	Copyright (C) 2008 Ermal Lu?i
8
	All rights reserved.
9

    
10
	originally part of m0n0wall (http://m0n0.ch/wall)
11
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
12
	All rights reserved.
13

    
14
	Redistribution and use in source and binary forms, with or without
15
	modification, are permitted provided that the following conditions are met:
16

    
17
	1. Redistributions of source code must retain the above copyright notice,
18
	   this list of conditions and the following disclaimer.
19

    
20
	2. Redistributions in binary form must reproduce the above copyright
21
	   notice, this list of conditions and the following disclaimer in the
22
	   documentation and/or other materials provided with the distribution.
23

    
24
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
25
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
26
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
28
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
	POSSIBILITY OF SUCH DAMAGE.
34
*/
35

    
36
/*
37
	pfSense_BUILDER_BINARIES:	/usr/bin/killall	/usr/local/sbin/sasyncd	/sbin/ifconfig	/sbin/sysctl
38
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/setkey	/sbin/route	/bin/mkdir
39
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/racoonctl	/usr/local/sbin/racoon
40
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/filterdns	/usr/local/sbin/mpd4	
41
	pfSense_MODULE:	vpn
42
*/
43

    
44
/* include all configuration functions */
45

    
46
function vpn_ipsec_failover_configure() {
47
	global $config, $g;
48

    
49

    
50
	if (is_array($config['installedpackages']['sasyncd'])) {
51
		$sasyncd_text = "";
52
		foreach ($config['installedpackages']['sasyncd']['config'] as $sasyncd) {
53
			$enabled = isset ($sasyncd['enable']);
54
			if (!$enabled)
55
				return;
56
			if ($sasyncd['peerip'] <> "")
57
				$sasyncd_text .= "peer {$sasyncd['peerip']}\n";
58
			if ($sasyncd['interface'])
59
				$sasyncd_text .= "carp interface {$sasyncd['interface']}\n";
60
			if ($sasyncd['sharedkey'] <> "")
61
				$sasyncd_text .= "sharedkey {$sasyncd['sharedkey']}\n";
62
			if ($sasyncd['mode'] <> "")
63
				$sasyncd_text .= "mode {$sasyncd['mode']}\n";
64
			if ($sasyncd['listenon'] <> "")
65
				$sasyncd_text .= "listen on {$sasyncd['listenon']}\n";
66
			if ($sasyncd['flushmodesync'] <> "")
67
				$sasyncd_text .= "flushmode sync {$sasyncd['flushmodesync']}\n";
68
		}
69

    
70
		file_put_contents("{$g['varetc_path']}/sasyncd.conf", $sasyncd_text);
71
		chmod("{$g['varetc_path']}/sasyncd.conf", 0600);
72

    
73
		if(is_process_running("sasyncd"))
74
			mwexec("killall sasyncd", true);
75

    
76
		/* launch sasyncd, oh wise one */
77
		mwexec_bg("/usr/local/sbin/sasyncd -d -v -v -v");
78
	}
79
}
80

    
81
function vpn_ipsec_configure($ipchg = false)
82
{
83
	global $config, $g, $sa, $sn, $p1_ealgos, $p2_ealgos;
84

    
85
	/* get the automatic ping_hosts.sh ready */
86
	unlink_if_exists("{$g['vardb_path']}/ipsecpinghosts");
87
	touch("{$g['vardb_path']}/ipsecpinghosts");
88

    
89
	vpn_ipsec_configure_preferoldsa();
90

    
91
	$syscfg = $config['system'];
92
	$ipseccfg = $config['ipsec'];
93
	$a_phase1 = $config['ipsec']['phase1'];
94
	$a_phase2 = $config['ipsec']['phase2'];
95
	$a_client = $config['ipsec']['client'];
96

    
97
	if (!isset($ipseccfg['enable'])) {
98
		mwexec("/sbin/ifconfig enc0 down");
99

    
100
		/* send a SIGKILL to be sure */
101
		sigkillbypid("{$g['varrun_path']}/racoon.pid", "KILL");
102

    
103
		/* kill racoon */
104
		if(is_process_running("racoon"))
105
			mwexec("/usr/bin/killall racoon", true);
106
		killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
107

    
108
		/* wait for racoon process to die */
109
		sleep(2);
110

    
111
		/* flush SPD and SAD */
112
		mwexec("/usr/local/sbin/setkey -F");
113
		mwexec("/usr/local/sbin/setkey -FP");
114

    
115
		/* disallow IPSEC, it is off */
116
		exec("/sbin/sysctl net.inet.ip.ipsec_in_use=0");
117

    
118
		return true;
119
	} else {
120
		mwexec("/sbin/ifconfig enc0 up");
121
		mwexec("/sbin/sysctl net.inet.ip.ipsec_in_use=1");
122

    
123
		if ($g['booting'])
124
			echo "Configuring IPsec VPN... ";
125

    
126
		/* fastforwarding is not compatible with ipsec tunnels */
127
		mwexec("/sbin/sysctl net.inet.ip.fastforwarding=0");
128

    
129
		/* resolve all local, peer addresses and setup pings */
130
		$ipmap = array();
131
		$rgmap = array();
132
		$filterdns_list = array();
133
		if (is_array($a_phase1) && count($a_phase1)) {
134

    
135
			$ipsecpinghosts = "";
136
			/* step through each phase1 entry */
137
			foreach ($a_phase1 as $ph1ent) {
138
				if (isset($ph1ent['disabled']))
139
					continue;
140

    
141
				$ep = ipsec_get_phase1_src($ph1ent);
142
				if (!$ep)
143
					continue;
144

    
145
				if(!in_array($ep,$ipmap))
146
					$ipmap[] = $ep;
147

    
148
				/* see if this tunnel has a hostname for the remote-gateway. If so,
149
				   try to resolve it now and add it to the list for filterdns */
150

    
151
				if (isset ($ph1ent['mobile']))
152
					continue;
153

    
154
				$rg = $ph1ent['remote-gateway'];
155

    
156
				if (!is_ipaddr($rg)) {
157
					$filterdns_list[] = "{$rg}";
158
					add_hostname_to_watch($rg);
159
					if(! $g['booting'])
160
						$rg = resolve_retry($rg);
161
					if (!is_ipaddr($rg))
162
						continue;
163
				}
164
				if(array_search($rg, $rgmap)) {
165
					log_error("The remote gateway {$rg} already exists on another phase 1 entry");
166
					continue;
167
				}
168
				$rgmap[$ph1ent['remote-gateway']] = $rg;
169

    
170
				/* step through each phase2 entry */
171
				foreach ($a_phase2 as $ph2ent) {
172

    
173
					$ikeid = $ph2ent['ikeid'];
174

    
175
					if (isset($ph2ent['disabled']))
176
						continue;
177

    
178
					if ($ikeid != $ph1ent['ikeid'])
179
						continue;
180

    
181
					/* add an ipsec pinghosts entry */
182
					if ($ph2ent['pinghost']) {
183
						$iflist = get_configured_interface_list();
184
						foreach ($iflist as $ifent => $ifname) {
185
							$interface_ip = get_interface_ip($ifent);
186
							$local_subnet = ipsec_idinfo_to_cidr($ph2ent['localid'], true);
187
							if (ip_in_subnet($interface_ip, $local_subnet)) {
188
								$srcip = $interface_ip;
189
								break;
190
							}
191
						}
192
						$dstip = $ph2ent['pinghost'];
193
						if (is_ipaddr($srcip))
194
							$ipsecpinghosts .= "{$srcip}|{$dstip}|3\n";
195
					}
196
				}
197
				$pfd = fopen("{$g['vardb_path']}/ipsecpinghosts", "w");
198
				if ($pfd) {
199
					fwrite($pfd, $ipsecpinghosts);
200
					fclose($pfd);
201
				}
202
				
203
			}
204
		}
205

    
206
		/* generate CA certificates files */
207
		if (is_array($config['ca']) && count($config['ca'])) {
208
			foreach ($config['ca'] as $ca) {
209
				if (!isset($ca['crt'])) {
210
					log_error("Error: Invalid certificate info for {$ca['descr']}");
211
					continue;
212
				}
213
				$cert = base64_decode($ca['crt']);
214
				$x509cert = openssl_x509_parse(openssl_x509_read($cert));
215
				if (!is_array($x509cert) || !isset($x509cert['hash'])) {
216
					log_error("Error: Invalid certificate hash info for {$ca['descr']}");
217
					continue;
218
				}
219
				$fname = $g['varetc_path']."/".$x509cert['hash'].".0";
220
				if (!file_put_contents($fname, $cert)) {
221
					log_error("Error: Cannot write IPsec CA file for {$ca['descr']}");
222
					continue;
223
				}
224
			}
225
		}
226
		
227
		/* generate psk.txt */
228
		$fd = fopen("{$g['varetc_path']}/psk.txt", "w");
229
		if (!$fd) {
230
			printf("Error: cannot open psk.txt in vpn_ipsec_configure().\n");
231
			return 1;
232
		}
233

    
234
		$pskconf = "";
235

    
236
		if (is_array($a_phase1) && count($a_phase1)) {
237
			foreach ($a_phase1 as $ph1ent) {
238

    
239
				if (isset($ph1ent['disabled']))
240
					continue;
241

    
242
				if (strstr($ph1ent['authentication_method'],'rsa'))
243
					continue;
244

    
245
				$peerid_type = $ph1ent['peerid_type'];
246

    
247
				switch ($peerid_type) {
248
					case "peeraddress":
249
						$peerid_type = "address";
250
						$peerid_data = $rgmap[$ph1ent['remote-gateway']];
251
						break;
252

    
253
					case "address";
254
						$peerid_data = $ph1ent['peerid_data'];
255
						break;
256

    
257
					case "fqdn";
258
					case "keyid tag";
259
					case "user_fqdn";
260
						$peerid_data = $ph1ent['peerid_data'];
261
						break;
262
				}
263

    
264
				if (!empty($peerid_data) && !empty($ph1ent['pre-shared-key']))
265
					$pskconf .= trim($peerid_data) . "\t" . trim($ph1ent['pre-shared-key']) . "\n";
266
			}
267
		}
268

    
269
		/* Add user PSKs */
270
		foreach ($config['system']['user'] as $user) {
271
			if (!empty($user['ipsecpsk'])) {
272
				$pskconf .= "{$user['name']}\t{$user['ipsecpsk']}\n";
273
			}
274
		}
275

    
276
		/* add PSKs for mobile clients */
277
		if (is_array($ipseccfg['mobilekey'])) {
278
			foreach ($ipseccfg['mobilekey'] as $key) {
279
				$pskconf .= "{$key['ident']}\t{$key['pre-shared-key']}\n";
280
			}
281
		}
282

    
283
		fwrite($fd, $pskconf);
284
		fclose($fd);
285
		chmod("{$g['varetc_path']}/psk.txt", 0600);
286
			
287
		/* begin racoon.conf */
288
		if ((is_array($a_phase1) && count($a_phase1)) ||
289
			(is_array($a_phase2) && count($a_phase2))) {
290

    
291
			$fd = fopen("{$g['varetc_path']}/racoon.conf", "w");
292
			if (!$fd) {
293
				printf("Error: cannot open racoon.conf in vpn_ipsec_configure().\n");
294
				return 1;
295
			}
296

    
297
			$racoonconf = "# This file is automatically generated. Do not edit\n";			
298
			$racoonconf .= "path pre_shared_key \"{$g['varetc_path']}/psk.txt\";\n\n";
299
			$racoonconf .= "path certificate  \"{$g['varetc_path']}\";\n\n";
300

    
301
			/* begin listen section */
302
			if (count($ipmap)) {
303
				$racoonconf .= "\nlisten\n";
304
				$racoonconf .= "{\n";
305
				$racoonconf .= "	adminsock \"/var/db/racoon/racoon.sock\" \"root\" \"wheel\" 0660;\n";
306
				foreach ($ipmap as $addr) {
307
					$racoonconf .= "\tisakmp {$addr} [500];\n";
308
					$racoonconf .= "\tisakmp_natt {$addr} [4500];\n";
309
				}
310
				$racoonconf .= "}\n\n";
311
			}
312

    
313
			/* begin mode_cfg section */
314
			if (is_array($a_client) && isset($a_client['enable'])) {
315

    
316
				$racoonconf .= "\nmode_cfg\n";
317
				$racoonconf .= "{\n";
318

    
319
				if ($a_client['user_source'])
320
					$racoonconf .= "\tauth_source {$a_client['user_source']};\n";
321
				if ($a_client['group_source'])
322
					$racoonconf .= "\tgroup_source {$a_client['group_source']};\n";
323

    
324
				if ($a_client['pool_address'] && $a_client['pool_netbits']) {
325
					$pool_address = $a_client['pool_address'];
326
					$pool_netmask = gen_subnet_mask($a_client['pool_netbits']);
327

    
328
					$pool_address = long2ip32(ip2long($pool_address)+1);
329
					$pool_size = (~ip2long($pool_netmask) & 0xFFFFFFFF) - 2;
330

    
331
					$racoonconf .= "\tpool_size {$pool_size};\n";
332
					$racoonconf .= "\tnetwork4 {$pool_address};\n";
333
					$racoonconf .= "\tnetmask4 {$pool_netmask};\n";
334
				}
335

    
336
				if (isset($a_client['net_list'])) {
337

    
338
					$net_list = '';
339

    
340
					foreach ($a_phase2 as $ph2ent) {
341

    
342
						if (isset($ph2ent['disabled']))
343
							continue;
344

    
345
						if (!isset($ph2ent['mobile']))
346
							continue;
347

    
348
						$localid = ipsec_idinfo_to_cidr($ph2ent['localid'],true);
349

    
350
						if ($net_list)
351
							$net_list .= ", ";
352
						$net_list .= $localid;
353
					}
354

    
355
					if ($net_list)
356
						$racoonconf .= "\tsplit_network include {$net_list};\n";
357
				}
358

    
359
				if ($a_client['dns_server1'])
360
					$racoonconf .= "\tdns4 {$a_client['dns_server1']};\n";
361
				if ($a_client['dns_server2'])
362
					$racoonconf .= "\tdns4 {$a_client['dns_server2']};\n";
363
				if ($a_client['dns_server3'])
364
					$racoonconf .= "\tdns4 {$a_client['dns_server3']};\n";
365
				if ($a_client['dns_server4'])
366
					$racoonconf .= "\tdns4 {$a_client['dns_server4']};\n";
367

    
368
				if ($a_client['wins_server1'])
369
					$racoonconf .= "\twins4 {$a_client['wins_server1']};\n";
370
				if ($a_client['wins_server2'])
371
					$racoonconf .= "\twins4 {$a_client['wins_server2']};\n";
372

    
373
				if ($a_client['dns_domain']) {
374
					$racoonconf .= "\tdefault_domain \"{$a_client['dns_domain']}\";\n";
375
					$racoonconf .= "\tsplit_dns \"{$a_client['dns_domain']}\";\n";
376
				}
377

    
378
				if ($a_client['pfs_group'])
379
					$racoonconf .= "\tpfs_group {$a_client['pfs_group']};\n";
380

    
381
				if ($a_client['login_banner']) {
382
					$fn = "{$g['varetc_path']}/racoon.motd";
383
					$fd1 = fopen($fn, "w");
384
					if (!$fd1) {
385
						printf("Error: cannot open server{$fn} in vpn.\n");
386
						return 1;
387
					}
388

    
389
					fwrite($fd1, $a_client['login_banner']);
390
					fclose($fd1);
391

    
392
					$racoonconf .= "\tbanner \"{$fn}\";\n";
393
				}
394

    
395
				if (isset($a_client['save_passwd']))
396
					$racoonconf .= "\tsave_passwd on;\n";
397

    
398
				$racoonconf .= "}\n\n";
399
			}
400
			/* end mode_cfg section */
401

    
402
			/* begin remote sections */
403
			if (is_array($a_phase1) && count($a_phase1)) {
404
				/* begin remote */
405
				foreach ($a_phase1 as $ph1ent) {
406

    
407
					if (isset($ph1ent['disabled']))
408
						continue;
409

    
410
					if (isset($ph1ent['mobile']) && !isset($a_client['enable']))
411
						continue;
412

    
413
					$ikeid = $ph1ent['ikeid'];
414

    
415
					$ep = ipsec_get_phase1_src($ph1ent);
416
					if (!$ep)
417
						continue;
418

    
419
					if (!isset($ph1ent['mobile'])) {
420
						$rgip = $rgmap[$ph1ent['remote-gateway']];
421
						if (!$rgip)
422
							continue;
423
					}
424

    
425
					$myid_type = $ph1ent['myid_type'];
426

    
427
					switch ($myid_type) {
428

    
429
						case "myaddress":
430
							$myid_type = "address";
431
							$myid_data = $ep;
432
							break;
433

    
434
						case "dyn_dns":
435
							$myid_type = "address";
436
							$myid_data = gethostbyname($ph1ent['myid_data']);
437
							break;
438

    
439
						case "address";
440
							$myid_data = $ph1ent['myid_data'];
441
							break;
442

    
443
						case "fqdn";
444
						case "keyid tag";
445
						case "user_fqdn";
446
						case "asn1dn";
447
							$myid_data = $ph1ent['myid_data'];
448
							if( $myid_data )
449
								$myid_data = "\"".$myid_data."\"";
450
							break;
451
					}
452

    
453
					$peerid_type = $ph1ent['peerid_type'];
454

    
455
					switch ($peerid_type) {
456
						case "peeraddress":
457
							$peerid_type = "address";
458
							$peerid_data = $rgip;
459
							break;
460

    
461
						case "address";
462
							$peerid_data = $ph1ent['peerid_data'];
463
							break;
464

    
465
						case "fqdn";
466
						case "keyid tag";
467
						case "user_fqdn";
468
						case "asn1dn";
469
							$peerid_data = $ph1ent['peerid_data'];
470
							if( $peerid_data )
471
								$peerid_data = "\"".$peerid_data."\"";
472
							break;
473
					}
474

    
475
					$natt = "off";
476
					if (isset($ph1ent['nat_traversal']))
477
						$natt = $ph1ent['nat_traversal'];
478

    
479
					$init = "on";
480
					$genp = !empty($ph1ent['generate_policy']) ? $ph1ent['generate_policy'] : "off";
481
					$pcheck = !empty($ph1ent['proposal_check']) ? $ph1ent['proposal_check'] : $pcheck = "claim";
482
					$passive = "";
483
					if (isset($ph1ent['mobile'])) {
484
						$rgip = "anonymous";
485
						$passive = "passive on;";
486
						/* Mimic 1.2.3's behavior for pure-psk mobile tunnels */
487
						if ($ph1ent['authentication_method'] == "pre_shared_key") {
488
							$pcheck = !empty($ph1ent['proposal_check']) ? $ph1ent['proposal_check'] : $pcheck = "obey";
489
							$genp = !empty($ph1ent['generate_policy']) ? $ph1ent['generate_policy'] : "on";
490
						} else {
491
							$init = "off";
492
							$genp = !empty($ph1ent['generate_policy']) ? $ph1ent['generate_policy'] : "unique";
493
						}
494
					}
495

    
496
					$dpdline1 = '';
497
					$dpdline2 = '';
498
					if ($ph1ent['dpd_delay'] && $ph1ent['dpd_maxfail']) {
499
						$dpdline1 = "dpd_delay = {$ph1ent['dpd_delay']};";
500
						$dpdline2 = "dpd_maxfail = {$ph1ent['dpd_maxfail']};";
501
					}
502

    
503
					if (isset ($ph1ent['authentication_method']))
504
						$authmethod = $ph1ent['authentication_method'];
505
					else
506
						$authmethod = 'pre_shared_key';
507

    
508
					$certline = '';
509

    
510
					if (strstr($authmethod,'rsa')) {
511

    
512
						$cert = lookup_cert($ph1ent['certref']);
513

    
514
						if (!$cert)
515
						{
516
							log_error("Error: Invalid phase1 certificate reference for {$ph1ent['name']}");
517
							continue;
518
						}
519

    
520
						$certfile = "cert-".$ikeid.".crt";
521
						$certpath = $g['varetc_path']."/".$certfile;
522

    
523
						if (!file_put_contents($certpath, base64_decode($cert['crt'])))
524
						{
525
							log_error("Error: Cannot write phase1 certificate file for {$ph1ent['name']}");
526
							continue;
527
						}
528

    
529
						chmod($certpath, 0600);
530

    
531
						$keyfile = "cert-".$ikeid.".key";
532
						$keypath = $g['varetc_path']."/".$keyfile;
533

    
534
						if (!file_put_contents($keypath, base64_decode($cert['prv'])))
535
						{
536
							log_error("Error: Cannot write phase1 key file for {$ph1ent['name']}");
537
							continue;
538
						}
539

    
540
						chmod($keypath, 0600);
541

    
542
						$ca = lookup_ca($ph1ent['caref']);
543
						if ($ca) {
544
							$cafile = "ca-".$ikeid.".crt";
545
							$capath = $g['varetc_path']."/".$cafile;
546

    
547
							if (!file_put_contents($capath, base64_decode($ca['crt'])))
548
							{
549
								log_error("Error: Cannot write phase1 CA certificate file for {$ph1ent['name']}");
550
								continue;
551
							}
552

    
553
							chmod($capath, 0600);
554
							$caline = "ca_type x509 \"".basename($capath)."\";";
555
						}
556

    
557
						$certline = "certificate_type x509 \"".basename($certpath)."\" \"".basename($keypath)."\";";
558

    
559
					}
560

    
561
					$ealgos = '';
562
					$ealg_id = $ph1ent['encryption-algorithm']['name'];
563
					$ealg_kl = $ph1ent['encryption-algorithm']['keylen'];
564
					if ($ealg_kl)
565
						$ealgos = $ealgos.$ealg_id." ".$ealg_kl;
566
					else
567
						$ealgos = $ealgos.$ealg_id;
568

    
569
					$lifeline = '';
570
					if ($ph1ent['lifetime'])
571
						$lifeline = "lifetime time {$ph1ent['lifetime']} secs;";
572

    
573
					/* Only specify peer ID if we are not dealing with a mobile PSK-only tunnel */
574
					if (!(($ph1ent['authentication_method'] == "pre_shared_key") && isset($ph1ent['mobile']))) {
575
						$peerid_spec = "peers_identifier {$peerid_type} {$peerid_data};";
576
					}
577

    
578
					/* add remote section to configuration */
579

    
580
					$racoonconf .=<<<EOD
581

    
582
remote {$rgip}
583
{
584
	ph1id {$ikeid};
585
	exchange_mode {$ph1ent['mode']};
586
	my_identifier {$myid_type} {$myid_data};
587
	{$peerid_spec}
588
	ike_frag on;
589
	generate_policy = {$genp};
590
	initial_contact = {$init};
591
	nat_traversal = {$natt};
592
	{$certline}
593
	{$caline}
594
	{$dpdline1}
595
	{$dpdline2}
596
	support_proxy on;
597
	proposal_check {$pcheck};
598
	{$passive}
599

    
600
	proposal
601
	{
602
		authentication_method {$authmethod};
603
		encryption_algorithm ${ealgos};
604
		hash_algorithm {$ph1ent['hash-algorithm']};
605
		dh_group {$ph1ent['dhgroup']};
606
		${lifeline}
607
	}
608
}
609

    
610
EOD;
611
				}
612
				/* end remote */
613
			}
614
			/* end remote sections */
615
		
616
			/* begin sainfo sections */
617
			if (is_array($a_phase2) && count($a_phase2)) {
618

    
619
				/* begin sainfo */
620
				foreach ($a_phase2 as $ph2ent) {
621

    
622
					$ikeid = $ph2ent['ikeid'];
623

    
624
					if( !ipsec_lookup_phase1($ph2ent,$ph1ent))
625
						continue;
626

    
627
					if (isset($ph1ent['disabled']))
628
						continue;
629

    
630
					if (isset($ph2ent['disabled']))
631
						continue;
632

    
633
					if (isset($ph2ent['mobile']) && !isset($a_client['enable']))
634
						continue;
635

    
636
					if ($ph2ent['mode'] == 'tunnel') {
637

    
638
						$localid_type = $ph2ent['localid']['type'];
639
						$localid_data = ipsec_idinfo_to_cidr($ph2ent['localid']);
640
						/* Do not print localid in some cases, such as a pure-psk or psk/xauth single phase2 mobile tunnel */
641
						if (($localid_type == "none") ||
642
							(($ph1ent['authentication_method'] == "xauth_psk_server") ||
643
							($ph1ent['authentication_method'] == "pre_shared_key"))
644
							&& isset($ph1ent['mobile'])
645
							&& (ipsec_get_number_of_phase2($ikeid)==1))
646
							$localid_spec = " ";
647
						else {
648
							if ($localid_type != "address") {
649
								$localid_type = "subnet";
650
							}
651
							$localid_spec = $localid_type." ".$localid_data." any";
652
						}
653

    
654
						if (!isset($ph2ent['mobile'])) {
655
							$remoteid_type = $ph2ent['remoteid']['type'];
656
							if ($remoteid_type != "address")
657
								$remoteid_type = "subnet";
658

    
659
							$remoteid_data = ipsec_idinfo_to_cidr($ph2ent['remoteid']);
660
							$remoteid_spec = $remoteid_type." ".$remoteid_data." any";
661
						} else
662
							$remoteid_spec = "anonymous";
663

    
664
					} else {
665
						$rgip = $rgmap[$ph1ent['remote-gateway']];
666

    
667
						if ((($ph1ent['authentication_method'] == "xauth_psk_server") ||
668
							($ph1ent['authentication_method'] == "pre_shared_key"))
669
							&& isset($ph1ent['mobile']))
670
							$localid_spec = " ";
671
						else {
672
							$localid_data = ipsec_get_phase1_src($ph1ent);
673
							if($ph2ent['mode'] == 'transport') { $localid_data="$localid_data any"; }
674
							$localid_spec = "address {$localid_data}";
675
						}
676
						if (!isset($ph2ent['mobile'])) {
677
							$remoteid_data = $rgmap[$ph1ent['remote-gateway']];
678
							if($ph2ent['mode'] == 'transport') { $remoteid_data="$remoteid_data any"; }
679
							$remoteid_spec = "address {$remoteid_data}";
680
						} else
681
							$remoteid_spec = "anonymous";
682
					}
683

    
684
					if($ph2ent['protocol'] == 'esp') {
685

    
686
						$ealgos = '';
687

    
688
						foreach ($ph2ent['encryption-algorithm-option'] as $ealg) {
689

    
690
							$ealg_id = $ealg['name'];
691
							$ealg_kl = $ealg['keylen'];
692

    
693
							if ($ealg_kl) {
694
								if( $ealg_kl == "auto" ) {
695
									/*   This seems to be required on my system and was not reproducable
696
									 *   on other systems.   For some reason $p2_ealgos is not defined
697
									 *   and needs to be read back in!?  -sullrich Aug 26, 2009 
698
									 */
699
									if(!$p2_ealgos)
700
										require("ipsec.inc");
701
									$key_hi = $p2_ealgos[$ealg_id]['keysel']['hi'];
702
									$key_lo = $p2_ealgos[$ealg_id]['keysel']['lo'];
703
									$key_step = $p2_ealgos[$ealg_id]['keysel']['step'];
704
									/* in some cases where include ordering is suspect these variables
705
									   are somehow 0 and we enter this loop forever and timeout after 900
706
									   seconds wrecking bootup */
707
									if($key_hi != 0 and $key_lo !=0 and $key_step !=0) {
708
										for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
709
//											Uncomment the next line if you want to test the comment 5 lines up.											
710
//											echo "$keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step \n";
711
											if ($ealgos)
712
												$ealgos = $ealgos.", ";
713
											$ealgos = $ealgos.$ealg_id." ".$keylen;
714
										}
715
									}
716
								} else {
717
									if ($ealgos)
718
										$ealgos = $ealgos.", ";
719
									$ealgos = $ealgos.$ealg_id." ".$ealg_kl;
720
								}
721
							} else {
722
								if ($ealgos)
723
									$ealgos = $ealgos.", ";
724
								$ealgos = $ealgos.$ealg_id;
725
							}
726
						}
727

    
728
						$ealgosline = "encryption_algorithm {$ealgos};";
729

    
730
					} else {
731

    
732
						$ealgosline = "encryption_algorithm null_enc;";
733
					}
734

    
735
					$halgos = join(",", $ph2ent['hash-algorithm-option']);
736
					$halgosline = "authentication_algorithm {$halgos};";
737

    
738
					$pfsline = '';
739
					if ($ph2ent['pfsgroup'])
740
						$pfsline = "pfs_group {$ph2ent['pfsgroup']};";
741
					if (isset($a_client['pfs_group'])) {
742
						$pfsline = '';
743
						if ($a_client['pfs_group'])
744
							$pfsline = "pfs_group {$a_client['pfs_group']};";
745
					}
746

    
747
					$lifeline = '';
748
					if ($ph2ent['lifetime'])
749
						$lifeline = "lifetime time {$ph2ent['lifetime']} secs;";
750

    
751
					/* add sainfo section to configuration */
752
					
753
					$racoonconf .=<<<EOD
754
					
755
sainfo {$localid_spec} {$remoteid_spec}
756
{
757
	remoteid {$ikeid};
758
	{$ealgosline}
759
	{$halgosline}
760
	{$pfsline}
761
	{$lifeline}
762
	compression_algorithm deflate;
763
}
764

    
765
EOD;
766
				}
767
				/* end sainfo */
768
			}
769
			/* end sainfo sections */
770

    
771
			fwrite($fd, $racoonconf);
772
			fclose($fd);
773
		}
774
		/* end racoon.conf */
775

    
776
		/* generate IPsec policies */
777
		/* generate spd.conf */
778
		$fd = fopen("{$g['varetc_path']}/spd.conf", "w");
779
		if (!$fd) {
780
			printf("Error: cannot open spd.conf in vpn_ipsec_configure().\n");
781
			return 1;
782
		}
783

    
784
		$spdconf = "";
785
		if (is_array($a_phase2) && count($a_phase2)) {
786
			/* Try to prevent people from locking themselves out of webgui. Just in case. */
787
			if ($config['interfaces']['lan']) {
788
				$lanip = get_interface_ip("lan");
789
				if (!empty($lanip) && is_ipaddr($lanip)) {
790
					$lansn = get_interface_subnet("lan");
791
					$lansa = gen_subnet($lanip, $lansn);
792
					$spdconf .= "spdadd {$lanip}/32 {$lansa}/{$lansn} any -P out none;\n";
793
					$spdconf .= "spdadd {$lansa}/{$lansn} {$lanip}/32 any -P in none;\n";
794
				}
795
			}
796

    
797
			foreach ($a_phase2 as $ph2ent) {
798

    
799
				if( !ipsec_lookup_phase1($ph2ent,$ph1ent))
800
					continue;
801

    
802
				if (isset($ph1ent['mobile']))
803
					continue;
804

    
805
				if (isset($ph1ent['disabled']))
806
					continue;
807

    
808
				if (isset($ph2ent['disabled']))
809
					continue;
810

    
811
				$ep = ipsec_get_phase1_src($ph1ent);
812
				if (!$ep)
813
					continue;
814

    
815
				$rgip = $rgmap[$ph1ent['remote-gateway']];
816
				if(!is_ipaddr($rgip))
817
					continue;
818

    
819
				$localid = ipsec_idinfo_to_cidr($ph2ent['localid'],true);
820
				$remoteid = ipsec_idinfo_to_cidr($ph2ent['remoteid'],true);
821

    
822
				if($ph2ent['mode'] == "tunnel") {
823

    
824
					$spdconf .= "spdadd {$localid} {$remoteid} any -P out ipsec " .
825
						"{$ph2ent['protocol']}/tunnel/{$ep}-{$rgip}/unique;\n";
826

    
827
					$spdconf .= "spdadd {$remoteid} {$localid} any -P in ipsec " .
828
						"{$ph2ent['protocol']}/tunnel/{$rgip}-{$ep}/unique;\n";
829

    
830
				} else {
831

    
832
					$localid_data = ipsec_get_phase1_src($ph1ent);
833
					$remoteid_data = $rgmap[$ph1ent['remote-gateway']];
834

    
835
					$spdconf .= "spdadd {$localid_data} {$remoteid_data} any -P out ipsec " .
836
						"{$ph2ent['protocol']}/transport//require;\n";
837

    
838
					$spdconf .= "spdadd {$remoteid_data} {$localid_data} any -P in ipsec " .
839
						"{$ph2ent['protocol']}/transport//require;\n";
840

    
841
				}
842

    
843
				/* static route needed? */
844
				if (preg_match("/^carp|^vip/i", $ph1ent['interface']))
845
					$parentinterface = link_carp_interface_to_parent($ph1ent['interface']);
846
				else
847
					$parentinterface = $ph1ent['interface'];
848

    
849
				if (($parentinterface <> "wan") && (is_ipaddr($rgip))) {
850
					/* add endpoint routes to correct gateway on interface */
851
					if (interface_has_gateway($parentinterface)) {
852
						$gatewayip = get_interface_gateway("$parentinterface");
853
						$interfaceip = get_interface_ip($parentinterface);
854
						$subnet_bits = get_interface_subnet($parentinterface);
855
						$subnet_ip = gen_subnet("{$interfaceip}", "{$subnet_bits}");
856
						/* if the remote gateway is in the local subnet, then don't add a route */
857
						if (! ip_in_subnet($rgip, "{$subnet_ip}/{$subnet_bits}")) {
858
							if(is_ipaddr($gatewayip)) {
859
								/* FIXME: does adding route-to and reply-to on the in/outbound
860
								 * rules fix this? smos@ 13-01-2009 */
861
								// log_error("IPSEC interface is not WAN but {$parentinterface}, adding static route for VPN endpoint {$rgip} via {$gatewayip}");
862
								mwexec("/sbin/route change -host {$rgip} {$gatewayip}", true);
863
							}
864
						}
865
					}
866
				} else if(is_ipaddr($rgip))
867
					mwexec("/sbin/route delete -host {$rgip}", true);
868
			}
869

    
870
		}
871
		fwrite($fd, $spdconf);
872
		fclose($fd);
873

    
874
		/* needed for racoonctl admin socket */
875
		if (!is_dir("/var/db/racoon"))
876
			mkdir("/var/db/racoon/");
877
		
878
		/* mange racoon process */
879
		if (is_process_running("racoon")) {
880
			sleep("0.1");
881
			mwexec("/usr/local/sbin/racoonctl -s /var/db/racoon/racoon.sock reload-config", false);
882
			/* load SPD without flushing to be safe on config additions or changes. */
883
			mwexec("/usr/local/sbin/setkey -f {$g['varetc_path']}/spd.conf", false);
884
		} else {
885
			/* flush SA + SPD entries */
886
			mwexec("/usr/local/sbin/setkey -FP", false);
887
 			sleep("0.1");
888
			mwexec("/usr/local/sbin/setkey -F", false);
889
 			sleep("0.1");
890
 			/* start racoon */
891
			$ipsecdebug = isset($config['ipsec']['racoondebug']) ? "-d -v" : "";
892
			mwexec("/usr/local/sbin/racoon {$ipsecdebug} -f {$g['varetc_path']}/racoon.conf", false);
893
 			sleep("0.1");
894
 			/* load SPD */
895
			mwexec("/usr/local/sbin/setkey -f {$g['varetc_path']}/spd.conf", false);
896

    
897
		}
898
		/* start filterdns, if necessary */
899
		if (count($filterdns_list) > 0) {
900
			$interval = 60;
901
			if (!empty($ipseccfg['dns-interval']) && is_numeric($ipseccfg['dns-interval']))
902
				$interval = $ipseccfg['dns-interval'];
903

    
904
			$hostnames = "";
905
			array_unique($filterdns_list);
906
			foreach ($filterdns_list as $hostname)
907
				$hostnames .= "cmd {$hostname} '/usr/local/sbin/pfSctl -c \"service reload ipsecdns\"'\n";
908
			file_put_contents("{$g['varetc_path']}/filterdns-ipsec.hosts", $hostnames);
909

    
910
			killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
911
			sleep(1);
912
			mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns-ipsec.pid -i {$interval} -c {$g['varetc_path']}/filterdns-ipsec.hosts -d 1");
913
		}
914
	
915
		vpn_ipsec_failover_configure();
916

    
917
		if ($g['booting'])
918
			echo "done\n";
919
	}
920

    
921
	return 0;
922
}
923

    
924
/* Forcefully restart IPsec
925
 * This is required for when dynamic interfaces reload
926
 * For all other occasions the normal vpn_ipsec_configure()
927
 * will gracefully reload the settings without restarting
928
 */
929
function vpn_ipsec_force_reload() {
930
	global $config;
931
	global $g;
932

    
933
	$ipseccfg = $config['ipsec'];
934

    
935
	/* kill racoon */
936
	if(is_process_running("racoon"))
937
		mwexec("/usr/bin/killall racoon", true);
938

    
939
	/* wait for process to die */
940
	sleep(4);
941

    
942
	/* send a SIGKILL to be sure */
943
	sigkillbypid("{$g['varrun_path']}/racoon.pid", "KILL");
944

    
945
	/* wait for flushing to finish */
946
	sleep(1);
947

    
948
	/* if ipsec is enabled, start up again */
949
	if (isset($ipseccfg['enable'])) {
950
		log_error("Forcefully reloading IPsec racoon daemon");
951
		vpn_ipsec_configure();
952
	}
953

    
954
}
955

    
956
/* master setup for vpn (mpd) */
957
function vpn_setup() {
958
	/* start pptpd */
959
	vpn_pptpd_configure();
960

    
961
	/* start pppoe server */
962
	vpn_pppoes_configure();
963

    
964
	/* setup l2tp */
965
	vpn_l2tp_configure();
966
}
967

    
968
function vpn_netgraph_support() {
969
	$iflist = get_configured_interface_list();
970
	foreach ($iflist as $iface) {
971
		$realif = get_real_interface($iface);
972
		/* Get support for netgraph(4) from the nic */
973
		$ifinfo = pfSense_get_interface_addresses($realif);
974
		if (!empty($ifinfo) && in_array($ifinfo['iftype'], array("ether", "vlan", "bridge")))
975
                	pfSense_ngctl_attach(".", $realif);
976
	}
977
}
978

    
979
function vpn_pptpd_configure() {
980
	global $config, $g;
981

    
982
	$syscfg = $config['system'];
983
	$pptpdcfg = $config['pptpd'];
984

    
985
	if ($g['booting']) {
986
		if (!$pptpdcfg['mode'] || ($pptpdcfg['mode'] == "off"))
987
			return 0;
988

    
989
		echo "Configuring PPTP VPN service... ";
990
	} else {
991
		/* kill mpd */
992
		killbypid("{$g['varrun_path']}/pptp-vpn.pid");
993

    
994
		/* wait for process to die */
995
		sleep(3);
996

    
997
		if (is_process_running("mpd -b")) {
998
			killbypid("{$g['varrun_path']}/pptp-vpn.pid");
999
			log_error("Could not kill mpd within 3 seconds.   Trying again.");
1000
		}
1001

    
1002
		/* remove mpd.conf, if it exists */
1003
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.conf");
1004
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.links");
1005
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.secret");
1006
	}
1007

    
1008
	if (empty($pptpdcfg['n_pptp_units'])) {
1009
		log_error("Something wrong in the PPTPd configuration. Preventing starting the daemon because issues would arise.");
1010
		return; 
1011
	}
1012

    
1013
	/* make sure pptp-vpn directory exists */
1014
	if (!file_exists("{$g['varetc_path']}/pptp-vpn"))
1015
		mkdir("{$g['varetc_path']}/pptp-vpn");
1016

    
1017
	switch ($pptpdcfg['mode']) {
1018
		case 'server' :
1019
			/* write mpd.conf */
1020
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.conf", "w");
1021
			if (!$fd) {
1022
				printf("Error: cannot open mpd.conf in vpn_pptpd_configure().\n");
1023
				return 1;
1024
			}
1025

    
1026
			$mpdconf = <<<EOD
1027
pptps:
1028

    
1029
EOD;
1030

    
1031
			for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
1032
				$mpdconf .= "	load pt{$i}\n";
1033
			}
1034

    
1035
			for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
1036

    
1037
				$clientip = long2ip32(ip2long($pptpdcfg['remoteip']) + $i);
1038

    
1039
				$mpdconf .= <<<EOD
1040

    
1041
pt{$i}:
1042
	new -i pptpd{$i} pt{$i} pt{$i}
1043
	set ipcp ranges {$pptpdcfg['localip']}/32 {$clientip}/32
1044
	load pts
1045

    
1046
EOD;
1047
			}
1048

    
1049
			$mpdconf .=<<<EOD
1050

    
1051
pts:
1052
	set iface disable on-demand
1053
	set iface enable proxy-arp
1054
	set iface enable tcpmssfix
1055
	set iface idle 1800
1056
	set iface up-script /usr/local/sbin/vpn-linkup
1057
	set iface down-script /usr/local/sbin/vpn-linkdown
1058
	set bundle enable multilink
1059
	set bundle enable crypt-reqd
1060
	set link yes acfcomp protocomp
1061
	set link no pap chap
1062
	set link enable chap-msv2
1063
	set link mtu 1460
1064
	set link keep-alive 10 60
1065
	set ipcp yes vjcomp
1066
	set bundle enable compression
1067
	set ccp yes mppc
1068
	set ccp yes mpp-e128
1069
	set ccp yes mpp-stateless
1070

    
1071
EOD;
1072

    
1073
			if (!isset ($pptpdcfg['req128'])) {
1074
				$mpdconf .=<<<EOD
1075
	set ccp yes mpp-e40
1076
	set ccp yes mpp-e56
1077

    
1078
EOD;
1079
			}
1080

    
1081
			if  (isset($pptpdcfg["wins"]) && $pptpdcfg['wins'] != "")
1082
				$mpdconf  .=  "	set ipcp nbns {$pptpdcfg['wins']}\n";
1083

    
1084
			if (!empty($pptpdcfg['dns1'])) {
1085
				$mpdconf .= "	set ipcp dns " . $pptpdcfg['dns1'];
1086
				if (!empty($pptpdcfg['dns2']))
1087
					$mpdconf .= " " . $pptpdcfg['dns2'];
1088
				$mpdconf .= "\n";
1089
			} elseif (isset ($config['dnsmasq']['enable'])) {
1090
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1091
				if ($syscfg['dnsserver'][0])
1092
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1093
				$mpdconf .= "\n";
1094
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1095
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1096
			}
1097

    
1098
			if (isset ($pptpdcfg['radius']['server']['enable'])) {
1099
				$authport = (isset($pptpdcfg['radius']['server']['port']) && strlen($pptpdcfg['radius']['server']['port']) > 1) ? $pptpdcfg['radius']['server']['port'] : 1812;
1100
				$acctport = $authport + 1;
1101
				$mpdconf .=<<<EOD
1102
	set radius server {$pptpdcfg['radius']['server']['ip']} "{$pptpdcfg['radius']['server']['secret']}" {$authport} {$acctport}
1103

    
1104
EOD;
1105
			if (isset ($pptpdcfg['radius']['server2']['enable'])) {
1106
				$authport = (isset($pptpdcfg['radius']['server2']['port']) && strlen($pptpdcfg['radius']['server2']['port']) > 1) ? $pptpdcfg['radius']['server2']['port'] : 1812;
1107
				$acctport = $authport + 1;
1108
				$mpdconf .=<<<EOD
1109
	set radius server {$pptpdcfg['radius']['server2']['ip']} "{$pptpdcfg['radius']['server2']['secret']}" {$authport} {$acctport}
1110

    
1111
EOD;
1112
			}
1113
			$mpdconf .=<<<EOD
1114
	set radius retries 3
1115
	set radius timeout 10
1116
	set auth enable radius-auth
1117

    
1118
EOD;
1119

    
1120
				if (isset ($pptpdcfg['radius']['accounting'])) {
1121
					$mpdconf .=<<<EOD
1122
	set auth enable radius-acct
1123
	set radius acct-update 300
1124

    
1125
EOD;
1126
				}
1127
			}
1128

    
1129
			fwrite($fd, $mpdconf);
1130
			fclose($fd);
1131

    
1132
			/* write mpd.links */
1133
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.links", "w");
1134
			if (!$fd) {
1135
				printf("Error: cannot open mpd.links in vpn_pptpd_configure().\n");
1136
				return 1;
1137
			}
1138

    
1139
			$mpdlinks = "";
1140

    
1141
			for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
1142
				$mpdlinks .=<<<EOD
1143

    
1144
pt{$i}:
1145
	set link type pptp
1146
	set pptp enable incoming
1147
	set pptp disable originate
1148
	set pptp disable windowing
1149

    
1150
EOD;
1151
			}
1152

    
1153
			fwrite($fd, $mpdlinks);
1154
			fclose($fd);
1155

    
1156
			/* write mpd.secret */
1157
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.secret", "w");
1158
			if (!$fd) {
1159
				printf("Error: cannot open mpd.secret in vpn_pptpd_configure().\n");
1160
				return 1;
1161
			}
1162

    
1163
			$mpdsecret = "";
1164

    
1165
			if (is_array($pptpdcfg['user'])) {
1166
				foreach ($pptpdcfg['user'] as $user) {
1167
					$pass = str_replace('\\', '\\\\', $user['password']);
1168
					$pass = str_replace('"', '\"', $pass);
1169
					$mpdsecret .= "{$user['name']} \"{$pass}\" {$user['ip']}\n";
1170
				}
1171
			}
1172

    
1173
			fwrite($fd, $mpdsecret);
1174
			fclose($fd);
1175
			chmod("{$g['varetc_path']}/pptp-vpn/mpd.secret", 0600);
1176

    
1177
			vpn_netgraph_support();
1178

    
1179
			/* fire up mpd */
1180
			mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/pptp-vpn -p {$g['varrun_path']}/pptp-vpn.pid -s pptps pptps");
1181

    
1182
			break;
1183

    
1184
		case 'redir' :
1185
			break;
1186
	}
1187

    
1188
	if ($g['booting'])
1189
		echo "done\n";
1190

    
1191
	return 0;
1192
}
1193

    
1194
function vpn_pppoes_configure() {
1195
	global $config;
1196

    
1197
	if (is_array($config['pppoes']['pppoe'])) {
1198
		foreach ($config['pppoes']['pppoe'] as $pppoe)
1199
			vpn_pppoe_configure($pppoe);
1200
	}
1201
}
1202

    
1203
function vpn_pppoe_configure(&$pppoecfg) {
1204
	global $config, $g;
1205

    
1206
	$syscfg = $config['system'];
1207

    
1208
	/* create directory if it does not exist */
1209
	if (!is_dir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn"))
1210
		mkdir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn");
1211

    
1212
	if ($g['booting']) {
1213
		if (!$pppoecfg['mode'] || ($pppoecfg['mode'] == "off"))
1214
			return 0;
1215

    
1216
		echo "Configuring PPPoE VPN service... ";
1217
	} else {
1218
		/* kill mpd */
1219
		killbypid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid");
1220

    
1221
		/* wait for process to die */
1222
		sleep(2);
1223

    
1224
	}
1225

    
1226
	switch ($pppoecfg['mode']) {
1227

    
1228
		case 'server' :
1229

    
1230
			$pppoe_interface = get_real_interface($pppoecfg['interface']);
1231

    
1232
			if ($pppoecfg['paporchap'] == "chap")
1233
				$paporchap = "set link enable chap";
1234
			else
1235
				$paporchap = "set link enable pap";
1236

    
1237
			/* write mpd.conf */
1238
			$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.conf", "w");
1239
			if (!$fd) {
1240
				printf("Error: cannot open mpd.conf in vpn_pppoe_configure().\n");
1241
				return 1;
1242
			}
1243
			$mpdconf = "\n\n";
1244
			$mpdconf .= "poes:\n";
1245

    
1246
			for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
1247
				$mpdconf .= "	load poes{$pppoecfg['pppoeid']}{$i}\n";
1248
			}
1249

    
1250
			for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
1251

    
1252
				$clientip = long2ip32(ip2long($pppoecfg['remoteip']) + $i);
1253

    
1254
				if (isset($pppoecfg['radius']['radiusissueips']) && isset($pppoecfg['radius']['server']['enable'])) {
1255
					$isssue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 0.0.0.0/0";
1256
				} else {
1257
					$isssue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 {$clientip}/32";
1258
				}
1259

    
1260
				$mpdconf .=<<<EOD
1261

    
1262
poes{$pppoecfg['pppoeid']}{$i}:
1263
	new -i poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i}
1264
	{$isssue_ip_type}
1265
	load pppoe_standard
1266

    
1267
EOD;
1268
			}
1269

    
1270
			$mpdconf .=<<<EOD
1271

    
1272
pppoe_standard:
1273
	set bundle no multilink
1274
	set bundle enable compression
1275
	set auth max-logins 1
1276
	set iface up-script /usr/local/sbin/vpn-linkup
1277
	set iface down-script /usr/local/sbin/vpn-linkdown
1278
	set iface idle 0
1279
	set iface disable on-demand
1280
	set iface disable proxy-arp
1281
	set iface enable tcpmssfix
1282
	set iface mtu 1500
1283
	set link no pap chap
1284
	{$paporchap}
1285
	set link keep-alive 60 180
1286
	set ipcp yes vjcomp
1287
	set ipcp no vjcomp
1288
	set link max-redial -1
1289
	set link mtu 1492
1290
	set link mru 1492
1291
	set ccp yes mpp-e40
1292
	set ccp yes mpp-e128
1293
	set ccp yes mpp-stateless
1294
	set link latency 1
1295
	#set ipcp dns 10.10.1.3
1296
	#set bundle accept encryption
1297

    
1298
EOD;
1299

    
1300
			if (!empty($pppoecfg['dns1'])) {
1301
				$mpdconf .= "	set ipcp dns " . $pppoecfg['dns1'];
1302
				if (!empty($pppoecfg['dns2']))
1303
					$mpdconf .= " " . $pppoecfg['dns2'];
1304
				$mpdconf .= "\n";
1305
			} elseif (isset ($config['dnsmasq']['enable'])) {
1306
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1307
				if ($syscfg['dnsserver'][0])
1308
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1309
				$mpdconf .= "\n";
1310
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1311
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1312
			}
1313

    
1314
			if (isset ($pppoecfg['radius']['server']['enable'])) {
1315
				$radiusport = "";
1316
				$radiusacctport = "";
1317
				if (isset($pppoecfg['radius']['server']['port']))
1318
					$radiusport = $pppoecfg['radius']['server']['port'];
1319
				if (isset($pppoecfg['radius']['server']['acctport']))
1320
					$radiusacctport = $pppoecfg['radius']['server']['acctport'];
1321
				$mpdconf .=<<<EOD
1322
	set radius server {$pppoecfg['radius']['server']['ip']} "{$pppoecfg['radius']['server']['secret']}" {$radiusport} {$radiusacctport}
1323
	set radius retries 3
1324
	set radius timeout 10
1325
	set auth enable radius-auth
1326

    
1327
EOD;
1328

    
1329
				if (isset ($pppoecfg['radius']['accounting'])) {
1330
					$mpdconf .=<<<EOD
1331
	set auth enable radius-acct
1332

    
1333
EOD;
1334
				}
1335
			}
1336

    
1337
			fwrite($fd, $mpdconf);
1338
			fclose($fd);
1339

    
1340
			/* write mpd.links */
1341
			$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.links", "w");
1342
			if (!$fd) {
1343
				printf("Error: cannot open mpd.links in vpn_pppoe_configure().\n");
1344
				return 1;
1345
			}
1346

    
1347
			$mpdlinks = "";
1348

    
1349
			for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
1350
				$mpdlinks .=<<<EOD
1351
			
1352
poes{$pppoecfg['pppoeid']}{$i}:
1353
	set phys type pppoe
1354
        set pppoe iface {$pppoe_interface}
1355
        set pppoe service "*"
1356
        set pppoe disable originate
1357
        set pppoe enable incoming
1358

    
1359
EOD;
1360
			}
1361

    
1362
			fwrite($fd, $mpdlinks);
1363
			fclose($fd);
1364

    
1365
			if ($pppoecfg['username']) {
1366
				/* write mpd.secret */
1367
				$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", "w");
1368
				if (!$fd) {
1369
					printf("Error: cannot open mpd.secret in vpn_pppoe_configure().\n");
1370
					return 1;
1371
				}
1372

    
1373
				$mpdsecret = "\n\n";
1374

    
1375
				if (!empty($pppoecfg['username'])) {
1376
					$item = explode(" ", $pppoecfg['username']);
1377
					foreach($item as $userdata) {
1378
						$data = explode(":", $userdata);
1379
						$mpdsecret .= "{$data[0]} \"" . base64_decode($data[1]) . "\" {$data[2]}\n";
1380
					}
1381
				}
1382

    
1383
				fwrite($fd, $mpdsecret);
1384
				fclose($fd);
1385
				chmod("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", 0600);
1386
			}
1387

    
1388
			/* Get support for netgraph(4) from the nic */
1389
			pfSense_ngctl_attach(".", $pppoe_interface);
1390
			/* fire up mpd */
1391
			mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn -p {$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid -s poes poes");
1392

    
1393
			break;
1394
	}
1395

    
1396
	if ($g['booting'])
1397
		echo "done\n";
1398

    
1399
	return 0;
1400
}
1401

    
1402
function vpn_l2tp_configure() {
1403
	global $config, $g;
1404

    
1405
	$syscfg = $config['system'];
1406
	$l2tpcfg = $config['l2tp'];
1407

    
1408
	/* create directory if it does not exist */
1409
	if (!is_dir("{$g['varetc_path']}/l2tp-vpn"))
1410
		mkdir("{$g['varetc_path']}/l2tp-vpn");
1411

    
1412
	if ($g['booting']) {
1413
		if (!$l2tpcfg['mode'] || ($l2tpcfg['mode'] == "off"))
1414
			return 0;
1415

    
1416
		echo "Configuring l2tp VPN service... ";
1417
	} else {
1418
		/* kill mpd */
1419
		killbypid("{$g['varrun_path']}/l2tp-vpn.pid");
1420

    
1421
		/* wait for process to die */
1422
		sleep(8);
1423

    
1424
	}
1425

    
1426
	/* make sure l2tp-vpn directory exists */
1427
	if (!file_exists("{$g['varetc_path']}/l2tp-vpn"))
1428
		mkdir("{$g['varetc_path']}/l2tp-vpn");
1429

    
1430
	switch ($l2tpcfg['mode']) {
1431

    
1432
		case 'server' :
1433
			if ($l2tpcfg['paporchap'] == "chap")
1434
				$paporchap = "set link enable chap";
1435
			else
1436
				$paporchap = "set link enable pap";
1437

    
1438
			/* write mpd.conf */
1439
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.conf", "w");
1440
			if (!$fd) {
1441
				printf("Error: cannot open mpd.conf in vpn_l2tp_configure().\n");
1442
				return 1;
1443
			}
1444
			$mpdconf = "\n\n";
1445
			$mpdconf .=<<<EOD
1446
l2tps:
1447

    
1448
EOD;
1449

    
1450
			for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
1451
				$mpdconf .= "	load l2tp{$i}\n";
1452
			}
1453

    
1454
			for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
1455

    
1456
				$clientip = long2ip32(ip2long($l2tpcfg['remoteip']) + $i);
1457

    
1458
				if (isset ($l2tpcfg['radius']['radiusissueips']) && isset ($l2tpcfg['radius']['enable'])) {
1459
					$isssue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 0.0.0.0/0";
1460
				} else {
1461
					$isssue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 {$clientip}/32";
1462
				}
1463

    
1464
				$mpdconf .=<<<EOD
1465

    
1466
l2tp{$i}:
1467
	new -i l2tp{$i} l2tp{$i} l2tp{$i}
1468
	{$isssue_ip_type}
1469
	load l2tp_standard
1470

    
1471
EOD;
1472
			}
1473

    
1474
			$mpdconf .=<<<EOD
1475

    
1476
l2tp_standard:
1477
        set bundle disable multilink
1478
        set bundle enable compression
1479
        set bundle yes crypt-reqd
1480
        set ipcp yes vjcomp
1481
        # set ipcp ranges 131.188.69.161/32 131.188.69.170/28
1482
        set ccp yes mppc
1483
        set iface disable on-demand
1484
        set iface enable proxy-arp
1485
	set iface up-script /usr/local/sbin/vpn-linkup
1486
	set iface down-script /usr/local/sbin/vpn-linkdown
1487
        set link yes acfcomp protocomp
1488
        set link no pap chap
1489
        set link enable chap
1490
        set link keep-alive 10 180
1491

    
1492
EOD;
1493

    
1494
			if (is_ipaddr($l2tpcfg['wins'])) {
1495
				$mpdconf .= "	set ipcp nbns {$l2tpcfg['wins']}\n";
1496
			}
1497
			if (is_ipaddr($l2tpcfg['dns1'])) {
1498
				$mpdconf .= "	set ipcp dns " . $l2tpcfg['dns1'];
1499
				if (is_ipaddr($l2tpcfg['dns2']))
1500
					$mpdconf .= " " . $l2tpcfg['dns2'];
1501
				$mpdconf .= "\n";
1502
			} elseif (isset ($config['dnsmasq']['enable'])) {
1503
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1504
				if ($syscfg['dnsserver'][0])
1505
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1506
				$mpdconf .= "\n";
1507
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1508
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1509
			}
1510

    
1511
			if (isset ($l2tpcfg['radius']['enable'])) {
1512
				$mpdconf .=<<<EOD
1513
	set radius server {$l2tpcfg['radius']['server']} "{$l2tpcfg['radius']['secret']}"
1514
	set radius retries 3
1515
	set radius timeout 10
1516
	set auth enable radius-auth
1517

    
1518
EOD;
1519

    
1520
				if (isset ($l2tpcfg['radius']['accounting'])) {
1521
					$mpdconf .=<<<EOD
1522
	set auth enable radius-acct
1523

    
1524
EOD;
1525
				}
1526
			}
1527

    
1528
			fwrite($fd, $mpdconf);
1529
			fclose($fd);
1530

    
1531
			/* write mpd.links */
1532
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.links", "w");
1533
			if (!$fd) {
1534
				printf("Error: cannot open mpd.links in vpn_l2tp_configure().\n");
1535
				return 1;
1536
			}
1537

    
1538
			$mpdlinks = "";
1539

    
1540
			for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
1541
				$mpdlinks .=<<<EOD
1542

    
1543
l2tp{$i}:
1544
	set link type l2tp
1545
        set l2tp enable incoming
1546
        set l2tp disable originate
1547

    
1548
EOD;
1549
			if (!empty($l2tpcfg['secret']))
1550
					$mpdlinks .= "set l2tp secret {$l2tpcfg['secret']}\n";
1551
			}
1552

    
1553
			fwrite($fd, $mpdlinks);
1554
			fclose($fd);
1555

    
1556
			/* write mpd.secret */
1557
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.secret", "w");
1558
			if (!$fd) {
1559
				printf("Error: cannot open mpd.secret in vpn_l2tp_configure().\n");
1560
				return 1;
1561
			}
1562

    
1563
			$mpdsecret = "\n\n";
1564

    
1565
			if (is_array($l2tpcfg['user'])) {
1566
				foreach ($l2tpcfg['user'] as $user)
1567
					$mpdsecret .= "{$user['name']} \"{$user['password']}\" {$user['ip']}\n";
1568
			}
1569

    
1570
			fwrite($fd, $mpdsecret);
1571
			fclose($fd);
1572
			chmod("{$g['varetc_path']}/l2tp-vpn/mpd.secret", 0600);
1573

    
1574
			vpn_netgraph_support();
1575

    
1576
			/* fire up mpd */
1577
			mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/l2tp-vpn -p {$g['varrun_path']}/l2tp-vpn.pid -s l2tps l2tps");
1578

    
1579
			break;
1580

    
1581
		case 'redir' :
1582
			break;
1583
	}
1584

    
1585
	if ($g['booting'])
1586
		echo "done\n";
1587

    
1588
	return 0;
1589
}
1590

    
1591
/* Walk the tunnels for hostname endpoints. If the hostnames 
1592
 * resolve to a different IP now compared to the DNS cache
1593
 * we reload the policies if the endpoint has changed */
1594
function vpn_ipsec_refresh_policies() {
1595
	global $config;
1596
	global $g;
1597

    
1598
	$ipseccfg = $config['ipsec'];
1599
	$a_phase1 = $config['ipsec']['phase1'];
1600
	$a_phase2 = $config['ipsec']['phase2'];
1601

    
1602
	if (isset($ipseccfg['disable'])) {
1603
		return true;
1604
	}
1605

    
1606
	/* Walk the Ipsec tunnel array */
1607
	if (!is_array($a_phase1) || (!count($a_phase1))) {
1608
		return;
1609
	}
1610

    
1611
	foreach ($a_phase1 as $phase1) {
1612
		if (isset($phase1['disabled'])) {
1613
			continue;
1614
		}
1615
		if (is_ipaddr($phase1['remote-gateway'])) {
1616
			continue;
1617
		}
1618
		if (!is_ipaddr($phase1['remote-gateway'])) {
1619
			$dnscache = compare_hostname_to_dnscache($phase1['remote-gateway']);
1620
			$dnscache = trim($dnscache);
1621
			/* we should have the old IP addresses in the dnscache now */
1622
			if($dnscache <> "") {
1623
				$oldphase1 = $phase1;
1624
				$oldphase1['remote-gateway'] = trim($dnscache);
1625
				/* now we need to find all tunnels for this host */
1626
				if (!is_array($a_phase2) || (!count($a_phase2))) {
1627
					continue;
1628
				}
1629
				foreach ($a_phase2 as $phase2) {
1630
					if($phase2['ikeid'] == $phase1['ikeid']) {
1631
						reload_tunnel_spd_policy ($phase1, $phase2, $oldphase1, $oldphase2);
1632
					}
1633
				}
1634
			}
1635
		}
1636
	}
1637

    
1638
	/* process all generated spd.conf files from tmp which are left behind
1639
	 * behind by either changes of dynamic tunnels or manual edits
1640
	 * scandir() is only available in PHP5 */
1641
	$tmpfiles = array();
1642
	$dh  = opendir($g['tmp_path']);
1643
	while (false !== ($filename = readdir($dh))) {
1644
		if(preg_match("/^spd.conf.reload./", $filename)) {
1645
			$tmpfiles[] = $filename;
1646
		}
1647
	}
1648
	sort($tmpfiles);
1649
	foreach($tmpfiles as $tmpfile) {
1650
		$ret = mwexec("/usr/local/sbin/setkey -f {$g['tmp_path']}/{$tmpfile} 2>&1", false);
1651
		if($ret == 0) {
1652
			unlink_if_exists("{$g['tmp_path']}/{$tmpfile}");
1653
		} else {
1654
			rename("{$g['tmp_path']}/{$tmpfile}", ("{$g['tmp_path']}/failed.{$tmpfile}"));
1655
		}
1656
	}
1657
}
1658

    
1659
/* reloads the tunnel configuration for a tunnel item
1660
 * Will remove and add SPD polices */
1661
function reload_tunnel_spd_policy($phase1, $phase2, $old_phase1, $old_phase2) {
1662
	global $config;
1663
	global $g;
1664

    
1665
	/* if we are not passed a old tunnel array we create one */
1666
	if(empty($old_phase1)) {
1667
		$old_phase1 = $phase1;
1668
	}
1669
	if(empty($old_phase2)) {
1670
		$old_phase2 = $phase2;
1671
	}
1672

    
1673
	$sad_arr = ipsec_dump_sad();
1674

    
1675
	$ep = ipsec_get_phase1_src($phase1);
1676
	$local_subnet = ipsec_idinfo_to_cidr($phase2['localid']);
1677
	$remote_subnet = ipsec_idinfo_to_cidr($phase2['remoteid']);
1678

    
1679
	/* make sure we pass the oldtunnel array with a IP for the remote gw */
1680
	$old_gw = trim($old_phase1['remote-gateway']);
1681

    
1682
	$old_ep = ipsec_get_phase1_src($old_phase1);
1683
	$old_local_subnet = ipsec_idinfo_to_cidr($old_phase2['localid']);
1684
	$old_remote_subnet = ipsec_idinfo_to_cidr($old_phase2['remoteid']);
1685

    
1686
	/* see if this tunnel has a hostname for the remote-gateway, and if so,
1687
	 * try to resolve it now and add it to the list for filterdns */
1688
	$rgip = "";
1689
	if (!is_ipaddr($phase1['remote-gateway'])) {
1690
		if(! $g['booting']) {
1691
			$rgip = resolve_retry($phase1['remote-gateway']);
1692
			add_hostname_to_watch($phase1['remote-gateway']);
1693
		} else {
1694
			add_hostname_to_watch($phase1['remote-gateway']);
1695
		}
1696
		if (!is_ipaddr($rgip)) {
1697
			log_error("Could not determine VPN endpoint for '{$phase1['descr']}'");
1698
			return false;
1699
		}
1700
	} else {
1701
		$rgip = $phase1['remote-gateway'];
1702
	}
1703
	if (!$ep) {
1704
		log_error("Could not determine VPN endpoint for '{$phase1['descr']}'");
1705
		return false;
1706
	}
1707

    
1708
	if((!is_ipaddr($old_ep)) || (! is_ipaddr($ep))) {
1709
		log_error("IPSEC: ERROR: One of the endpoints is not a IP address. Old EP '{$old_ep}' new EP '{$ep}'");
1710
	}
1711
	if((! is_ipaddr($rgip)) || (! is_ipaddr($old_gw))) {
1712
		log_error("IPSEC: ERROR: One of the remote endpoints is not a IP address. Old RG '{$old_gw}' new RG '{$rgip}'");
1713
	}
1714

    
1715
	$spdconf = "";
1716
	/* Delete old SPD policies if there are changes between the old and new */
1717
	if(($phase1 != $old_phase1) || ($phase2 != $old_phase2)) {
1718
		$spdconf .= "spddelete {$old_local_subnet} " .
1719
			"{$old_remote_subnet} any -P out ipsec " .
1720
			"{$old_phase2['protocol']}/tunnel/{$old_ep}-" .
1721
			"{$old_gw}/unique;\n";
1722
		$spdconf .= "spddelete {$old_remote_subnet} " .
1723
			"{$old_local_subnet} any -P in ipsec " .
1724
			"{$old_phase2['protocol']}/tunnel/{$old_gw}-" .
1725
			"{$old_ep}/unique;\n";
1726

    
1727
		/* zap any existing SA entries */
1728
		foreach($sad_arr as $sad) {
1729
			if(($sad['dst'] == $old_ep) && ($sad['src'] == $old_gw)) {
1730
				$spdconf .= "delete {$old_ep} {$old_gw} {$old_phase2['protocol']} 0x{$sad['spi']};\n";
1731
			}
1732
			if(($sad['src'] == $oldep) && ($sad['dst'] == $old_gw)) {
1733
				$spdconf .= "delete {$old_gw} {$old_ep} {$old_phase2['protocol']} 0x{$sad['spi']};\n";
1734
			}
1735
		}
1736
	}
1737

    
1738
	/* Create new SPD entries for the new configuration */
1739
	/* zap any existing SA entries beforehand */
1740
	foreach($sad_arr as $sad) {
1741
		if(($sad['dst'] == $ep) && ($sad['src'] == $rgip)) {
1742
			$spdconf .= "delete {$rgip} {$ep} {$phase2['protocol']} 0x{$sad['spi']};\n";
1743
		}
1744
		if(($sad['src'] == $ep) && ($sad['dst'] == $rgip)) {
1745
			$spdconf .= "delete {$ep} {$rgip} {$phase2['protocol']} 0x{$sad['spi']};\n";
1746
		}
1747
	}
1748
	/* add new SPD policies to replace them */
1749
	$spdconf .= "spdadd {$local_subnet} " .
1750
		"{$remote_subnet} any -P out ipsec " .
1751
		"{$phase2['protocol']}/tunnel/{$ep}-" .
1752
		"{$rgip}/unique;\n";
1753
	$spdconf .= "spdadd {$remote_subnet} " .
1754
		"{$local_subnet} any -P in ipsec " .
1755
		"{$phase2['protocol']}/tunnel/{$rgip}-" .
1756
		"{$ep}/unique;\n";
1757

    
1758
	log_error("Reloading IPsec tunnel '{$phase1['descr']}'. Previous IP '{$old_gw}', current IP '{$rgip}'. Reloading policy");
1759

    
1760
	$now = time();
1761
	$spdfile = tempnam("{$g['tmp_path']}", "spd.conf.reload.{$now}.");
1762
	/* generate temporary spd.conf */
1763
	file_put_contents($spdfile, $spdconf);
1764
	return true;
1765
}
1766

    
1767
function vpn_ipsec_configure_preferoldsa() {
1768
	global $config;
1769
	if(isset($config['ipsec']['preferoldsa']))
1770
		mwexec("/sbin/sysctl -w net.key.preferred_oldsa=-30");
1771
	else
1772
		mwexec("/sbin/sysctl net.key.preferred_oldsa=0");
1773
}
1774

    
1775
?>
(53-53/62)