Project

General

Profile

Download (52.9 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:	/sbin/ifconfig
38
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/ipsec	/usr/local/libexec/ipsec/charon /usr/local/libexec/ipsec/starter
39
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/filterdns	/usr/local/sbin/mpd4
40
	pfSense_MODULE:	vpn
41
*/
42

    
43
require_once("ipsec.inc");
44

    
45
function vpn_ipsec_configure_loglevels($forconfig = false)
46
{
47
	global $config, $ipsec_loglevels;
48

    
49
	$cfgtext = array();
50
	foreach ($ipsec_loglevels as $lkey => $ldescr) {
51
		if (!isset($config['ipsec']["ipsec_{$lkey}"]) && !$forconfig)
52
			mwexec("/usr/local/sbin/ipsec stroke loglevel {$lkey} -- -1", false);
53
		else if (is_numeric($config['ipsec']["ipsec_{$lkey}"]) &&
54
		    intval($config['ipsec']["ipsec_{$lkey}"]) >= 0 && intval($config['ipsec']["ipsec_{$lkey}"]) <= 5)
55
			$forconfig ? $cfgtext[] = "${lkey} " . (intval($config['ipsec']["ipsec_{$lkey}"]) - 1) :
56
				mwexec("/usr/local/sbin/ipsec stroke loglevel {$lkey} " . (intval($config['ipsec']["ipsec_{$lkey}"]) - 1) , false);
57
	}
58
	if ($forconfig)
59
		return implode(',', $cfgtext);
60
}
61

    
62
/* include all configuration functions */
63
function vpn_ipsec_convert_to_modp($index)
64
{
65

    
66
	$convertion = "";
67
	switch ($index) {
68
	case '1':
69
		$convertion = "modp768";
70
		break;
71
	case '2':
72
		$convertion = "modp1024";
73
		break;
74
	case '5':
75
		$convertion = "modp1536";
76
		break;
77
	case '14':
78
		$convertion = "modp2048";
79
		break;
80
	case '15':
81
		$convertion = "modp3072";
82
		break;
83
	case '16':      
84
		$convertion = "modp4096";
85
		break;
86
	case '17':
87
		$convertion = "modp6144";
88
		break;
89
	case '18':
90
		$convertion = "modp8192";
91
		break;
92
	}
93

    
94
	return $convertion;
95
}
96

    
97
function vpn_ipsec_configure($restart = false)
98
{
99
	global $config, $g, $sa, $sn, $p1_ealgos, $p2_ealgos;
100

    
101
	if ($g['platform'] == 'jail')
102
		return;
103

    
104
	/* get the automatic ping_hosts.sh ready */
105
	unlink_if_exists("{$g['vardb_path']}/ipsecpinghosts");
106
	touch("{$g['vardb_path']}/ipsecpinghosts");
107

    
108
	vpn_ipsec_configure_preferoldsa();
109

    
110
	$syscfg = $config['system'];
111
	$ipseccfg = $config['ipsec'];
112
	if (!isset($ipseccfg['enable'])) {
113
		/* try to stop charon */
114
		mwexec("/usr/local/sbin/ipsec stop");
115
		/* Stop dynamic monitoring */
116
		killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
117

    
118
		/* wait for process to die */
119
		sleep(2);
120

    
121
		/* disallow IPSEC, it is off */
122
		mwexec("/sbin/ifconfig enc0 down");
123
		set_single_sysctl("net.inet.ip.ipsec_in_use", "0");
124

    
125
		filter_configure();
126

    
127
		return 0;
128
	}
129

    
130
	$a_phase1 = $config['ipsec']['phase1'];
131
	$a_phase2 = $config['ipsec']['phase2'];
132
	$a_client = $config['ipsec']['client'];
133

    
134
	$certpath = "{$g['varetc_path']}/ipsec/ipsec.d/certs";
135
	$capath = "{$g['varetc_path']}/ipsec/ipsec.d/cacerts";
136
	$keypath = "{$g['varetc_path']}/ipsec/ipsec.d/private";
137

    
138
	mwexec("/sbin/ifconfig enc0 up");
139
	set_single_sysctl("net.inet.ip.ipsec_in_use", "1");
140
	/* needed for config files */
141
	if (!is_dir("{$g['varetc_path']}/ipsec"))
142
		mkdir("{$g['varetc_path']}/ipsec");
143
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d"))
144
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d");
145
	if (!is_dir($capath))
146
		mkdir($capath);
147
	if (!is_dir($keypath))
148
		mkdir($keypath);
149
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/crls"))
150
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d/crls");
151
	if (!is_dir($certpath))
152
		mkdir($certpath);
153
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/aacerts"))
154
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d/aacerts");
155
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/acerts"))
156
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d/acerts");
157
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/ocspcerts"))
158
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d/ocspcerts");
159
	if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/reqs"))
160
		mkdir("{$g['varetc_path']}/ipsec/ipsec.d/reqs");
161
	
162

    
163
	if (platform_booting())
164
		echo gettext("Configuring IPsec VPN... ");
165

    
166
	/* fastforwarding is not compatible with ipsec tunnels */
167
	set_single_sysctl("net.inet.ip.fastforwarding", "0");
168

    
169
	/* resolve all local, peer addresses and setup pings */
170
	$ipmap = array();
171
	$rgmap = array();
172
	$filterdns_list = array();
173
	$listeniflist = array();
174
	$aggressive_mode_psk = false;
175
	unset($iflist);
176
	$ifacesuse = array();
177
	if (is_array($a_phase1) && count($a_phase1)) {
178

    
179
		$ipsecpinghosts = "";
180
		/* step through each phase1 entry */
181
		foreach ($a_phase1 as $ph1ent) {
182
			if (isset($ph1ent['disabled']))
183
				continue;
184

    
185
			if (strpos($ph1ent['interface'], '_vip')) {
186
				$vpninterface = explode('_vip', $ph1ent['interface']);
187
				$ifacesuse[] = get_real_interface($vpninterface[0]);
188
                        } else {
189
                                $vpninterface = get_failover_interface($ph1ent['interface']);
190
				if (!empty($vpninterface))
191
					$ifacesuse[] = $vpninterface;
192
			}
193
				
194
			if ($ph1ent['mode'] == "aggressive" && ($ph1ent['authentication_method'] == "pre_shared_key" || $ph1ent['authentication_method'] == "xauth_psk_server")) 
195
				$aggressive_mode_psk = true;
196

    
197
			$ikeid = $ph1ent['ikeid'];
198
			$listeniflist = get_real_interface($a_phase1['interface']);
199

    
200
			$ep = ipsec_get_phase1_src($ph1ent);
201
			if (!is_ipaddr($ep))
202
				continue;
203

    
204
			if(!in_array($ep,$ipmap))
205
				$ipmap[] = $ep;
206

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

    
210
			if (isset ($ph1ent['mobile']))
211
				continue;
212

    
213
			$rg = $ph1ent['remote-gateway'];
214

    
215
			if (!is_ipaddr($rg)) {
216
				$filterdns_list[] = "{$rg}";
217
				add_hostname_to_watch($rg);
218
				if (!platform_booting())
219
					$rg = resolve_retry($rg);
220
				if (!is_ipaddr($rg))
221
					continue;
222
			}
223
			if(array_search($rg, $rgmap)) {
224
				log_error("The remote gateway {$rg} already exists on another phase 1 entry");
225
				continue;
226
			}
227
			$rgmap[$ph1ent['remote-gateway']] = $rg;
228

    
229
			if (is_array($a_phase2)) {
230
				/* step through each phase2 entry */
231
				foreach ($a_phase2 as $ph2ent) {
232
					if (isset($ph2ent['disabled']))
233
						continue;
234

    
235
					if ($ikeid != $ph2ent['ikeid'])
236
						continue;
237

    
238
					/* add an ipsec pinghosts entry */
239
					if ($ph2ent['pinghost']) {
240
						if (!is_array($iflist))
241
							$iflist = get_configured_interface_list();
242
						$srcip = null;
243
						$local_subnet = ipsec_idinfo_to_cidr($ph2ent['localid'], true, $ph2ent['mode']);
244
						if(is_ipaddrv6($ph2ent['pinghost'])) {
245
							foreach ($iflist as $ifent => $ifname) {
246
								$interface_ip = get_interface_ipv6($ifent);
247
								if(!is_ipaddrv6($interface_ip))
248
									continue;
249
								if (ip_in_subnet($interface_ip, $local_subnet)) {
250
									$srcip = $interface_ip;
251
									break;
252
								}
253
							}
254
						} else {
255
							foreach ($iflist as $ifent => $ifname) {
256
								$interface_ip = get_interface_ip($ifent);
257
								if(!is_ipaddrv4($interface_ip))
258
									continue;
259
								if ($local_subnet == "0.0.0.0/0" || ip_in_subnet($interface_ip, $local_subnet)) {
260
									$srcip = $interface_ip;
261
									break;
262
								}
263
							}
264
						}
265
						/* if no valid src IP was found in configured interfaces, try the vips */
266
						if (is_null($srcip)) {
267
							$viplist = get_configured_vips_list();
268
							foreach ($viplist as $vip) {
269
								if (ip_in_subnet($vip['ipaddr'], $local_subnet)) {
270
									$srcip = $vip['ipaddr'];
271
									break;
272
								}
273
							}
274
						}
275
						$dstip = $ph2ent['pinghost'];
276
						if(is_ipaddrv6($dstip)) {
277
							$family = "inet6";
278
						} else {
279
							$family = "inet";
280
						}
281
						if (is_ipaddr($srcip))
282
							$ipsecpinghosts[] = "{$srcip}|{$dstip}|3|||||{$family}|\n";
283
					}
284
				}
285
			}
286
		}
287
		@file_put_contents("{$g['vardb_path']}/ipsecpinghosts", $ipsecpinghosts);
288
		unset($ipsecpinghosts);
289
	}
290
	unset($iflist);
291

    
292
	$accept_unencrypted = "";
293
	if (isset($config['ipsec']['acceptunencryptedmainmode']))
294
		$accept_unencrypted = "accept_unencrypted_mainmode_messages = yes";
295

    
296
	$stronconf = '';
297
	if (file_exists("{$g['varetc_path']}/ipsec/strongswan.conf"))
298
		$stronconf = file_get_contents("{$g['varetc_path']}/ipsec/strongswan.conf");
299

    
300
	$i_dont_care_about_security_and_use_aggressive_mode_psk = "";
301
	if ($aggressive_mode_psk) {
302
		log_error("WARNING: Setting i_dont_care_about_security_and_use_aggressive_mode_psk option because a phase 1 is configured using aggressive mode with pre-shared keys. This is not a secure configuration.");
303
		if (!empty($stronconf) && strpos($stronconf, 'i_dont_care_about_security_and_use_aggressive_mode_psk') === FALSE)
304
			$restart = true;
305
		$i_dont_care_about_security_and_use_aggressive_mode_psk = "i_dont_care_about_security_and_use_aggressive_mode_psk=yes";
306
	} 
307

    
308
	$unity_enabled = 'yes';
309
	if (isset($config['ipsec']['unityplugin']))
310
		$unity_enabled = 'no';
311

    
312
	if (!empty($ifacesuse))
313
		$ifacesuse = 'interfaces_use = ' . implode(',', array_unique($ifacesuse));
314
	else
315
		$ifacesuse = '';
316

    
317
	unset($stronconf);
318

    
319
	$strongswan = <<<EOD
320

    
321
# Automatically generated config file - DO NOT MODIFY. Changes will be overwritten. 
322
starter {
323
load_warning = no
324
}
325

    
326
charon {
327
# number of worker threads in charon
328
threads = 16
329
ikesa_table_size = 32
330
ikesa_table_segments = 4
331
init_limit_half_open = 1000
332
install_routes = no
333
{$i_dont_care_about_security_and_use_aggressive_mode_psk}
334
{$accept_unencrypted}
335
cisco_unity = {$unity_enabled}
336
{$ifacesuse}
337

    
338
# And two loggers using syslog. The subsections define the facility to log
339
# to, currently one of: daemon, auth.
340
syslog {
341
	identifier = charon
342
	# default level to the LOG_DAEMON facility
343
	daemon {
344
	}
345
	# very minimalistic IKE auditing logs to LOG_AUTHPRIV
346
	auth {
347
		default = -1
348
		ike = 1
349
		ike_name = yes
350
	}
351
}
352

    
353
EOD;
354

    
355
	$strongswan .= "\tplugins {\n";
356

    
357
	if (is_array($a_client) && isset($a_client['enable'])) {
358
		$strongswan .= "\t\tattr {\n";
359
		if ($a_client['pool_address'] && $a_client['pool_netbits'])
360
			$strongswan .= "\t\t\tsubnet = {$a_client['pool_address']}/{$a_client['pool_netbits']}\n";
361

    
362
		$cfgservers = array();
363
		if (!empty($a_client['dns_server1']))
364
			$cfgservers[] = $a_client['dns_server1'];
365
		if (!empty($a_client['dns_server2']))
366
			$cfgservers[] = $a_client['dns_server2'];
367
		if (!empty($a_client['dns_server3']))
368
			$cfgservers[] = $a_client['dns_server3'];
369
		if (!empty($a_client['dns_server4']))
370
			$cfgservers[] = $a_client['dns_server4'];
371

    
372
		if (!empty($cfgservers))
373
			$strongswan .= "\t\t\tdns = " . implode(",", $cfgservers) . "\n";
374
		unset($cfgservers);
375
		$cfgservers = array();
376
		if (!empty($a_client['wins_server1']))
377
			$cfgservers[] = $a_client['wins_server1'];
378
		if (!empty($a_client['wins_server2']))
379
			$cfgservers[] = $a_client['wins_server2'];
380
		if (!empty($cfgservers))
381
			$strongswan .= "\t\t\tnbns = " . implode(",", $cfgservers) . "\n";
382
		unset($cfgservers);
383

    
384
		if (isset($a_client['net_list'])) {
385
			$net_list = '';
386
			foreach ($a_phase2 as $ph2ent) {
387
				if (isset($ph2ent['disabled']))
388
					continue;
389

    
390
				if (!isset($ph2ent['mobile']))
391
					continue;
392

    
393
				$localid = ipsec_idinfo_to_cidr($ph2ent['localid'], true, $ph2ent['mode']);
394

    
395
				if (!empty($net_list))
396
					$net_list .= ",";
397
				$net_list .= $localid;
398
			}
399

    
400
			if (!empty($net_list)) {
401
				$strongswan .= "\t\t\tsplit-include = {$net_list}\n";
402
				unset($net_list);
403
			}
404
		}
405

    
406
		if (!empty($a_client['dns_domain'])) {
407
			$strongswan .= "\t\t\t# Search domain and default domain\n";
408
			$strongswan .= "\t\t\t28674 = \"{$a_client['dns_domain']}\"\n";
409
			if (empty($a_client['dns_split'])) {
410
				$strongswan .= "\t\t\t28675 = \"{$a_client['dns_domain']}\"";
411
			}
412
			$strongswan .= "\n";
413
		}
414

    
415
		if (!empty($a_client['dns_split'])) {
416
			$ipsec_dns = explode(',', $a_client['dns_split']);
417
			foreach ($ipsec_dns as $ipsecidx => $ipsecdns) {
418
				$ipsec_dns[$ipsecidx] = trim($ipsecdns);
419
			}
420
			$a_client['dns_split'] = implode(' ', $ipsec_dns);
421
			unset($ipsec_dns);
422

    
423
			$strongswan .= "\t\t\t28675 = \"{$a_client['dns_split']}\"\n";
424
		}
425

    
426
		if (!empty($a_client['login_banner']))
427
			$strongswan .= "\t\t\t28672 = \"{$a_client['login_banner']}\"\n";
428

    
429
		if (isset($a_client['save_passwd']))
430
			$strongswan .= "\t\t\t28673 = 1\n";
431

    
432
		if ($a_client['pfs_group'])
433
			$strongswan .= "\t\t\t28679 = \"{$a_client['pfs_group']}\"\n";
434
		$strongswan .= "\t\t}\n";
435

    
436
		if ($a_client['user_source'] != "none") {
437
			$strongswan .= "\t\txauth-generic {\n";
438
			$strongswan .= "\t\t\tscript = /etc/inc/ipsec.auth-user.php\n";
439
			$strongswan .= "\t\t\tauthcfg = ";
440
			$firstsed = 0;
441
			$authcfgs = explode(",", $a_client['user_source']);
442
			foreach ($authcfgs as $authcfg) {
443
				if ($firstsed > 0)
444
					$strongswan .= ",";
445
				if ($authcfg == "system")
446
					$authcfg = "Local Database";
447
				$strongswan .= $authcfg;
448
				$firstsed = 1;
449
			}
450
			$strongswan .= "\n";
451
			$strongswan .= "\t\t}\n";
452
		}
453
	}
454

    
455
	$strongswan .= "\t}\n}\n";
456
	@file_put_contents("{$g['varetc_path']}/ipsec/strongswan.conf", $strongswan);
457
	unset($strongswan);
458

    
459
	/* generate CA certificates files */
460
	if (is_array($config['ca']) && count($config['ca'])) {
461
		foreach ($config['ca'] as $ca) {
462
			if (!isset($ca['crt'])) {
463
				log_error(sprintf(gettext("Error: Invalid certificate info for %s"), $ca['descr']));
464
				continue;
465
			}
466
			$cert = base64_decode($ca['crt']);
467
			$x509cert = openssl_x509_parse(openssl_x509_read($cert));
468
			if (!is_array($x509cert) || !isset($x509cert['hash'])) {
469
				log_error(sprintf(gettext("Error: Invalid certificate hash info for %s"), $ca['descr']));
470
				continue;
471
			}
472
			$fname = "{$capath}/{$x509cert['hash']}.0.crt";
473
			if (!@file_put_contents($fname, $cert)) {
474
				log_error(sprintf(gettext("Error: Cannot write IPsec CA file for %s"), $ca['descr']));
475
				continue;
476
			}
477
			unset($cert);
478
		}
479
	}
480

    
481
	$pskconf = "";
482

    
483
	if (is_array($a_phase1) && count($a_phase1)) {
484
		foreach ($a_phase1 as $ph1ent) {
485

    
486
			if (isset($ph1ent['disabled']))
487
				continue;
488

    
489
			if (strstr($ph1ent['authentication_method'], 'rsa') ||
490
			    in_array($ph1ent['authentication_method'], array('eap-mschapv2', 'eap-tls'))) {
491
				$certline = '';
492

    
493
				$ikeid = $ph1ent['ikeid'];
494
				$cert = lookup_cert($ph1ent['certref']);
495

    
496
				if (!$cert) {
497
					log_error(sprintf(gettext("Error: Invalid phase1 certificate reference for %s"), $ph1ent['name']));
498
					continue;
499
				}
500

    
501
				@chmod($certpath, 0600);
502

    
503
				$ph1keyfile = "{$keypath}/cert-{$ikeid}.key";
504
				if (!file_put_contents($ph1keyfile, base64_decode($cert['prv']))) {
505
					log_error(sprintf(gettext("Error: Cannot write phase1 key file for %s"), $ph1ent['name']));
506
					continue;
507
				}
508
				@chmod($ph1keyfile, 0600);
509

    
510
				$ph1certfile = "{$certpath}/cert-{$ikeid}.crt";
511
				if (!file_put_contents($ph1certfile, base64_decode($cert['crt']))) {
512
					log_error(sprintf(gettext("Error: Cannot write phase1 certificate file for %s"), $ph1ent['name']));
513
					@unlink($ph1keyfile);
514
					continue;
515
				}
516
				@chmod($ph1certfile, 0600);
517

    
518
				/* XXX" Traffic selectors? */
519
				$pskconf .= " : RSA {$ph1keyfile}\n";
520
			} else {
521
				list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, 'local');
522
				list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, 'peer', $rgmap);
523

    
524
				if (empty($peerid_data))
525
					continue;
526

    
527
				$myid = isset($ph1ent['mobile']) ? trim($myid_data) : "%any";
528
				$peerid = ($peerid_data != 'allusers') ? trim($peerid_data) : '';
529
				if (!empty($ph1ent['pre-shared-key'])) {
530
					if ($myid_type == 'fqdn' && !empty($myid_data))
531
						$pskconf .= "@{$myid} {$peerid} : PSK 0s" . base64_encode(trim($ph1ent['pre-shared-key'])) . "\n";
532
					else
533
						$pskconf .= "{$myid} {$peerid} : PSK 0s" . base64_encode(trim($ph1ent['pre-shared-key'])) . "\n";
534
				}
535
			}
536
		}
537
	}
538

    
539
	/* Add user PSKs */
540
	if (is_array($config['system']) && is_array($config['system']['user'])) {
541
		foreach ($config['system']['user'] as $user) {
542
			if (!empty($user['ipsecpsk'])) {
543
				$pskconf .= "%any {$user['name']} : PSK 0s" . base64_encode($user['ipsecpsk']) . "\n";
544
			}
545
		}
546
		unset($user);
547
	}
548

    
549
	/* add PSKs for mobile clients */
550
	if (is_array($ipseccfg['mobilekey'])) {
551
		foreach ($ipseccfg['mobilekey'] as $key) {
552
			if ($key['ident'] == "allusers")
553
				$key['ident'] = '%any';
554
			if (empty($key['type']))
555
				$key['type'] = 'PSK';
556
			$pskconf .= "%any {$key['ident']} : {$key['type']} 0s" . base64_encode($key['pre-shared-key']) . "\n";
557
		}
558
		unset($key);
559
	}
560

    
561
	@file_put_contents("{$g['varetc_path']}/ipsec/ipsec.secrets", $pskconf);
562
	chmod("{$g['varetc_path']}/ipsec/ipsec.secrets", 0600);
563
	unset($pskconf);
564

    
565
	$uniqueids = 'yes';
566
	if (!empty($config['ipsec']['uniqueids'])) {
567
		if (in_array($uniqueids, $ipsec_idhandling))
568
			$uniqueids = $config['ipsec']['uniqueids'];
569
	}
570
	$natfilterrules = false;
571
	/* begin ipsec.conf */
572
	$ipsecconf = "";
573
	$enablecompression = false;
574
	if (is_array($a_phase1) && count($a_phase1))  {
575

    
576
		$ipsecconf .= "# This file is automatically generated. Do not edit\n";
577
		$ipsecconf .= "config setup\n\tuniqueids = {$uniqueids}\n";
578
		$ipsecconf .= "\tcharondebug=\"" . vpn_ipsec_configure_loglevels(true) . "\"\n";
579

    
580
		foreach ($a_phase1 as $ph1ent) {
581
			if (isset($ph1ent['disabled']))
582
				continue;
583

    
584
			if ($ph1ent['mode'] == "aggressive")
585
				$aggressive = "yes";
586
			else
587
				$aggressive = "no";
588

    
589
			$ep = ipsec_get_phase1_src($ph1ent);
590
			if (!$ep)
591
				continue;
592

    
593
			$ikeid = $ph1ent['ikeid'];
594
			$keyexchange = "ikev1";
595
			$passive = "route";
596
			if (!empty($ph1ent['iketype'])) {
597
				if ($ph1ent['iketype'] == "ikev2") {
598
					$keyexchange = "ikev2";
599
					//$passive = "start";
600
				} else if ($ph1ent['iketype'] == "auto")
601
					$keyexchange = "ike";
602
			}
603

    
604
			if (isset($ph1ent['mobile'])) {
605
				$right_spec = "%any";
606
				$passive = 'add';
607
			} else {
608
				if (isset($ph1ent['responderonly']))
609
					$passive = 'add';
610

    
611
				$right_spec = $ph1ent['remote-gateway'];
612
				if (is_ipaddr($right_spec))
613
					$sourcehost = $right_spec;
614
				else
615
					$sourcehost = $rgmap['remote-gateway'];
616

    
617
				if ($ph1ent['protocol'] == 'inet') {
618
					if (strpos($ph1ent['interface'], '_vip')) {
619
						$vpninterface = explode('_vip', $ph1ent['interface']);
620
						$ifacesuse = get_real_interface($vpninterface[0]);
621
						$vpninterface = $vpninterface[0];
622
					} else {
623
						$ifacesuse = get_failover_interface($ph1ent['interface']);
624
						$vpninterface = convert_real_interface_to_friendly_interface_name($ifacesuse);
625
					}
626
					
627
					if (!empty($ifacesuse) && interface_has_gateway($vpninterface)) {
628
						$gatewayip = get_interface_gateway($vpninterface);
629
						$interfaceip = get_interface_ip($vpninterface);
630
						$subnet_bits = get_interface_subnet($vpninterface);
631
						$subnet_ip = gen_subnetv4($interfaceip, $subnet_bits);
632
						/* if the remote gateway is in the local subnet, then don't add a route */
633
						if (!ip_in_subnet($sourcehost, "{$subnet_ip}/{$subnet_bits}")) {
634
							if (is_ipaddrv4($gatewayip)) {
635
								// log_error("IPSEC interface is not WAN but {$ifacesuse}, adding static route for VPN endpoint {$rgip} via {$gatewayip}");
636
								mwexec("/sbin/route change -host {$sourcehost} {$gatewayip}", true);
637
							}
638
						}
639
					}
640
				} else if ($ph1ent['protocol'] == 'inet6') {
641
					if (strpos($ph1ent['interface'], '_vip')) {
642
						$vpninterface = explode('_vip', $ph1ent['interface']);
643
						$ifacesuse = get_real_interface($vpninterface[0]);
644
						$vpninterface = $vpninterface[0];
645
					} else {
646
						$ifacesuse = get_failover_interface($ph1ent['interface']);
647
						$vpninterface = convert_real_interface_to_friendly_interface_name($ifacesuse);
648
					}
649
					
650
					if (!empty($ifacesuse) && interface_has_gateway($vpninterface)) {
651
						$gatewayip = get_interface_gateway_v6($vpninterface);
652
						$interfaceip = get_interface_ipv6($vpninterface);
653
						$subnet_bits = get_interface_subnetv6($vpninterface);
654
						$subnet_ip = gen_subnetv6($interfaceip, $subnet_bits);
655
						/* if the remote gateway is in the local subnet, then don't add a route */
656
						if (!ip_in_subnet($sourcehost, "{$subnet_ip}/{$subnet_bits}")) {
657
							if (is_ipaddrv6($gatewayip)) {
658
								// log_error("IPSEC interface is not WAN but {$ifacesuse}, adding static route for VPN endpoint {$rgip} via {$gatewayip}");
659
								mwexec("/sbin/route change -inet6 -host {$sourcehost} {$gatewayip}", true);
660
							}
661
						}
662
					}
663
				}
664
			}
665

    
666
			list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, 'local');
667
			if ($myid_type != 'address')
668
				$myid_data = "{$myid_type}:{$myid_data}";
669

    
670
			/* Only specify peer ID if we are not dealing with a mobile PSK-only tunnel */
671
			$peerid_spec = '';
672
			if (!isset($ph1ent['mobile'])) {
673
				list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, 'peer', $rgmap);
674
				if ($peerid_type != 'address')
675
					$peerid_spec = "{$peerid_type}:{$peerid_data}";
676
				else
677
					$peerid_spec = $peerid_data;
678
			}
679

    
680
			if (is_array($ph1ent['encryption-algorithm']) && !empty($ph1ent['encryption-algorithm']['name']) && !empty($ph1ent['hash-algorithm'])) {
681
				$ealgosp1 = '';
682
				$ealg_id = $ph1ent['encryption-algorithm']['name'];
683
				$ealg_kl = $ph1ent['encryption-algorithm']['keylen'];
684
				if ($ealg_kl)
685
					$ealgosp1 = "ike = {$ealg_id}{$ealg_kl}-{$ph1ent['hash-algorithm']}";
686
				else
687
					$ealgosp1 = "ike = {$ealg_id}-{$ph1ent['hash-algorithm']}";
688

    
689
				$modp = vpn_ipsec_convert_to_modp($ph1ent['dhgroup']);
690
				if (!empty($modp))
691
					$ealgosp1 .= "-{$modp}";
692

    
693
				$ealgosp1 .= "!";
694
			}
695

    
696
			if ($ph1ent['dpd_delay'] && $ph1ent['dpd_maxfail']) {
697
				if ($passive == "route")
698
					$dpdline = "dpdaction = restart";
699
				else
700
					$dpdline = "dpdaction = clear";
701
				$dpdline .= "\n\tdpddelay = {$ph1ent['dpd_delay']}s";
702
				$dpdtimeout = $ph1ent['dpd_delay'] * ($ph1ent['dpd_maxfail'] + 1);
703
				$dpdline .= "\n\tdpdtimeout = {$dpdtimeout}s";
704
			} else
705
				$dpdline = "dpdaction = none";
706

    
707
			$ikelifeline = '';
708
			if ($ph1ent['lifetime'])
709
				$ikelifeline = "ikelifetime = {$ph1ent['lifetime']}s";
710

    
711
			$rightsourceip = NULL;
712
			if (isset($ph1ent['mobile']) && !empty($a_client['pool_address'])) 
713
				$rightsourceip = "\trightsourceip = {$a_client['pool_address']}/{$a_client['pool_netbits']}\n";
714

    
715
			$authentication = "";
716
			switch ($ph1ent['authentication_method']) {
717
			case 'eap-mschapv2':
718
				if (isset($ph1ent['mobile'])) {
719
					$authentication = "eap_identity=%any\n\t";
720
					$authentication .= "leftauth=pubkey\n\trightauth=eap-mschapv2";
721
					if (!empty($ph1ent['certref']))
722
						$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
723
				}
724
				break;
725
			case 'eap-tls':
726
				if (isset($ph1ent['mobile'])) {
727
					$authentication = "eap_identity=%identity\n\t";
728
					$authentication .= "leftauth=pubkey\n\trightauth=eap-tls";
729
					if (!empty($ph1ent['certref']))
730
						$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
731
				} else {
732
					$authentication = "leftauth=eap-tls\n\trightauth=eap-tls";
733
					if (!empty($ph1ent['certref']))
734
						$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
735
				}
736
				break;
737
			case 'xauth_rsa_server':
738
				$authentication = "leftauth = pubkey\n\trightauth = pubkey";
739
				$authentication .= "\n\trightauth2 = xauth-generic";
740
				if (!empty($ph1ent['certref']))
741
					$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
742
				break;
743
			case 'xauth_psk_server':
744
				$authentication = "leftauth = psk\n\trightauth = psk";
745
				$authentication .= "\n\trightauth2 = xauth-generic";
746
				break;
747
			case 'pre_shared_key':
748
				$authentication = "leftauth = psk\n\trightauth = psk";
749
				break;
750
			case 'rsasig':
751
				$authentication = "leftauth = pubkey\n\trightauth = pubkey";
752
				if (!empty($ph1ent['certref']))
753
					$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
754
				break;
755
			case 'hybrid_rsa_server':
756
				$authentication = "leftauth = xauth-generic\n\trightauth = pubkey";
757
				$authentication .= "\n\trightauth2 = xauth";
758
				if (!empty($ph1ent['certref']))
759
					$authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
760
				break;
761
			}
762

    
763
			$left_spec = $ep;
764

    
765
			if (isset($ph1ent['reauth_enable']))
766
				$reauth = "reauth = no";
767
			else
768
				$reauth = "reauth = yes";
769
			if (isset($ph1ent['rekey_enable']))
770
				$rekey = "rekey = no";
771
			else
772
				$rekey = "rekey = yes";
773

    
774
			if ($ph1ent['nat_traversal'] == 'off')
775
				$forceencaps = 'forceencaps = no';
776
			else if ($ph1ent['nat_traversal'] == 'force')
777
				$forceencaps = 'forceencaps = yes';
778
			else
779
				$forceencaps = 'forceencaps = no';
780
				
781
			if ($ph1ent['mobike'] == 'on')
782
				$mobike = 'mobike = yes';
783
			else
784
				$mobike = 'mobike = no';
785

    
786
			$ipseclifetime = 0;
787
			$rightsubnet_spec = array();
788
			$leftsubnet_spec = array();
789
			$reqids = array();
790
			$ealgoAHsp2arr = array();
791
			$ealgoESPsp2arr = array();
792
		if (is_array($a_phase2) && count($a_phase2)) {
793
			foreach ($a_phase2 as $ph2ent) {
794
				if ($ikeid != $ph2ent['ikeid'])
795
					continue;
796

    
797
				if (isset($ph2ent['disabled']))
798
					continue;
799

    
800
				if (isset($ph2ent['mobile']) && !isset($a_client['enable']))
801
					continue;
802

    
803
				if (($ph2ent['mode'] == 'tunnel') or ($ph2ent['mode'] == 'tunnel6')) {
804
					$tunneltype = "type = tunnel";
805

    
806
					$localid_type = $ph2ent['localid']['type'];
807
					$leftsubnet_data = ipsec_idinfo_to_cidr($ph2ent['localid'], false, $ph2ent['mode']);
808

    
809
					/* Do not print localid in some cases, such as a pure-psk or psk/xauth single phase2 mobile tunnel */
810
					if (($localid_type == "none" || $localid_type == "mobile")
811
					    && isset($ph1ent['mobile']) && (ipsec_get_number_of_phase2($ikeid)==1)) {
812
						$left_spec = '%any';
813
					} else {
814
						if ($localid_type != "address") {
815
							$localid_type = "subnet";
816
						}
817
						// Don't let an empty subnet into config, it can cause parse errors. Ticket #2201.
818
						if (!is_ipaddr($leftsubnet_data) && !is_subnet($leftsubnet_data) && ($leftsubnet_data != "0.0.0.0/0")) {
819
							log_error("Invalid IPsec Phase 2 \"{$ph2ent['descr']}\" - {$ph2ent['localid']['type']} has no subnet.");
820
							continue;
821
						}
822
						if (!empty($ph2ent['natlocalid'])) {
823
							$natleftsubnet_data =  ipsec_idinfo_to_cidr($ph2ent['natlocalid'], false, $ph2ent['mode']);
824
							if ($ph2ent['natlocalid']['type'] != "address") {
825
								if (is_subnet($natleftsubnet_data))
826
									$leftsubnet_data = "{$natleftsubnet_data}|{$leftsubnet_data}";
827
							} else {
828
								if (is_ipaddr($natleftsubnet_data))
829
									$leftsubnet_data = "{$natleftsubnet_data}|{$leftsubnet_data}";
830
							}
831
							$natfilterrules = true;
832
						}
833
					}
834

    
835
					$leftsubnet_spec[] = $leftsubnet_data;
836

    
837
					if (!isset($ph2ent['mobile'])) {
838
						$tmpsubnet = ipsec_idinfo_to_cidr($ph2ent['remoteid'], false, $ph2ent['mode']);
839
						$rightsubnet_spec[] = $tmpsubnet;
840
					} else if (!empty($a_client['pool_address'])) {
841
						$rightsubnet_spec[] = "{$a_client['pool_address']}/{$a_client['pool_netbits']}";
842
					}
843
				} else {
844
					$tunneltype = "type = transport";
845

    
846
					if ((($ph1ent['authentication_method'] == "xauth_psk_server") ||
847
					    ($ph1ent['authentication_method'] == "pre_shared_key")) && isset($ph1ent['mobile'])) {
848
						$left_spec = "%any";
849
					} else {
850
						$tmpsubnet = ipsec_get_phase1_src($ph1ent);
851
						$leftsubnet_spec[] = $tmpsubnet;
852
					}
853

    
854
					if (!isset($ph2ent['mobile'])) {
855
						$rightsubnet_spec[] = $right_spec;
856
					}
857
				}
858

    
859
				if (isset($a_client['pfs_group']))
860
					$ph2ent['pfsgroup'] = $a_client['pfs_group'];
861

    
862
				if ($ph2ent['protocol'] == 'esp') {
863
					if (is_array($ph2ent['encryption-algorithm-option'])) {
864
						foreach ($ph2ent['encryption-algorithm-option'] as $ealg) {
865
							$ealg_id = $ealg['name'];
866
							$ealg_kl = $ealg['keylen'];
867

    
868
							if (!empty($ealg_kl) && $ealg_kl == "auto") {
869
								if (empty($p2_ealgos) || !is_array($p2_ealgos))
870
									require("ipsec.inc");
871
								$key_hi = $p2_ealgos[$ealg_id]['keysel']['hi'];
872
								$key_lo = $p2_ealgos[$ealg_id]['keysel']['lo'];
873
								$key_step = $p2_ealgos[$ealg_id]['keysel']['step'];
874
								/* XXX: in some cases where include ordering is suspect these variables
875
								 * are somehow 0 and we enter this loop forever and timeout after 900
876
								 * seconds wrecking bootup */
877
								if ($key_hi != 0 and $key_lo !=0 and $key_step !=0) {
878
									for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
879
										if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
880
											foreach ($ph2ent['hash-algorithm-option'] as $halgo) {
881
												$halgo = str_replace('hmac_', '', $halgo);
882
												$tmpealgo = "{$ealg_id}{$keylen}-{$halgo}";
883
												$modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
884
												if (!empty($modp))
885
													$tmpealgo .= "-{$modp}";
886
												$ealgoESPsp2arr[] = $tmpealgo;
887
											}
888
										} else {
889
											$tmpealgo = "{$ealg_id}{$keylen}";
890
											$modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
891
											if (!empty($modp))
892
												$tmpealgo .= "-{$modp}";
893
											$ealgoESPsp2arr[] = $tmpealgo;
894
										}
895
									}
896
								}
897
							} else {
898
								if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
899
									foreach ($ph2ent['hash-algorithm-option'] as $halgo) {
900
										$halgo = str_replace('hmac_', '', $halgo);
901
										$tmpealgo = "{$ealg_id}{$ealg_kl}-{$halgo}";
902
										$modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
903
										if (!empty($modp))
904
											$tmpealgo .= "-{$modp}";
905
										$ealgoESPsp2arr[] = $tmpealgo;
906
									}
907
								} else {
908
									$tmpealgo = "{$ealg_id}{$ealg_kl}";
909
									$modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
910
									if (!empty($modp))
911
										$tmpealgo .= "-{$modp}";
912
									$ealgoESPsp2arr[] = $tmpealgo;
913
								}
914
							}
915
						}
916
					}
917
				} else if ($ph2ent['protocol'] == 'ah') {
918
					if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
919
						$modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
920
						foreach ($ph2ent['hash-algorithm-option'] as $tmpAHalgo) {
921
							$tmpAHalgo = str_replace('hmac_', '', $tmpAHalgo);
922
							if (!empty($modp))
923
								$tmpAHalgo = "-{$modp}";
924
							$ealgoAHsp2arr[] = $tmpAHalgo;
925
						}
926
					}
