Project

General

Profile

Download (19.2 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * services_unbound.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7
 * Copyright (c) 2014 Warren Baker (warren@pfsense.org)
8
 * All rights reserved.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions are met:
12
 *
13
 * 1. Redistributions of source code must retain the above copyright notice,
14
 *    this list of conditions and the following disclaimer.
15
 *
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in
18
 *    the documentation and/or other materials provided with the
19
 *    distribution.
20
 *
21
 * 3. All advertising materials mentioning features or use of this software
22
 *    must display the following acknowledgment:
23
 *    "This product includes software developed by the pfSense Project
24
 *    for use in the pfSense® software distribution. (http://www.pfsense.org/).
25
 *
26
 * 4. The names "pfSense" and "pfSense Project" must not be used to
27
 *    endorse or promote products derived from this software without
28
 *    prior written permission. For written permission, please contact
29
 *    coreteam@pfsense.org.
30
 *
31
 * 5. Products derived from this software may not be called "pfSense"
32
 *    nor may "pfSense" appear in their names without prior written
33
 *    permission of the Electric Sheep Fencing, LLC.
34
 *
35
 * 6. Redistributions of any form whatsoever must retain the following
36
 *    acknowledgment:
37
 *
38
 * "This product includes software developed by the pfSense Project
39
 * for use in the pfSense software distribution (http://www.pfsense.org/).
40
 *
41
 * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
42
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
44
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
45
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
48
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
50
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
51
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
52
 * OF THE POSSIBILITY OF SUCH DAMAGE.
53
 */
54

    
55
##|+PRIV
56
##|*IDENT=page-services-dnsresolver
57
##|*NAME=Services: DNS Resolver
58
##|*DESCR=Allow access to the 'Services: DNS Resolver' page.
59
##|*MATCH=services_unbound.php*
60
##|-PRIV
61

    
62
require_once("guiconfig.inc");
63
require_once("unbound.inc");
64
require_once("system.inc");
65

    
66
if (!is_array($config['unbound'])) {
67
	$config['unbound'] = array();
68
}
69

    
70
$a_unboundcfg =& $config['unbound'];
71

    
72
if (!is_array($a_unboundcfg['hosts'])) {
73
	$a_unboundcfg['hosts'] = array();
74
}
75

    
76
$a_hosts =& $a_unboundcfg['hosts'];
77

    
78
if (!is_array($a_unboundcfg['domainoverrides'])) {
79
	$a_unboundcfg['domainoverrides'] = array();
80
}
81

    
82
$a_domainOverrides = &$a_unboundcfg['domainoverrides'];
83

    
84
if (isset($a_unboundcfg['enable'])) {
85
	$pconfig['enable'] = true;
86
}
87
if (isset($a_unboundcfg['dnssec'])) {
88
	$pconfig['dnssec'] = true;
89
}
90
if (isset($a_unboundcfg['forwarding'])) {
91
	$pconfig['forwarding'] = true;
92
}
93
if (isset($a_unboundcfg['regdhcp'])) {
94
	$pconfig['regdhcp'] = true;
95
}
96
if (isset($a_unboundcfg['regdhcpstatic'])) {
97
	$pconfig['regdhcpstatic'] = true;
98
}
99

    
100
$pconfig['port'] = $a_unboundcfg['port'];
101
$pconfig['custom_options'] = base64_decode($a_unboundcfg['custom_options']);
102

    
103
if (empty($a_unboundcfg['active_interface'])) {
104
	$pconfig['active_interface'] = array();
105
} else {
106
	$pconfig['active_interface'] = explode(",", $a_unboundcfg['active_interface']);
107
}
108

    
109
if (empty($a_unboundcfg['outgoing_interface'])) {
110
	$pconfig['outgoing_interface'] = array();
111
} else {
112
	$pconfig['outgoing_interface'] = explode(",", $a_unboundcfg['outgoing_interface']);
113
}
114

    
115
if (empty($a_unboundcfg['system_domain_local_zone_type'])) {
116
	$pconfig['system_domain_local_zone_type'] = "transparent";
117
} else {
118
	$pconfig['system_domain_local_zone_type'] = $a_unboundcfg['system_domain_local_zone_type'];
119
}
120

    
121
if ($_POST) {
122
	if ($_POST['apply']) {
123
		$retval = services_unbound_configure();
124
		$savemsg = get_std_save_message($retval);
125
		if ($retval == 0) {
126
			clear_subsystem_dirty('unbound');
127
		}
128
		/* Update resolv.conf in case the interface bindings exclude localhost. */
129
		system_resolvconf_generate();
130
		/* Start or restart dhcpleases when it's necessary */
131
		system_dhcpleases_configure();
132
	} else {
133
		$pconfig = $_POST;
134
		unset($input_errors);
135

    
136
		if (isset($pconfig['enable']) && isset($config['dnsmasq']['enable'])) {
137
			if ($pconfig['port'] == $config['dnsmasq']['port']) {
138
				$input_errors[] = gettext("The DNS Forwarder is enabled using this port. Choose a non-conflicting port, or disable the DNS Forwarder.");
139
			}
140
		}
141

    
142
		// forwarding mode requires having valid DNS servers
143
		if (isset($pconfig['forwarding'])) {
144
			$founddns = false;
145
			if (isset($config['system']['dnsallowoverride'])) {
146
				$dns_servers = get_dns_servers();
147
				if (is_array($dns_servers)) {
148
					foreach ($dns_servers as $dns_server) {
149
						if (!ip_in_subnet($dns_server, "127.0.0.0/8")) {
150
							$founddns = true;
151
						}
152
					}
153
				}
154
			}
155
			if (is_array($config['system']['dnsserver'])) {
156
				foreach ($config['system']['dnsserver'] as $dnsserver) {
157
					if (is_ipaddr($dnsserver)) {
158
						$founddns = true;
159
					}
160
				}
161
			}
162
			if ($founddns == false) {
163
				$input_errors[] = gettext("At least one DNS server must be specified under System &gt; General Setup to enable Forwarding mode.");
164
			}
165
		}
166

    
167
		if (empty($pconfig['active_interface'])) {
168
			$input_errors[] = gettext("One or more Network Interfaces must be selected for binding.");
169
		} else if (!isset($config['system']['dnslocalhost']) && (!in_array("lo0", $pconfig['active_interface']) && !in_array("all", $pconfig['active_interface']))) {
170
			$input_errors[] = gettext("This system is configured to use the DNS Resolver as its DNS server, so Localhost or All must be selected in Network Interfaces.");
171
		}
172

    
173
		if (empty($pconfig['outgoing_interface'])) {
174
			$input_errors[] = gettext("One or more Outgoing Network Interfaces must be selected.");
175
		}
176

    
177
		if ($pconfig['port'] && !is_port($pconfig['port'])) {
178
			$input_errors[] = gettext("A valid port number must be specified.");
179
		}
180

    
181
		if (is_array($pconfig['active_interface']) && !empty($pconfig['active_interface'])) {
182
			$display_active_interface = $pconfig['active_interface'];
183
			$pconfig['active_interface'] = implode(",", $pconfig['active_interface']);
184
		}
185

    
186
		$display_custom_options = $pconfig['custom_options'];
187
		$pconfig['custom_options'] = base64_encode(str_replace("\r\n", "\n", $pconfig['custom_options']));
188

    
189
		if (is_array($pconfig['outgoing_interface']) && !empty($pconfig['outgoing_interface'])) {
190
			$display_outgoing_interface = $pconfig['outgoing_interface'];
191
			$pconfig['outgoing_interface'] = implode(",", $pconfig['outgoing_interface']);
192
		}
193

    
194
		$test_output = array();
195
		if (test_unbound_config($pconfig, $test_output)) {
196
			$input_errors[] = gettext("The generated config file cannot be parsed by unbound. Please correct the following errors:");
197
			$input_errors = array_merge($input_errors, $test_output);
198
		}
199

    
200
		if (!$input_errors) {
201
			$a_unboundcfg['enable'] = isset($pconfig['enable']);
202
			$a_unboundcfg['port'] = $pconfig['port'];
203
			$a_unboundcfg['dnssec'] = isset($pconfig['dnssec']);
204
			$a_unboundcfg['forwarding'] = isset($pconfig['forwarding']);
205
			$a_unboundcfg['regdhcp'] = isset($pconfig['regdhcp']);
206
			$a_unboundcfg['regdhcpstatic'] = isset($pconfig['regdhcpstatic']);
207
			$a_unboundcfg['active_interface'] = $pconfig['active_interface'];
208
			$a_unboundcfg['outgoing_interface'] = $pconfig['outgoing_interface'];
209
			$a_unboundcfg['system_domain_local_zone_type'] = $pconfig['system_domain_local_zone_type'];
210
			$a_unboundcfg['custom_options'] = $pconfig['custom_options'];
211

    
212
			write_config(gettext("DNS Resolver configured."));
213
			mark_subsystem_dirty('unbound');
214
		}
215

    
216
		$pconfig['active_interface'] = $display_active_interface;
217
		$pconfig['outgoing_interface'] = $display_outgoing_interface;
218
		$pconfig['custom_options'] = $display_custom_options;
219
	}
220
}
221

    
222
if ($pconfig['custom_options']) {
223
	$customoptions = true;
224
} else {
225
	$customoptions = false;
226
}
227

    
228
if ($_GET['act'] == "del") {
229
	if ($_GET['type'] == 'host') {
230
		if ($a_hosts[$_GET['id']]) {
231
			unset($a_hosts[$_GET['id']]);
232
			write_config();
233
			mark_subsystem_dirty('unbound');
234
			header("Location: services_unbound.php");
235
			exit;
236
		}
237
	} elseif ($_GET['type'] == 'doverride') {
238
		if ($a_domainOverrides[$_GET['id']]) {
239
			unset($a_domainOverrides[$_GET['id']]);
240
			write_config();
241
			mark_subsystem_dirty('unbound');
242
			header("Location: services_unbound.php");
243
			exit;
244
		}
245
	}
246
}
247

    
248
function build_if_list($selectedifs) {
249
	$interface_addresses = get_possible_listen_ips(true);
250
	$iflist = array('options' => array(), 'selected' => array());
251

    
252
	$iflist['options']['all']	= gettext("All");
253
	if (empty($selectedifs) || empty($selectedifs[0]) || in_array("all", $selectedifs)) {
254
		array_push($iflist['selected'], "all");
255
	}
256

    
257
	foreach ($interface_addresses as $laddr => $ldescr) {
258
		$iflist['options'][$laddr] = htmlspecialchars($ldescr);
259

    
260
		if ($selectedifs && in_array($laddr, $selectedifs)) {
261
			array_push($iflist['selected'], $laddr);
262
		}
263
	}
264

    
265
	unset($interface_addresses);
266

    
267
	return($iflist);
268
}
269

    
270
$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("General Settings"));
271
$pglinks = array("", "@self", "@self");
272
$shortcut_section = "resolver";
273

    
274
include_once("head.inc");
275

    
276
if ($input_errors) {
277
	print_input_errors($input_errors);
278
}
279

    
280
if ($savemsg) {
281
	print_info_box($savemsg, 'success');
282
}
283

    
284
if (is_subsystem_dirty('unbound')) {
285
	print_apply_box(gettext("The DNS resolver configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
286
}
287

    
288
$tab_array = array();
289
$tab_array[] = array(gettext("General Settings"), true, "services_unbound.php");
290
$tab_array[] = array(gettext("Advanced Settings"), false, "services_unbound_advanced.php");
291
$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
292
display_top_tabs($tab_array, true);
293

    
294
$form = new Form();
295

    
296
$section = new Form_Section('General DNS Resolver Options');
297

    
298
$section->addInput(new Form_Checkbox(
299
	'enable',
300
	'Enable',
301
	'Enable DNS resolver',
302
	$pconfig['enable']
303
));
304

    
305
$section->addInput(new Form_Input(
306
	'port',
307
	'Listen Port',
308
	'number',
309
	$pconfig['port'],
310
	['placeholder' => '53']
311
))->setHelp('The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.');
312

    
313
$activeiflist = build_if_list($pconfig['active_interface']);
314

    
315
$section->addInput(new Form_Select(
316
	'active_interface',
317
	'*Network Interfaces',
318
	$activeiflist['selected'],
319
	$activeiflist['options'],
320
	true
321
))->addClass('general', 'resizable')->setHelp('Interface IPs used by the DNS Resolver for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. ' .
322
			'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
323

    
324
$outiflist = build_if_list($pconfig['outgoing_interface']);
325

    
326
$section->addInput(new Form_Select(
327
	'outgoing_interface',
328
	'*Outgoing Network Interfaces',
329
	$outiflist['selected'],
330
	$outiflist['options'],
331
	true
332
))->addClass('general', 'resizable')->setHelp('Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used.');
333

    
334
$section->addInput(new Form_Select(
335
	'system_domain_local_zone_type',
336
	'*System Domain Local Zone Type',
337
	$pconfig['system_domain_local_zone_type'],
338
	unbound_local_zone_types()
339
))->setHelp('The local-zone type used for the pfSense system domain (System | General Setup | Domain).  Transparent is the default.  Local-Zone type descriptions are available in the unbound.conf(5) manual pages.');
340

    
341
$section->addInput(new Form_Checkbox(
342
	'dnssec',
343
	'DNSSEC',
344
	'Enable DNSSEC Support',
345
	$pconfig['dnssec']
346
));
347

    
348
$section->addInput(new Form_Checkbox(
349
	'forwarding',
350
	'DNS Query Forwarding',
351
	'Enable Forwarding Mode',
352
	$pconfig['forwarding']
353
))->setHelp(sprintf('If this option is set, DNS queries will be forwarded to the upstream DNS servers defined under'.
354
					' %sSystem &gt; General Setup%s or those obtained via DHCP/PPP on WAN'.
355
					' (if DNS Server Override is enabled there).','<a href="system.php">','</a>'));
356

    
357
$section->addInput(new Form_Checkbox(
358
	'regdhcp',
359
	'DHCP Registration',
360
	'Register DHCP leases in the DNS Resolver',
361
	$pconfig['regdhcp']
362
))->setHelp(sprintf('If this option is set, then machines that specify their hostname when requesting a DHCP lease will be registered'.
363
					' in the DNS Resolver, so that their name can be resolved.'.
364
					' The domain in %sSystem &gt; General Setup%s should also be set to the proper value.','<a href="system.php">','</a>'));
365

    
366
$section->addInput(new Form_Checkbox(
367
	'regdhcpstatic',
368
	'Static DHCP',
369
	'Register DHCP static mappings in the DNS Resolver',
370
	$pconfig['regdhcpstatic']
371
))->setHelp(sprintf('If this option is set, then DHCP static mappings will be registered in the DNS Resolver, so that their name can be resolved. '.
372
					'The domain in %sSystem &gt; General Setup%s should also be set to the proper value.','<a href="system.php">','</a>'));
373

    
374
$btnadv = new Form_Button(
375
	'btnadvcustom',
376
	'Custom options',
377
	null,
378
	'fa-cog'
379
);
380

    
381
$btnadv->setAttribute('type','button')->addClass('btn-info btn-sm');
382

    
383
$section->addInput(new Form_StaticText(
384
	'Display Custom Options',
385
	$btnadv
386
));
387

    
388
$section->addInput(new Form_Textarea (
389
	'custom_options',
390
	'Custom options',
391
	$pconfig['custom_options']
392
))->setHelp('Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline.');
393

    
394
$form->add($section);
395
print($form);
396
?>
397

    
398
<script type="text/javascript">
399
//<![CDATA[
400
events.push(function() {
401

    
402
	// Show advanced custom options ==============================================
403
	var showadvcustom = false;
404

    
405
	function show_advcustom(ispageload) {
406
		var text;
407
		// On page load decide the initial state based on the data.
408
		if (ispageload) {
409
			showadvcustom = <?=($customoptions ? 'true' : 'false');?>;
410
		} else {
411
			// It was a click, swap the state.
412
			showadvcustom = !showadvcustom;
413
		}
414

    
415
		hideInput('custom_options', !showadvcustom);
416

    
417
		if (showadvcustom) {
418
			text = "<?=gettext('Hide Custom Options');?>";
419
		} else {
420
			text = "<?=gettext('Display Custom Options');?>";
421
		}
422
		$('#btnadvcustom').html('<i class="fa fa-cog"></i> ' + text);
423
	}
424

    
425
	// If the enable checkbox is not checked, hide all inputs
426
	function hideGeneral() {
427
		var hide = ! $('#enable').prop('checked');
428

    
429
		hideMultiClass('general', hide);
430
		hideInput('port', hide);
431
		hideSelect('system_domain_local_zone_type', hide);
432
		hideCheckbox('dnssec', hide);
433
		hideCheckbox('forwarding', hide);
434
		hideCheckbox('regdhcp', hide);
435
		hideCheckbox('regdhcpstatic', hide);
436
		hideInput('btnadvcustom', hide);
437
		hideInput('custom_options', hide || !showadvcustom);
438
	}
439

    
440
	// Un-hide additional controls
441
	$('#btnadvcustom').click(function(event) {
442
		show_advcustom();
443
	});
444

    
445
	// When 'enable' is clicked, disable/enable the following hide inputs
446
	$('#enable').click(function() {
447
		hideGeneral();
448
	});
449

    
450
	// On initial load
451
	if ($('#custom_options').val().length == 0) {
452
		hideInput('custom_options', true);
453
	}
454

    
455
	hideGeneral();
456
	show_advcustom(true);
457

    
458
});
459
//]]>
460
</script>
461

    
462
<div class="panel panel-default">
463
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Host Overrides")?></h2></div>
464
	<div class="panel-body table-responsive">
465
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
466
			<thead>
467
				<tr>
468
					<th><?=gettext("Host")?></th>
469
					<th><?=gettext("Domain")?></th>
470
					<th><?=gettext("IP")?></th>
471
					<th><?=gettext("Description")?></th>
472
					<th><?=gettext("Actions")?></th>
473
				</tr>
474
			</thead>
475
			<tbody>
476
<?php
477
$i = 0;
478
foreach ($a_hosts as $hostent):
479
?>
480
				<tr>
481
					<td>
482
						<?=$hostent['host']?>
483
					</td>
484
					<td>
485
						<?=$hostent['domain']?>
486
					</td>
487
					<td>
488
						<?=$hostent['ip']?>
489
					</td>
490
					<td>
491
						<?=htmlspecialchars($hostent['descr'])?>
492
					</td>
493
					<td>
494
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" href="services_unbound_host_edit.php?id=<?=$i?>"></a>
495
						<a class="fa fa-trash"	title="<?=gettext('Delete host override')?>" href="services_unbound.php?type=host&amp;act=del&amp;id=<?=$i?>"></a>
496
					</td>
497
				</tr>
498

    
499
<?php
500
	if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
501
		foreach ($hostent['aliases']['item'] as $alias):
502
?>
503
				<tr>
504
					<td>
505
						<?=$alias['host']?>
506
					</td>
507
					<td>
508
						<?=$alias['domain']?>
509
					</td>
510
					<td>
511
						<?=gettext("Alias for ");?><?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain']?>
512
					</td>
513
					<td>
514
						<i class="fa fa-angle-double-right text-info"></i>
515
						<?=htmlspecialchars($alias['description'])?>
516
					</td>
517
					<td>
518
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" 	href="services_unbound_host_edit.php?id=<?=$i?>"></a>
519
					</td>
520
				</tr>
521
<?php
522
		endforeach;
523
	endif;
524
	$i++;
525
endforeach;
526
?>
527
			</tbody>
528
		</table>
529
	</div>
530
</div>
531

    
532
<nav class="action-buttons">
533
	<a href="services_unbound_host_edit.php" class="btn btn-sm btn-success">
534
		<i class="fa fa-plus icon-embed-btn"></i>
535
		<?=gettext('Add')?>
536
	</a>
537
</nav>
538

    
539
<div class="panel panel-default">
540
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Domain Overrides")?></h2></div>
541
	<div class="panel-body table-responsive">
542
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
543
			<thead>
544
				<tr>
545
					<th><?=gettext("Domain")?></th>
546
					<th><?=gettext("IP")?></th>
547
					<th><?=gettext("Description")?></th>
548
					<th><?=gettext("Actions")?></th>
549
				</tr>
550
			</thead>
551

    
552
			<tbody>
553
<?php
554
$i = 0;
555
foreach ($a_domainOverrides as $doment):
556
?>
557
				<tr>
558
					<td>
559
						<?=$doment['domain']?>&nbsp;
560
					</td>
561
					<td>
562
						<?=$doment['ip']?>&nbsp;
563
					</td>
564
					<td>
565
						<?=htmlspecialchars($doment['descr'])?>&nbsp;
566
					</td>
567
					<td>
568
						<a class="fa fa-pencil"	title="<?=gettext('Edit domain override')?>" href="services_unbound_domainoverride_edit.php?id=<?=$i?>"></a>
569
						<a class="fa fa-trash"	title="<?=gettext('Delete domain override')?>" href="services_unbound.php?act=del&amp;type=doverride&amp;id=<?=$i?>"></a>
570
					</td>
571
				</tr>
572
<?php
573
	$i++;
574
endforeach;
575
?>
576
			</tbody>
577
		</table>
578
	</div>
579
</div>
580

    
581
<nav class="action-buttons">
582
	<a href="services_unbound_domainoverride_edit.php" class="btn btn-sm btn-success">
583
		<i class="fa fa-plus icon-embed-btn"></i>
584
		<?=gettext('Add')?>
585
	</a>
586
</nav>
587

    
588
<div class="infoblock">
589
	<?php print_info_box(sprintf(gettext("If the DNS Resolver is enabled, the DHCP".
590
		" service (if enabled) will automatically serve the LAN IP".
591
		" address as a DNS server to DHCP clients so they will use".
592
		" the DNS Resolver. If Forwarding is enabled, the DNS Resolver will use the DNS servers".
593
		" entered in %sSystem &gt; General Setup%s".
594
		" or those obtained via DHCP or PPP on WAN if &quot;Allow".
595
		" DNS server list to be overridden by DHCP/PPP on WAN&quot;".
596
		" is checked."), '<a href="system.php">', '</a>'), 'info', false); ?>
597
</div>
598

    
599
<?php include("foot.inc");
(140-140/225)