Project

General

Profile

Download (19.9 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-2018 Rubicon Communications, LLC (Netgate)
7
 * Copyright (c) 2014 Warren Baker (warren@pfsense.org)
8
 * All rights reserved.
9
 *
10
 * Licensed under the Apache License, Version 2.0 (the "License");
11
 * you may not use this file except in compliance with the License.
12
 * You may obtain a copy of the License at
13
 *
14
 * http://www.apache.org/licenses/LICENSE-2.0
15
 *
16
 * Unless required by applicable law or agreed to in writing, software
17
 * distributed under the License is distributed on an "AS IS" BASIS,
18
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
 * See the License for the specific language governing permissions and
20
 * limitations under the License.
21
 */
22

    
23
##|+PRIV
24
##|*IDENT=page-services-dnsresolver
25
##|*NAME=Services: DNS Resolver
26
##|*DESCR=Allow access to the 'Services: DNS Resolver' page.
27
##|*MATCH=services_unbound.php*
28
##|-PRIV
29

    
30
require_once("guiconfig.inc");
31
require_once("unbound.inc");
32
require_once("pfsense-utils.inc");
33
require_once("system.inc");
34

    
35
if (!is_array($config['unbound'])) {
36
	$config['unbound'] = array();
37
}
38

    
39
$a_unboundcfg =& $config['unbound'];
40

    
41
if (!is_array($a_unboundcfg['hosts'])) {
42
	$a_unboundcfg['hosts'] = array();
43
}
44

    
45
$a_hosts =& $a_unboundcfg['hosts'];
46

    
47
if (!is_array($a_unboundcfg['domainoverrides'])) {
48
	$a_unboundcfg['domainoverrides'] = array();
49
}
50

    
51
$a_domainOverrides = &$a_unboundcfg['domainoverrides'];
52

    
53
if (isset($a_unboundcfg['enable'])) {
54
	$pconfig['enable'] = true;
55
}
56
if (isset($a_unboundcfg['dnssec'])) {
57
	$pconfig['dnssec'] = true;
58
}
59
if (isset($a_unboundcfg['forwarding'])) {
60
	$pconfig['forwarding'] = true;
61
}
62
if (isset($a_unboundcfg['regdhcp'])) {
63
	$pconfig['regdhcp'] = true;
64
}
65
if (isset($a_unboundcfg['regdhcpstatic'])) {
66
	$pconfig['regdhcpstatic'] = true;
67
}
68
if (isset($a_unboundcfg['regovpnclients'])) {
69
	$pconfig['regovpnclients'] = true;
70
}
71

    
72
$pconfig['port'] = $a_unboundcfg['port'];
73
$pconfig['custom_options'] = base64_decode($a_unboundcfg['custom_options']);
74

    
75
if (empty($a_unboundcfg['active_interface'])) {
76
	$pconfig['active_interface'] = array();
77
} else {
78
	$pconfig['active_interface'] = explode(",", $a_unboundcfg['active_interface']);
79
}
80

    
81
if (empty($a_unboundcfg['outgoing_interface'])) {
82
	$pconfig['outgoing_interface'] = array();
83
} else {
84
	$pconfig['outgoing_interface'] = explode(",", $a_unboundcfg['outgoing_interface']);
85
}
86

    
87
if (empty($a_unboundcfg['system_domain_local_zone_type'])) {
88
	$pconfig['system_domain_local_zone_type'] = "transparent";
89
} else {
90
	$pconfig['system_domain_local_zone_type'] = $a_unboundcfg['system_domain_local_zone_type'];
91
}
92

    
93

    
94
if ($_POST['apply']) {
95
	$retval = 0;
96
	$retval |= services_unbound_configure();
97
	if ($retval == 0) {
98
		clear_subsystem_dirty('unbound');
99
	}
100
	/* Update resolv.conf in case the interface bindings exclude localhost. */
101
	system_resolvconf_generate();
102
	/* Start or restart dhcpleases when it's necessary */
103
	system_dhcpleases_configure();
104
}
105

    
106
if ($_POST['save']) {
107
	$pconfig = $_POST;
108
	unset($input_errors);
109

    
110
	if (isset($pconfig['enable']) && isset($config['dnsmasq']['enable'])) {
111
		if ($pconfig['port'] == $config['dnsmasq']['port']) {
112
			$input_errors[] = gettext("The DNS Forwarder is enabled using this port. Choose a non-conflicting port, or disable the DNS Forwarder.");
113
		}
114
	}
115

    
116
	// forwarding mode requires having valid DNS servers
117
	if (isset($pconfig['forwarding'])) {
118
		$founddns = false;
119
		if (isset($config['system']['dnsallowoverride'])) {
120
			$dns_servers = get_dns_servers();
121
			if (is_array($dns_servers)) {
122
				foreach ($dns_servers as $dns_server) {
123
					if (!ip_in_subnet($dns_server, "127.0.0.0/8")) {
124
						$founddns = true;
125
					}
126
				}
127
			}
128
		}
129
		if (is_array($config['system']['dnsserver'])) {
130
			foreach ($config['system']['dnsserver'] as $dnsserver) {
131
				if (is_ipaddr($dnsserver)) {
132
					$founddns = true;
133
				}
134
			}
135
		}
136
		if ($founddns == false) {
137
			$input_errors[] = gettext("At least one DNS server must be specified under System &gt; General Setup to enable Forwarding mode.");
138
		}
139
	}
140

    
141
	if (empty($pconfig['active_interface'])) {
142
		$input_errors[] = gettext("One or more Network Interfaces must be selected for binding.");
143
	} else if (!isset($config['system']['dnslocalhost']) && (!in_array("lo0", $pconfig['active_interface']) && !in_array("all", $pconfig['active_interface']))) {
144
		$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.");
145
	}
146

    
147
	if (empty($pconfig['outgoing_interface'])) {
148
		$input_errors[] = gettext("One or more Outgoing Network Interfaces must be selected.");
149
	}
150

    
151
	if ($pconfig['port'] && !is_port($pconfig['port'])) {
152
		$input_errors[] = gettext("A valid port number must be specified.");
153
	}
154

    
155
	if (is_array($pconfig['active_interface']) && !empty($pconfig['active_interface'])) {
156
		$display_active_interface = $pconfig['active_interface'];
157
		$pconfig['active_interface'] = implode(",", $pconfig['active_interface']);
158
	}
159

    
160
	if ((isset($pconfig['regdhcp']) || isset($pconfig['regdhcpstatic'])) && !is_dhcp_server_enabled()) {
161
		$input_errors[] = gettext("DHCP Server must be enabled for DHCP Registration to work in DNS Resolver.");
162
	}
163

    
164
	if (($pconfig['system_domain_local_zone_type'] == "redirect") && isset($pconfig['regdhcp'])) {
165
		$input_errors[] = gettext('A System Domain Local Zone Type of "redirect" is not compatible with dynamic DHCP Registration.');
166
	}
167

    
168
	$display_custom_options = $pconfig['custom_options'];
169
	$pconfig['custom_options'] = base64_encode(str_replace("\r\n", "\n", $pconfig['custom_options']));
170

    
171
	if (is_array($pconfig['outgoing_interface']) && !empty($pconfig['outgoing_interface'])) {
172
		$display_outgoing_interface = $pconfig['outgoing_interface'];
173
		$pconfig['outgoing_interface'] = implode(",", $pconfig['outgoing_interface']);
174
	}
175

    
176
	$test_output = array();
177
	if (test_unbound_config($pconfig, $test_output)) {
178
		$input_errors[] = gettext("The generated config file cannot be parsed by unbound. Please correct the following errors:");
179
		$input_errors = array_merge($input_errors, $test_output);
180
	}
181

    
182
	if (!$input_errors) {
183
		$a_unboundcfg['enable'] = isset($pconfig['enable']);
184
		$a_unboundcfg['port'] = $pconfig['port'];
185
		$a_unboundcfg['dnssec'] = isset($pconfig['dnssec']);
186
		$a_unboundcfg['forwarding'] = isset($pconfig['forwarding']);
187
		$a_unboundcfg['regdhcp'] = isset($pconfig['regdhcp']);
188
		$a_unboundcfg['regdhcpstatic'] = isset($pconfig['regdhcpstatic']);
189
		$a_unboundcfg['regovpnclients'] = isset($pconfig['regovpnclients']);
190
		$a_unboundcfg['active_interface'] = $pconfig['active_interface'];
191
		$a_unboundcfg['outgoing_interface'] = $pconfig['outgoing_interface'];
192
		$a_unboundcfg['system_domain_local_zone_type'] = $pconfig['system_domain_local_zone_type'];
193
		$a_unboundcfg['custom_options'] = $pconfig['custom_options'];
194

    
195
		write_config(gettext("DNS Resolver configured."));
196
		mark_subsystem_dirty('unbound');
197
	}
198

    
199
	$pconfig['active_interface'] = $display_active_interface;
200
	$pconfig['outgoing_interface'] = $display_outgoing_interface;
201
	$pconfig['custom_options'] = $display_custom_options;
202
}
203

    
204

    
205
if ($pconfig['custom_options']) {
206
	$customoptions = true;
207
} else {
208
	$customoptions = false;
209
}
210

    
211
if ($_POST['act'] == "del") {
212
	if ($_POST['type'] == 'host') {
213
		if ($a_hosts[$_POST['id']]) {
214
			unset($a_hosts[$_POST['id']]);
215
			write_config(gettext("Host override deleted from DNS Resolver."));
216
			mark_subsystem_dirty('unbound');
217
			header("Location: services_unbound.php");
218
			exit;
219
		}
220
	} elseif ($_POST['type'] == 'doverride') {
221
		if ($a_domainOverrides[$_POST['id']]) {
222
			unset($a_domainOverrides[$_POST['id']]);
223
			write_config(gettext("Domain override deleted from DNS Resolver."));
224
			mark_subsystem_dirty('unbound');
225
			header("Location: services_unbound.php");
226
			exit;
227
		}
228
	}
229
}
230

    
231
function build_if_list($selectedifs) {
232
	$interface_addresses = get_possible_listen_ips(true);
233
	$iflist = array('options' => array(), 'selected' => array());
234

    
235
	$iflist['options']['all']	= gettext("All");
236
	if (empty($selectedifs) || empty($selectedifs[0]) || in_array("all", $selectedifs)) {
237
		array_push($iflist['selected'], "all");
238
	}
239

    
240
	foreach ($interface_addresses as $laddr => $ldescr) {
241
		$iflist['options'][$laddr] = htmlspecialchars($ldescr);
242

    
243
		if ($selectedifs && in_array($laddr, $selectedifs)) {
244
			array_push($iflist['selected'], $laddr);
245
		}
246
	}
247

    
248
	unset($interface_addresses);
249

    
250
	return($iflist);
251
}
252

    
253
$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("General Settings"));
254
$pglinks = array("", "@self", "@self");
255
$shortcut_section = "resolver";
256

    
257
include_once("head.inc");
258

    
259
if ($input_errors) {
260
	print_input_errors($input_errors);
261
}
262

    
263
if ($_POST['apply']) {
264
	print_apply_result_box($retval);
265
}
266

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

    
271
$tab_array = array();
272
$tab_array[] = array(gettext("General Settings"), true, "services_unbound.php");
273
$tab_array[] = array(gettext("Advanced Settings"), false, "services_unbound_advanced.php");
274
$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
275
display_top_tabs($tab_array, true);
276

    
277
$form = new Form();
278

    
279
$section = new Form_Section('General DNS Resolver Options');
280

    
281
$section->addInput(new Form_Checkbox(
282
	'enable',
283
	'Enable',
284
	'Enable DNS resolver',
285
	$pconfig['enable']
286
));
287

    
288
$section->addInput(new Form_Input(
289
	'port',
290
	'Listen Port',
291
	'number',
292
	$pconfig['port'],
293
	['placeholder' => '53']
294
))->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.');
295

    
296
$activeiflist = build_if_list($pconfig['active_interface']);
297

    
298
$section->addInput(new Form_Select(
299
	'active_interface',
300
	'*Network Interfaces',
301
	$activeiflist['selected'],
302
	$activeiflist['options'],
303
	true
304
))->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. ' .
305
			'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