927
				}
928

    
929
				$reqids[] = $ph2ent['reqid'];
930

    
931
				if (!empty($ph2ent['lifetime'])) {
932
					if ($ipseclifetime == 0 || intval($ipseclifetime) > intval($ph2ent['lifetime']))
933
						$ipseclifetime = intval($ph2ent['lifetime']);
934
				}
935

    
936
			}
937
		}
938

    
939
			$ipsecconnect =<<<EOD
940
	fragmentation = yes
941
	keyexchange = {$keyexchange}
942
	{$reauth}
943
	{$forceencaps}
944
	{$mobike}
945
	{$rekey}
946
	installpolicy = yes
947
	{$tunneltype}
948
	{$dpdline}
949
	auto = {$passive}
950
	left = {$left_spec}
951
	right = {$right_spec}
952
	leftid = {$myid_data}
953

    
954
EOD;
955

    
956
			if (isset($config['ipsec']['compression'])) {
957
				$ipsecconnect .= "\tcompress = yes\n";
958
				$enablecompression = true;
959
			}
960
			if (!empty($ikelifeline))
961
				$ipsecconnect .= "\t{$ikelifeline}\n";
962
			if ($ipseclifetime > 0)
963
				$ipsecconnect .= "\tlifetime = {$ipseclifetime}s\n";
