Project

General

Profile

Download (19.7 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("pfsense-utils.inc");
65
require_once("system.inc");
66

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
168
		if (empty($pconfig['active_interface'])) {
169
			$input_errors[] = gettext("One or more Network Interfaces must be selected for binding.");
170
		} else if (!isset($config['system']['dnslocalhost']) && (!in_array("lo0", $pconfig['active_interface']) && !in_array("all", $pconfig['active_interface']))) {
171
			$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.");
172
		}
173

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

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

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

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

    
191
		if (($pconfig['system_domain_local_zone_type'] == "redirect") && isset($pconfig['regdhcp'])) {
192
			$input_errors[] = gettext('A System Domain Local Zone Type of "redirect" is not compatible with DHCP Registration.');
193
		}
194

    
195
		$display_custom_options = $pconfig['custom_options'];
196
		$pconfig['custom_options'] = base64_encode(str_replace("\r\n", "\n", $pconfig['custom_options']));
197

    
198
		if (is_array($pconfig['outgoing_interface']) && !empty($pconfig['outgoing_interface'])) {
199
			$display_outgoing_interface = $pconfig['outgoing_interface'];
200
			$pconfig['outgoing_interface'] = implode(",", $pconfig['outgoing_interface']);
201
		}
202

    
203
		$test_output = array();
204
		if (test_unbound_config($pconfig, $test_output)) {
205
			$input_errors[] = gettext("The generated config file cannot be parsed by unbound. Please correct the following errors:");
206
			$input_errors = array_merge($input_errors, $test_output);
207
		}
208

    
209
		if (!$input_errors) {
210
			$a_unboundcfg['enable'] = isset($pconfig['enable']);
211
			$a_unboundcfg['port'] = $pconfig['port'];
212
			$a_unboundcfg['dnssec'] = isset($pconfig['dnssec']);
213
			$a_unboundcfg['forwarding'] = isset($pconfig['forwarding']);
214
			$a_unboundcfg['regdhcp'] = isset($pconfig['regdhcp']);
215
			$a_unboundcfg['regdhcpstatic'] = isset($pconfig['regdhcpstatic']);
216
			$a_unboundcfg['active_interface'] = $pconfig['active_interface'];
217
			$a_unboundcfg['outgoing_interface'] = $pconfig['outgoing_interface'];
218
			$a_unboundcfg['system_domain_local_zone_type'] = $pconfig['system_domain_local_zone_type'];
219
			$a_unboundcfg['custom_options'] = $pconfig['custom_options'];
220

    
221
			write_config(gettext("DNS Resolver configured."));
222
			mark_subsystem_dirty('unbound');
223
		}
224

    
225
		$pconfig['active_interface'] = $display_active_interface;
226
		$pconfig['outgoing_interface'] = $display_outgoing_interface;
227
		$pconfig['custom_options'] = $display_custom_options;
228
	}
229
}
230

    
231
if ($pconfig['custom_options']) {
232
	$customoptions = true;
233
} else {
234
	$customoptions = false;
235
}
236

    
237
if ($_GET['act'] == "del") {
238
	if ($_GET['type'] == 'host') {
239
		if ($a_hosts[$_GET['id']]) {
240
			unset($a_hosts[$_GET['id']]);
241
			write_config();
242
			mark_subsystem_dirty('unbound');
243
			header("Location: services_unbound.php");
244
			exit;
245
		}
246
	} elseif ($_GET['type'] == 'doverride') {
247
		if ($a_domainOverrides[$_GET['id']]) {
248
			unset($a_domainOverrides[$_GET['id']]);
249
			write_config();
250
			mark_subsystem_dirty('unbound');
251
			header("Location: services_unbound.php");
252
			exit;
253
		}
254
	}
255
}
256

    
257
function build_if_list($selectedifs) {
258
	$interface_addresses = get_possible_listen_ips(true);
259
	$iflist = array('options' => array(), 'selected' => array());
260

    
261
	$iflist['options']['all']	= gettext("All");
262
	if (empty($selectedifs) || empty($selectedifs[0]) || in_array("all", $selectedifs)) {
263
		array_push($iflist['selected'], "all");
264
	}
265

    
266
	foreach ($interface_addresses as $laddr => $ldescr) {
267
		$iflist['options'][$laddr] = htmlspecialchars($ldescr);
268

    
269
		if ($selectedifs && in_array($laddr, $selectedifs)) {
270
			array_push($iflist['selected'], $laddr);
271
		}
272
	}
273

    
274
	unset($interface_addresses);
275

    
276
	return($iflist);
277
}
278

    
279
$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("General Settings"));
280
$pglinks = array("", "@self", "@self");
281
$shortcut_section = "resolver";
282

    
283
include_once("head.inc");
284

    
285
if ($input_errors) {
286
	print_input_errors($input_errors);
287
}
288

    
289
if ($savemsg) {
290
	print_info_box($savemsg, 'success');
291
}
292

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

    
297
$tab_array = array();
298
$tab_array[] = array(gettext("General Settings"), true, "services_unbound.php");
299
$tab_array[] = array(gettext("Advanced Settings"), false, "services_unbound_advanced.php");
300
$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
301
display_top_tabs($tab_array, true);
302

    
303
$form = new Form();
304

    
305
$section = new Form_Section('General DNS Resolver Options');
306

    
307
$section->addInput(new Form_Checkbox(
308
	'enable',
309
	'Enable',
310
	'Enable DNS resolver',
311
	$pconfig['enable']
312
));
313

    
314
$section->addInput(new Form_Input(
315
	'port',
316
	'Listen Port',
317
	'number',
318
	$pconfig['port'],
319
	['placeholder' => '53']
320
))->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.');
321

    
322
$activeiflist = build_if_list($pconfig['active_interface']);
323

    
324
$section->addInput(new Form_Select(
325
	'active_interface',
326
	'*Network Interfaces',
327
	$activeiflist['selected'],
328
	$activeiflist['options'],
329
	true
330
))->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. ' .
331
			'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