306

    
307
$outiflist = build_if_list($pconfig['outgoing_interface']);
308

    
309
$section->addInput(new Form_Select(
310
	'outgoing_interface',
311
	'*Outgoing Network Interfaces',
312
	$outiflist['selected'],
313
	$outiflist['options'],
314
	true
315
))->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.');
316

    
317
$section->addInput(new Form_Select(
318
	'system_domain_local_zone_type',
319
	'*System Domain Local Zone Type',
320
	$pconfig['system_domain_local_zone_type'],
321
	unbound_local_zone_types()
322
))->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.');
323

    
324
$section->addInput(new Form_Checkbox(
325
	'dnssec',
326
	'DNSSEC',
327
	'Enable DNSSEC Support',
328
	$pconfig['dnssec']
329
));
330

    
331
$section->addInput(new Form_Checkbox(
332
	'forwarding',
333
	'DNS Query Forwarding',
334
	'Enable Forwarding Mode',
335
	$pconfig['forwarding']
336
))->setHelp('If this option is set, DNS queries will be forwarded to the upstream DNS servers defined under'.
337
					' %1$sSystem &gt; General Setup%2$s or those obtained via DHCP/PPP on WAN'.
338
					' (if DNS Server Override is enabled there).','<a href="system.php">','</a>');