964
			if (!empty($rightsourceip))
965
				$ipsecconnect .= "{$rightsourceip}";
966
			if (!empty($ealgosp1))
967
				$ipsecconnect .= "\t{$ealgosp1}\n";
968
			if (!empty($ealgoAHsp2arr))
969
				$ipsecconnect .= "\tah = " . join(',', $ealgoAHsp2arr) . "!\n";
970
			if (!empty($ealgoESPsp2arr))
971
				$ipsecconnect .= "\tesp = " . join(',', $ealgoESPsp2arr) . "!\n";
972
			if (!empty($authentication))
973
				$ipsecconnect .= "\t{$authentication}\n";
974
			if (!empty($peerid_spec))
975
				$ipsecconnect .= "\trightid = {$peerid_spec}\n";
976
			if ($keyexchange == 'ikev1')
977
				$ipsecconnect .= "\taggressive = {$aggressive}\n";
978

    
979
			if (!isset($ph1ent['mobile']) && $keyexchange == 'ikev1') {
980
				if (!empty($rightsubnet_spec)) {
981
					$ipsecfin = '';
982
					foreach ($rightsubnet_spec as $idx => $rsubnet) {
983
						$ipsecfin .= "\nconn con{$ph1ent['ikeid']}00{$idx}\n";
984
						if (!empty($reqids[$idx]))
985
							$ipsecfin .= "\treqid = " . $reqids[$idx] . "\n";
986
						$ipsecfin .= $ipsecconnect;
987
						$ipsecfin .= "\trightsubnet = {$rsubnet}\n";
988
						$ipsecfin .= "\tleftsubnet = " . $leftsubnet_spec[$idx] . "\n";
989
					}
990
				} else
991
					log_error("No phase2 specifications for tunnel with REQID = {$ikeid}");
992
			} else {
993
				$ipsecfin = "\nconn con{$ph1ent['ikeid']}\n";
994
				if (!empty($reqids[$idx]))
995
					$ipsecfin .= "\treqid = " . $reqids[0] . "\n";
996
				$ipsecfin .= $ipsecconnect;
997
				if (!isset($ph1ent['mobile']) && !empty($rightsubnet_spec)) {
998
					$tempsubnets = array();
999
					foreach ($rightsubnet_spec as $rightsubnet)
1000
						$tempsubnets[$rightsubnet] = $rightsubnet;
1001
					$ipsecfin .= "\trightsubnet = " . join(",", $tempsubnets) . "\n";
1002
					unset($tempsubnets, $rightsubnet);
1003
				}
1004
				if (!empty($leftsubnet_spec)) {
1005
					$tempsubnets = array();
1006
					foreach ($leftsubnet_spec as $leftsubnet)
1007
						$tempsubnets[$leftsubnet] = $leftsubnet;
1008
					$ipsecfin .= "\tleftsubnet = " . join(",", $leftsubnet_spec) . "\n";
1009
					unset($tempsubnets, $leftsubnet);
1010
				}
1011
			}