332

    
333
$outiflist = build_if_list($pconfig['outgoing_interface']);
334

    
335
$section->addInput(new Form_Select(
336
	'outgoing_interface',
337
	'*Outgoing Network Interfaces',
338
	$outiflist['selected'],
339
	$outiflist['options'],
340
	true
341
))->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.');
342

    
343
$section->addInput(new Form_Select(
344
	'system_domain_local_zone_type',
345
	'*System Domain Local Zone Type',
346
	$pconfig['system_domain_local_zone_type'],
347
	unbound_local_zone_types()
348
))->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.');
349

    
350
$section->addInput(new Form_Checkbox(
351
	'dnssec',
352
	'DNSSEC',
353
	'Enable DNSSEC Support',
354
	$pconfig['dnssec']
355
));
356

    
357
$section->addInput(new Form_Checkbox(
358
	'forwarding',
359
	'DNS Query Forwarding',
360
	'Enable Forwarding Mode',
361
	$pconfig['forwarding']
362
))->setHelp(sprintf('If this option is set, DNS queries will be forwarded to the upstream DNS servers defined under'.
363
					' %sSystem &gt; General Setup%s or those obtained via DHCP/PPP on WAN'.
364
					' (if DNS Server Override is enabled there).','<a href="system.php">','</a>'));
365

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

    
375
$section->addInput(new Form_Checkbox(
376
	'regdhcpstatic',
377
	'Static DHCP',
378
	'Register DHCP static mappings in the DNS Resolver',
379
	$pconfig['regdhcpstatic']
380
))->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. '.
381
					'The domain in %sSystem &gt; General Setup%s should also be set to the proper value.','<a href="system.php">','</a>'));
382

    
383
$btnadv = new Form_Button(
384
	'btnadvcustom',
385
	'Custom options',
386
	null,
387
	'fa-cog'
388
);
389

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

    
392
$section->addInput(new Form_StaticText(
393
	'Display Custom Options',
394
	$btnadv
395
));
396

    
397
$section->addInput(new Form_Textarea (
398
	'custom_options',
399
	'Custom options',
400
	$pconfig['custom_options']
401
))->setHelp('Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline.');
402

    
403
$form->add($section);
404
print($form);
405
?>
406

    
407
<script type="text/javascript">
408
//<![CDATA[
409
events.push(function() {
410

    
411
	// Show advanced custom options ==============================================
412
	var showadvcustom = false;
413

    
414
	function show_advcustom(ispageload) {
415
		var text;
416
		// On page load decide the initial state based on the data.
417
		if (ispageload) {
418
			showadvcustom = <?=($customoptions ? 'true' : 'false');?>;
419
		} else {
420
			// It was a click, swap the state.
421
			showadvcustom = !showadvcustom;
422
		}
423

    
424
		hideInput('custom_options', !showadvcustom);
425

    
426
		if (showadvcustom) {
427
			text = "<?=gettext('Hide Custom Options');?>";
428
		} else {
429
			text = "<?=gettext('Display Custom Options');?>";
430
		}
431
		$('#btnadvcustom').html('<i class="fa fa-cog"></i> ' + text);
432
	}
433

    
434
	// If the enable checkbox is not checked, hide all inputs
435
	function hideGeneral() {
436
		var hide = ! $('#enable').prop('checked');
437

    
438
		hideMultiClass('general', hide);
439
		hideInput('port', hide);
440
		hideSelect('system_domain_local_zone_type', hide);
441
		hideCheckbox('dnssec', hide);
442
		hideCheckbox('forwarding', hide);
443
		hideCheckbox('regdhcp', hide);
444
		hideCheckbox('regdhcpstatic', hide);
445
		hideInput('btnadvcustom', hide);
446
		hideInput('custom_options', hide || !showadvcustom);
447
	}
448

    
449
	// Un-hide additional controls
450
	$('#btnadvcustom').click(function(event) {
451
		show_advcustom();
452
	});
453

    
454
	// When 'enable' is clicked, disable/enable the following hide inputs
455
	$('#enable').click(function() {
456
		hideGeneral();
457
	});
458

    
459
	// On initial load
460
	if ($('#custom_options').val().length == 0) {
461
		hideInput('custom_options', true);
462
	}
463

    
464
	hideGeneral();
465
	show_advcustom(true);
466

    
467
});
468
//]]>
469
</script>
470

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

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

    
541
<nav class="action-buttons">
542
	<a href="services_unbound_host_edit.php" class="btn btn-sm btn-success">
543
		<i class="fa fa-plus icon-embed-btn"></i>
544
		<?=gettext('Add')?>
545
	</a>
546
</nav>
547

    
548
<div class="panel panel-default">
549
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Domain Overrides")?></h2></div>
550
	<div class="panel-body table-responsive">
551
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
552
			<thead>
553
				<tr>
554
					<th><?=gettext("Domain")?></th>
555
					<th><?=gettext("IP")?></th>
556
					<th><?=gettext("Description")?></th>
557
					<th><?=gettext("Actions")?></th>
558
				</tr>
559
			</thead>
560

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

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

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

    
608
<?php include("foot.inc");
(145-145/230)