339

    
340
$section->addInput(new Form_Checkbox(
341
	'regdhcp',
342
	'DHCP Registration',
343
	'Register DHCP leases in the DNS Resolver',
344
	$pconfig['regdhcp']
345
))->setHelp('If this option is set, then machines that specify their hostname when requesting a DHCP lease will be registered'.
346
					' in the DNS Resolver, so that their name can be resolved.'.
347
					' The domain in %1$sSystem &gt; General Setup%2$s should also be set to the proper value.','<a href="system.php">','</a>');
348

    
349
$section->addInput(new Form_Checkbox(
350
	'regdhcpstatic',
351
	'Static DHCP',
352
	'Register DHCP static mappings in the DNS Resolver',
353
	$pconfig['regdhcpstatic']
354
))->setHelp('If this option is set, then DHCP static mappings will be registered in the DNS Resolver, so that their name can be resolved. '.
355
					'The domain in %1$sSystem &gt; General Setup%2$s should also be set to the proper value.','<a href="system.php">','</a>');
356

    
357
$section->addInput(new Form_Checkbox(
358
	'regovpnclients',
359
	'OpenVPN Clients',
360
	'Register connected OpenVPN clients in the DNS Resolver',
361
	$pconfig['regovpnclients']
362
))->setHelp(sprintf('If this option is set, then the common name (CN) of connected OpenVPN clients will be registered in the DNS Resolver, so that their name can be resolved. This only works for OpenVPN servers (Remote Access SSL/TLS) operating in "tun" mode. '.
363
					'The domain in %sSystem: General Setup%s should also be set to the proper value.','<a href="system.php">','</a>'));