1012
			$ipsecconf .= $ipsecfin;
1013
			unset($ipsecfin);
1014

    
1015
		}
1016
	}
1017

    
1018
	@file_put_contents("{$g['varetc_path']}/ipsec/ipsec.conf", $ipsecconf);
1019
	unset($ipsecconf);
1020
	/* end ipsec.conf */
1021

    
1022
	if ($enablecompression === true)
1023
		set_single_sysctl('net.inet.ipcomp.ipcomp_enable', 1);
1024
	else
1025
		set_single_sysctl('net.inet.ipcomp.ipcomp_enable', 0);
1026

    
1027
	/* mange process */
1028
	if ($restart === true) {
1029
		mwexec("/usr/local/sbin/ipsec restart", false); 
1030
	} else {
1031
		if (isvalidpid("{$g['varrun_path']}/charon.pid")) {
1032
			/* Read secrets */
1033
			mwexec("/usr/local/sbin/ipsec rereadall", false);
1034
			/* Update configuration changes */
1035
			mwexec("/usr/local/sbin/ipsec update", false);
1036
		} else {
1037
			mwexec("/usr/local/sbin/ipsec start", false); 
1038
		}
1039
	}
1040

    
1041
	if ($natfilterrules == true)
1042
		filter_configure();
1043
	/* start filterdns, if necessary */
1044
	if (count($filterdns_list) > 0) {
1045
		$interval = 60;
1046
		if (!empty($ipseccfg['dns-interval']) && is_numeric($ipseccfg['dns-interval']))
1047
			$interval = $ipseccfg['dns-interval'];
1048

    
1049
		$hostnames = "";
1050
		array_unique($filterdns_list);
1051
		foreach ($filterdns_list as $hostname)
1052
			$hostnames .= "cmd {$hostname} '/usr/local/sbin/pfSctl -c \"service reload ipsecdns\"'\n";
1053
		file_put_contents("{$g['varetc_path']}/ipsec/filterdns-ipsec.hosts", $hostnames);
1054
		unset($hostnames);
1055

    
1056
		if (isvalidpid("{$g['varrun_path']}/filterdns-ipsec.pid"))
1057
			sigkillbypid("{$g['varrun_path']}/filterdns-ipsec.pid", "HUP");
1058
		else {
1059
			mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns-ipsec.pid -i {$interval} -c {$g['varetc_path']}/ipsec/filterdns-ipsec.hosts -d 1");
1060
		}
1061
	} else {
1062
		killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
1063
		@unlink("{$g['varrun_path']}/filterdns-ipsec.pid");
1064
	}
1065

    
1066
	if (platform_booting())