364

    
365
$btnadv = new Form_Button(
366
	'btnadvcustom',
367
	'Custom options',
368
	null,
369
	'fa-cog'
370
);
371

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

    
374
$section->addInput(new Form_StaticText(
375
	'Display Custom Options',
376
	$btnadv
377
));
378

    
379
$section->addInput(new Form_Textarea (
380
	'custom_options',
381
	'Custom options',
382
	$pconfig['custom_options']
383
))->setHelp('Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline.');
384

    
385
$form->add($section);
386
print($form);
387
?>
388

    
389
<script type="text/javascript">
390
//<![CDATA[
391
events.push(function() {
392

    
393
	// Show advanced custom options ==============================================
394
	var showadvcustom = false;
395

    
396
	function show_advcustom(ispageload) {
397
		var text;
398
		// On page load decide the initial state based on the data.
399
		if (ispageload) {
400
			showadvcustom = <?=($customoptions ? 'true' : 'false');?>;
401
		} else {
402
			// It was a click, swap the state.
403
			showadvcustom = !showadvcustom;
404
		}
405

    
406
		hideInput('custom_options', !showadvcustom);
407

    
408
		if (showadvcustom) {
409
			text = "<?=gettext('Hide Custom Options');?>";
410
		} else {
411
			text = "<?=gettext('Display Custom Options');?>";
412
		}
413
		$('#btnadvcustom').html('<i class="fa fa-cog"></i> ' + text);
414
	}
415

    
416
	// If the enable checkbox is not checked, hide all inputs
417
	function hideGeneral() {
418
		var hide = ! $('#enable').prop('checked');
419

    
420
		hideMultiClass('general', hide);
421
		hideInput('port', hide);
422
		hideSelect('system_domain_local_zone_type', hide);
423
		hideCheckbox('dnssec', hide);
424
		hideCheckbox('forwarding', hide);
425
		hideCheckbox('regdhcp', hide);
426
		hideCheckbox('regdhcpstatic', hide);
427
		hideCheckbox('regovpnclients', hide);
428
		hideInput('btnadvcustom', hide);
429
		hideInput('custom_options', hide || !showadvcustom);
430
	}
431

    
432
	// Un-hide additional controls
433
	$('#btnadvcustom').click(function(event) {
434
		show_advcustom();
435
	});
436

    
437
	// When 'enable' is clicked, disable/enable the following hide inputs
438
	$('#enable').click(function() {
439
		hideGeneral();
440
	});
441

    
442
	// On initial load
443
	if ($('#custom_options').val().length == 0) {
444
		hideInput('custom_options', true);
445
	}
446

    
447
	hideGeneral();
448
	show_advcustom(true);
449

    
450
});
451
//]]>
452
</script>
453

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

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

    
524
<span class="help-block">
525
	Enter any individual hosts for which the resolver's standard DNS lookup process should be overridden and a specific