1067
		echo "done\n";
1068

    
1069
	return count($filterdns_list);
1070
}
1071

    
1072
/*
1073
 * Forcefully restart IPsec
1074
 * This is required for when dynamic interfaces reload
1075
 * For all other occasions the normal vpn_ipsec_configure()
1076
 * will gracefully reload the settings without restarting
1077
 */
1078
function vpn_ipsec_force_reload($interface = "") {
1079
	global $g, $config;
1080

    
1081
	$ipseccfg = $config['ipsec'];
1082

    
1083
	if (!empty($interface) && is_array($ipseccfg['phase1'])) {
1084
		$found = false;
1085
		foreach ($ipseccfg['phase1'] as $ipsec) {
1086
			if (!isset($ipsec['disabled']) && ($ipsec['interface'] == $interface)) {
1087
				$found = true;
1088
				break;
1089
			}
1090
		}
1091
		if (!$found) {
1092
			log_error(sprintf(gettext("Ignoring IPsec reload since there are no tunnels on interface %s"), $interface));
1093
			return;
1094
		}
1095
	}
1096

    
1097
	/* if ipsec is enabled, start up again */
1098
	if (isset($ipseccfg['enable'])) {
1099
		log_error(gettext("Forcefully reloading IPsec"));
1100
		vpn_ipsec_configure();
1101
	}
1102
}
1103

    
1104
/* master setup for vpn (mpd) */
1105
function vpn_setup() {
1106
	global $g;
1107

    
1108
	if ($g['platform'] == 'jail')
1109
		return;
1110

    
1111
	/* start pptpd */
1112
	vpn_pptpd_configure();
1113

    
1114
	/* start pppoe server */
1115
	vpn_pppoes_configure();
1116

    
1117
	/* setup l2tp */
1118
	vpn_l2tp_configure();
1119
}
1120

    
1121
function vpn_netgraph_support() {
1122
	$iflist = get_configured_interface_list();
1123
	foreach ($iflist as $iface) {
1124
		$realif = get_real_interface($iface);
1125
		/* Get support for netgraph(4) from the nic */
1126
		$ifinfo = pfSense_get_interface_addresses($realif);
1127
		if (!empty($ifinfo) && in_array($ifinfo['iftype'], array("ether", "vlan", "bridge")))
1128
			pfSense_ngctl_attach(".", $realif);
1129
	}
1130
}
1131

    
1132
function vpn_pptpd_configure() {
1133
	global $config, $g;
1134

    
1135
	$syscfg = $config['system'];
1136
	$pptpdcfg = $config['pptpd'];
1137

    
1138
	if (platform_booting()) {
1139
		if (!$pptpdcfg['mode'] || ($pptpdcfg['mode'] == "off"))
1140
			return 0;
1141

    
1142
		if (platform_booting(true))
1143
			echo gettext("Configuring PPTP VPN service... ");
1144
	} else {
1145
		/* kill mpd */
1146
		killbypid("{$g['varrun_path']}/pptp-vpn.pid");
1147

    
1148
		/* wait for process to die */
1149
		sleep(3);
1150

    
1151
		if (is_process_running("mpd -b")) {
1152
			killbypid("{$g['varrun_path']}/pptp-vpn.pid");
1153
			log_error(gettext("Could not kill mpd within 3 seconds.   Trying again."));
1154
		}
1155

    
1156
		/* remove mpd.conf, if it exists */
1157
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.conf");
1158
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.links");
1159
		unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.secret");
1160
	}
1161

    
1162
	if (empty($pptpdcfg['n_pptp_units'])) {
1163
		log_error("Something wrong in the PPTPd configuration. Preventing starting the daemon because issues would arise.");
1164
		return;
1165
	}
1166

    
1167
	/* make sure pptp-vpn directory exists */
1168
	if (!file_exists("{$g['varetc_path']}/pptp-vpn"))
1169
		mkdir("{$g['varetc_path']}/pptp-vpn");
1170

    
1171
	switch ($pptpdcfg['mode']) {
1172
		case 'server' :
1173
			/* write mpd.conf */
1174
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.conf", "w");
1175
			if (!$fd) {
1176
				printf(gettext("Error: cannot open mpd.conf in vpn_pptpd_configure().") . "\n");
1177
				return 1;
1178
			}
1179

    
1180
			$mpdconf = <<<EOD
1181
pptps:
1182

    
1183
EOD;
1184

    
1185
			for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
1186
				$mpdconf .= "	load pt{$i}\n";
1187
			}
1188

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

    
1191
				$clientip = long2ip32(ip2long($pptpdcfg['remoteip']) + $i);
1192

    
1193
				$mpdconf .= <<<EOD
1194

    
1195
pt{$i}:
1196
	new -i pptpd{$i} pt{$i} pt{$i}
1197
	set ipcp ranges {$pptpdcfg['localip']}/32 {$clientip}/32
1198
	load pts
1199

    
1200
EOD;
1201
			}
1202

    
1203
			$mpdconf .=<<<EOD
1204

    
1205
pts:
1206
	set iface disable on-demand
1207
	set iface enable proxy-arp
1208
	set iface enable tcpmssfix
1209
	set iface idle 1800
1210
	set iface up-script /usr/local/sbin/vpn-linkup
1211
	set iface down-script /usr/local/sbin/vpn-linkdown
1212
	set bundle enable multilink
1213
	set bundle enable crypt-reqd
1214
	set link yes acfcomp protocomp
1215
	set link no pap chap
1216
	set link enable chap-msv2
1217
	set link mtu 1460
1218
	set link keep-alive 10 60
1219
	set ipcp yes vjcomp
1220
	set bundle enable compression
1221
	set ccp yes mppc
1222
	set ccp yes mpp-e128
1223
	set ccp yes mpp-stateless
1224

    
1225
EOD;
1226

    
1227
			if (!isset ($pptpdcfg['req128'])) {
1228
				$mpdconf .=<<<EOD
1229
	set ccp yes mpp-e40
1230
	set ccp yes mpp-e56
1231

    
1232
EOD;
1233
			}
1234

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

    
1238
			if (!empty($pptpdcfg['dns1'])) {
1239
				$mpdconf .= "	set ipcp dns " . $pptpdcfg['dns1'];
1240
				if (!empty($pptpdcfg['dns2']))
1241
					$mpdconf .= " " . $pptpdcfg['dns2'];
1242
				$mpdconf .= "\n";
1243
			} elseif (isset ($config['dnsmasq']['enable'])) {
1244
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1245
				if ($syscfg['dnsserver'][0])
1246
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1247
				$mpdconf .= "\n";
1248
			} elseif (isset($config['unbound']['enable'])) {
1249
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1250
				if ($syscfg['dnsserver'][0])
1251
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1252
				$mpdconf .= "\n";
1253
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1254
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1255
			}
1256

    
1257
			if (isset ($pptpdcfg['radius']['server']['enable'])) {
1258
				$authport = (isset($pptpdcfg['radius']['server']['port']) && strlen($pptpdcfg['radius']['server']['port']) > 1) ? $pptpdcfg['radius']['server']['port'] : 1812;
1259
				$acctport = $authport + 1;
1260
				$mpdconf .=<<<EOD
1261
	set radius server {$pptpdcfg['radius']['server']['ip']} "{$pptpdcfg['radius']['server']['secret']}" {$authport} {$acctport}
1262

    
1263
EOD;
1264
			if (isset ($pptpdcfg['radius']['server2']['enable'])) {
1265
				$authport = (isset($pptpdcfg['radius']['server2']['port']) && strlen($pptpdcfg['radius']['server2']['port']) > 1) ? $pptpdcfg['radius']['server2']['port'] : 1812;
1266
				$acctport = $authport + 1;
1267
				$mpdconf .=<<<EOD
1268
	set radius server {$pptpdcfg['radius']['server2']['ip']} "{$pptpdcfg['radius']['server2']['secret2']}" {$authport} {$acctport}
1269

    
1270
EOD;
1271
			}
1272
			$mpdconf .=<<<EOD
1273
	set radius retries 3
1274
	set radius timeout 10
1275
	set auth enable radius-auth
1276

    
1277
EOD;
1278

    
1279
				if (isset ($pptpdcfg['radius']['accounting'])) {
1280
					$mpdconf .=<<<EOD
1281
	set auth enable radius-acct
1282
	set radius acct-update 300
1283

    
1284
EOD;
1285
				}
1286
			}
1287

    
1288
			fwrite($fd, $mpdconf);
1289
			fclose($fd);
1290
			unset($mpdconf);
1291

    
1292
			/* write mpd.links */
1293
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.links", "w");
1294
			if (!$fd) {
1295
				printf(gettext("Error: cannot open mpd.links in vpn_pptpd_configure().") . "\n");
1296
				return 1;
1297
			}
1298

    
1299
			$mpdlinks = "";
1300

    
1301
			for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
1302
				$mpdlinks .=<<<EOD
1303

    
1304
pt{$i}:
1305
	set link type pptp
1306
	set pptp enable incoming
1307
	set pptp disable originate
1308
	set pptp disable windowing
1309

    
1310
EOD;
1311
			}
1312

    
1313
			fwrite($fd, $mpdlinks);
1314
			fclose($fd);
1315
			unset($mpdlinks);
1316

    
1317
			/* write mpd.secret */
1318
			$fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.secret", "w");
1319
			if (!$fd) {
1320
				printf(gettext("Error: cannot open mpd.secret in vpn_pptpd_configure().") . "\n");
1321
				return 1;
1322
			}
1323

    
1324
			$mpdsecret = "";
1325

    
1326
			if (is_array($pptpdcfg['user'])) {
1327
				foreach ($pptpdcfg['user'] as $user) {
1328
					$pass = str_replace('\\', '\\\\', $user['password']);
1329
					$pass = str_replace('"', '\"', $pass);
1330
					$mpdsecret .= "{$user['name']} \"{$pass}\" {$user['ip']}\n";
1331
				}
1332
			}
1333

    
1334
			fwrite($fd, $mpdsecret);
1335
			fclose($fd);
1336
			unset($mpdsecret);
1337
			chmod("{$g['varetc_path']}/pptp-vpn/mpd.secret", 0600);
1338

    
1339
			vpn_netgraph_support();
1340

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

    
1344
			break;
1345

    
1346
		case 'redir' :
1347
			break;
1348
	}
1349

    
1350
	if (platform_booting())
1351
		echo "done\n";
1352

    
1353
	return 0;
1354
}
1355

    
1356
function vpn_pppoes_configure() {
1357
	global $config;
1358

    
1359
	if (is_array($config['pppoes']['pppoe'])) {
1360
		foreach ($config['pppoes']['pppoe'] as $pppoe)
1361
			vpn_pppoe_configure($pppoe);
1362
	}
1363
}
1364

    
1365
function vpn_pppoe_configure(&$pppoecfg) {
1366
	global $config, $g;
1367

    
1368
	$syscfg = $config['system'];
1369

    
1370
	/* create directory if it does not exist */
1371
	if (!is_dir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn"))
1372
		mkdir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn");
1373

    
1374
	if (platform_booting()) {
1375
		if (!$pppoecfg['mode'] || ($pppoecfg['mode'] == "off"))
1376
			return 0;
1377

    
1378
		echo gettext("Configuring PPPoE Server service... ");
1379
	} else {
1380
		/* kill mpd */
1381
		killbypid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid");
1382

    
1383
		/* wait for process to die */
1384
		sleep(2);
1385

    
1386
	}
1387

    
1388
	switch ($pppoecfg['mode']) {
1389

    
1390
		case 'server' :
1391

    
1392
			$pppoe_interface = get_real_interface($pppoecfg['interface']);
1393

    
1394
			if ($pppoecfg['paporchap'] == "chap")
1395
				$paporchap = "set link enable chap";
1396
			else
1397
				$paporchap = "set link enable pap";
1398

    
1399
			/* write mpd.conf */
1400
			$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.conf", "w");
1401
			if (!$fd) {
1402
				printf(gettext("Error: cannot open mpd.conf in vpn_pppoe_configure().") . "\n");
1403
				return 1;
1404
			}
1405
			$mpdconf = "\n\n";
1406
			$mpdconf .= "poes:\n";
1407

    
1408
			for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
1409
				$mpdconf .= "	load poes{$pppoecfg['pppoeid']}{$i}\n";
1410
			}
1411

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

    
1414
				$clientip = long2ip32(ip2long($pppoecfg['remoteip']) + $i);
1415

    
1416
				if (isset($pppoecfg['radius']['radiusissueips']) && isset($pppoecfg['radius']['server']['enable'])) {
1417
					$isssue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 0.0.0.0/0";
1418
				} else {
1419
					$isssue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 {$clientip}/32";
1420
				}
1421

    
1422
				$mpdconf .=<<<EOD
1423

    
1424
poes{$pppoecfg['pppoeid']}{$i}:
1425
	new -i poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i}
1426
	{$isssue_ip_type}
1427
	load pppoe_standard
1428

    
1429
EOD;
1430
			}
1431

    
1432
			$mpdconf .=<<<EOD
1433

    
1434
pppoe_standard:
1435
	set bundle no multilink
1436
	set bundle enable compression
1437
	set auth max-logins 1
1438
	set iface up-script /usr/local/sbin/vpn-linkup
1439
	set iface down-script /usr/local/sbin/vpn-linkdown
1440
	set iface idle 0
1441
	set iface disable on-demand
1442
	set iface disable proxy-arp
1443
	set iface enable tcpmssfix
1444
	set iface mtu 1500
1445
	set link no pap chap
1446
	{$paporchap}
1447
	set link keep-alive 60 180
1448
	set ipcp yes vjcomp
1449
	set ipcp no vjcomp
1450
	set link max-redial -1
1451
	set link mtu 1492
1452
	set link mru 1492
1453
	set ccp yes mpp-e40
1454
	set ccp yes mpp-e128
1455
	set ccp yes mpp-stateless
1456
	set link latency 1
1457
	#set ipcp dns 10.10.1.3
1458
	#set bundle accept encryption
1459

    
1460
EOD;
1461

    
1462
			if (!empty($pppoecfg['dns1'])) {
1463
				$mpdconf .= "	set ipcp dns " . $pppoecfg['dns1'];
1464
				if (!empty($pppoecfg['dns2']))
1465
					$mpdconf .= " " . $pppoecfg['dns2'];
1466
				$mpdconf .= "\n";
1467
			} elseif (isset ($config['dnsmasq']['enable'])) {
1468
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1469
				if ($syscfg['dnsserver'][0])
1470
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1471
				$mpdconf .= "\n";
1472
			} elseif (isset ($config['unbound']['enable'])) {
1473
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1474
				if ($syscfg['dnsserver'][0])
1475
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1476
				$mpdconf .= "\n";
1477
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1478
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1479
			}
1480

    
1481
			if (isset ($pppoecfg['radius']['server']['enable'])) {
1482
				$radiusport = "";
1483
				$radiusacctport = "";
1484
				if (isset($pppoecfg['radius']['server']['port']))
1485
					$radiusport = $pppoecfg['radius']['server']['port'];
1486
				if (isset($pppoecfg['radius']['server']['acctport']))
1487
					$radiusacctport = $pppoecfg['radius']['server']['acctport'];
1488
				$mpdconf .=<<<EOD
1489
	set radius server {$pppoecfg['radius']['server']['ip']} "{$pppoecfg['radius']['server']['secret']}" {$radiusport} {$radiusacctport}
1490
	set radius retries 3
1491
	set radius timeout 10
1492
	set auth enable radius-auth
1493

    
1494
EOD;
1495

    
1496
				if (isset ($pppoecfg['radius']['accounting'])) {
1497
					$mpdconf .=<<<EOD
1498
	set auth enable radius-acct
1499

    
1500
EOD;
1501
				}
1502
			}
1503

    
1504
			fwrite($fd, $mpdconf);
1505
			fclose($fd);
1506
			unset($mpdconf);
1507

    
1508
			/* write mpd.links */
1509
			$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.links", "w");
1510
			if (!$fd) {
1511
				printf(gettext("Error: cannot open mpd.links in vpn_pppoe_configure().") . "\n");
1512
				return 1;
1513
			}
1514

    
1515
			$mpdlinks = "";
1516

    
1517
			for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
1518
				$mpdlinks .=<<<EOD
1519

    
1520
poes{$pppoecfg['pppoeid']}{$i}:
1521
	set phys type pppoe
1522
	set pppoe iface {$pppoe_interface}
1523
	set pppoe service "*"
1524
	set pppoe disable originate
1525
	set pppoe enable incoming
1526

    
1527
EOD;
1528
			}
1529

    
1530
			fwrite($fd, $mpdlinks);
1531
			fclose($fd);
1532
			unset($mpdlinks);