526
	IPv4 or IPv6 address should automatically be returned by the resolver. Standard and also non-standard names and parent domains 
527
	can be entered, such as 'test', 'mycompany.localdomain', '1.168.192.in-addr.arpa', or 'somesite.com'. Any lookup attempt for 
528
	the host will automatically return the given IP address, and the usual lookup server for the domain will not be queried for 
529
	the host's records.
530
</span>
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("Lookup Server IP Address")?></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?>" usepost></a>
570
					</td>
571
				</tr>
572
<?php
573
	$i++;
574
endforeach;
575
?>
576
			</tbody>
577
		</table>
578
	</div>
579
</div>
580

    
581
<span class="help-block">
582
	Enter any domains for which the resolver's standard DNS lookup process should be overridden and a different (non-standard) 
583
	lookup server should be queried instead. Non-standard, 'invalid' and local domains, and subdomains, can also be entered, 
584
	such as 'test', 'mycompany.localdomain', '1.168.192.in-addr.arpa', or 'somesite.com'. The IP address is treated as the 
585
	authoritative lookup server for the domain (including all of its subdomains), and other lookup servers will not be queried.
586
</span>
587

    
588
<nav class="action-buttons">
589
	<a href="services_unbound_domainoverride_edit.php" class="btn btn-sm btn-success">
590
		<i class="fa fa-plus icon-embed-btn"></i>
591
		<?=gettext('Add')?>
592
	</a>
593
</nav>
594

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

    
606
<?php include("foot.inc");
(146-146/232)