1533

    
1534
			if ($pppoecfg['username']) {
1535
				/* write mpd.secret */
1536
				$fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", "w");
1537
				if (!$fd) {
1538
					printf(gettext("Error: cannot open mpd.secret in vpn_pppoe_configure().") . "\n");
1539
					return 1;
1540
				}
1541

    
1542
				$mpdsecret = "\n\n";
1543

    
1544
				if (!empty($pppoecfg['username'])) {
1545
					$item = explode(" ", $pppoecfg['username']);
1546
					foreach($item as $userdata) {
1547
						$data = explode(":", $userdata);
1548
						$mpdsecret .= "{$data[0]} \"" . base64_decode($data[1]) . "\" {$data[2]}\n";
1549
					}
1550
				}
1551

    
1552
				fwrite($fd, $mpdsecret);
1553
				fclose($fd);
1554
				unset($mpdsecret);
1555
				chmod("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", 0600);
1556
			}
1557

    
1558
			/* Check if previous instance is still up */
1559
			while (file_exists("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid") && isvalidpid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid"))
1560
				killbypid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid");
1561

    
1562
			/* Get support for netgraph(4) from the nic */
1563
			pfSense_ngctl_attach(".", $pppoe_interface);
1564
			/* fire up mpd */
1565
			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");
1566

    
1567
			break;
1568
	}
1569

    
1570
	if (platform_booting())
1571
		echo gettext("done") . "\n";
1572

    
1573
	return 0;
1574
}
1575

    
1576
function vpn_l2tp_configure() {
1577
	global $config, $g;
1578

    
1579
	$syscfg = $config['system'];
1580
	$l2tpcfg = $config['l2tp'];
1581

    
1582
	/* create directory if it does not exist */
1583
	if (!is_dir("{$g['varetc_path']}/l2tp-vpn"))
1584
		mkdir("{$g['varetc_path']}/l2tp-vpn");
1585

    
1586
	if (platform_booting()) {
1587
		if (!$l2tpcfg['mode'] || ($l2tpcfg['mode'] == "off"))
1588
			return 0;
1589

    
1590
		echo gettext("Configuring l2tp VPN service... ");
1591
	} else {
1592
		/* kill mpd */
1593
		killbypid("{$g['varrun_path']}/l2tp-vpn.pid");
1594

    
1595
		/* wait for process to die */
1596
		sleep(8);
1597

    
1598
	}
1599

    
1600
	/* make sure l2tp-vpn directory exists */
1601
	if (!file_exists("{$g['varetc_path']}/l2tp-vpn"))
1602
		mkdir("{$g['varetc_path']}/l2tp-vpn");
1603

    
1604
	switch ($l2tpcfg['mode']) {
1605

    
1606
		case 'server' :
1607
			if ($l2tpcfg['paporchap'] == "chap")
1608
				$paporchap = "set link enable chap";
1609
			else
1610
				$paporchap = "set link enable pap";
1611

    
1612
			/* write mpd.conf */
1613
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.conf", "w");
1614
			if (!$fd) {
1615
				printf(gettext("Error: cannot open mpd.conf in vpn_l2tp_configure().") . "\n");
1616
				return 1;
1617
			}
1618
			$mpdconf = "\n\n";
1619
			$mpdconf .=<<<EOD
1620
l2tps:
1621

    
1622
EOD;
1623

    
1624
			for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
1625
				$mpdconf .= "	load l2tp{$i}\n";
1626
			}
1627

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

    
1630
				$clientip = long2ip32(ip2long($l2tpcfg['remoteip']) + $i);
1631

    
1632
				if (isset ($l2tpcfg['radius']['radiusissueips']) && isset ($l2tpcfg['radius']['enable'])) {
1633
					$isssue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 0.0.0.0/0";
1634
				} else {
1635
					$isssue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 {$clientip}/32";
1636
				}
1637

    
1638
				$mpdconf .=<<<EOD
1639

    
1640
l2tp{$i}:
1641
	new -i l2tp{$i} l2tp{$i} l2tp{$i}
1642
	{$isssue_ip_type}
1643
	load l2tp_standard
1644

    
1645
EOD;
1646
			}
1647

    
1648
			$mpdconf .=<<<EOD
1649

    
1650
l2tp_standard:
1651
	set bundle disable multilink
1652
	set bundle enable compression
1653
	set bundle yes crypt-reqd
1654
	set ipcp yes vjcomp
1655
	# set ipcp ranges 131.188.69.161/32 131.188.69.170/28
1656
	set ccp yes mppc
1657
	set iface disable on-demand
1658
	set iface enable proxy-arp
1659
	set iface up-script /usr/local/sbin/vpn-linkup
1660
	set iface down-script /usr/local/sbin/vpn-linkdown
1661
	set link yes acfcomp protocomp
1662
	set link no pap chap
1663
	{$paporchap}
1664
	set link keep-alive 10 180
1665

    
1666
EOD;
1667

    
1668
			if (is_ipaddr($l2tpcfg['wins'])) {
1669
				$mpdconf .= "	set ipcp nbns {$l2tpcfg['wins']}\n";
1670
			}
1671
			if (is_ipaddr($l2tpcfg['dns1'])) {
1672
				$mpdconf .= "	set ipcp dns " . $l2tpcfg['dns1'];
1673
				if (is_ipaddr($l2tpcfg['dns2']))
1674
					$mpdconf .= " " . $l2tpcfg['dns2'];
1675
				$mpdconf .= "\n";
1676
			} elseif (isset ($config['dnsmasq']['enable'])) {
1677
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1678
				if ($syscfg['dnsserver'][0])
1679
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1680
				$mpdconf .= "\n";
1681
			} elseif (isset ($config['unbound']['enable'])) {
1682
				$mpdconf .= "	set ipcp dns " . get_interface_ip("lan");
1683
				if ($syscfg['dnsserver'][0])
1684
					$mpdconf .= " " . $syscfg['dnsserver'][0];
1685
				$mpdconf .= "\n";
1686
			} elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
1687
					$mpdconf .= "	set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
1688
			}
1689

    
1690
			if (isset ($l2tpcfg['radius']['enable'])) {
1691
				$mpdconf .=<<<EOD
1692
	set radius server {$l2tpcfg['radius']['server']} "{$l2tpcfg['radius']['secret']}"
1693
	set radius retries 3
1694
	set radius timeout 10
1695
	set auth enable radius-auth
1696

    
1697
EOD;
1698

    
1699
				if (isset ($l2tpcfg['radius']['accounting'])) {
1700
					$mpdconf .=<<<EOD
1701
	set auth enable radius-acct
1702

    
1703
EOD;
1704
				}
1705
			}
1706

    
1707
			fwrite($fd, $mpdconf);
1708
			fclose($fd);
1709
			unset($mpdconf);
1710

    
1711
			/* write mpd.links */
1712
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.links", "w");
1713
			if (!$fd) {
1714
				printf(gettext("Error: cannot open mpd.links in vpn_l2tp_configure().") . "\n");
1715
				return 1;
1716
			}
1717

    
1718
			$mpdlinks = "";
1719

    
1720
			for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
1721
				$mpdlinks .=<<<EOD
1722

    
1723
l2tp{$i}:
1724
	set link type l2tp
1725
	set l2tp enable incoming
1726
	set l2tp disable originate
1727

    
1728
EOD;
1729
			if (!empty($l2tpcfg['secret']))
1730
					$mpdlinks .= "set l2tp secret {$l2tpcfg['secret']}\n";
1731
			}
1732

    
1733
			fwrite($fd, $mpdlinks);
1734
			fclose($fd);
1735
			unset($mpdlinks);
1736

    
1737
			/* write mpd.secret */
1738
			$fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.secret", "w");
1739
			if (!$fd) {
1740
				printf(gettext("Error: cannot open mpd.secret in vpn_l2tp_configure().") . "\n");
1741
				return 1;
1742
			}
1743

    
1744
			$mpdsecret = "\n\n";
1745

    
1746
			if (is_array($l2tpcfg['user'])) {
1747
				foreach ($l2tpcfg['user'] as $user)
1748
					$mpdsecret .= "{$user['name']} \"{$user['password']}\" {$user['ip']}\n";
1749
			}
1750

    
1751
			fwrite($fd, $mpdsecret);
1752
			fclose($fd);
1753
			unset($mpdsecret);
1754
			chmod("{$g['varetc_path']}/l2tp-vpn/mpd.secret", 0600);
1755

    
1756
			vpn_netgraph_support();
1757

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

    
1761
			break;
1762

    
1763
		case 'redir' :
1764
			break;
1765
	}
1766

    
1767
	if (platform_booting())
1768
		echo "done\n";
1769

    
1770
	return 0;
1771
}
1772

    
1773
function vpn_ipsec_configure_preferoldsa() {
1774
	global $config;
1775
	if(isset($config['ipsec']['preferoldsa']))
1776
		set_single_sysctl("net.key.preferred_oldsa", "-30");
1777
	else
1778
		set_single_sysctl("net.key.preferred_oldsa", "0");
1779
}
1780

    
1781
?>
(59-59/68)